Macro Global ... As string/Integer

Résolu/Fermé
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 - 22 avril 2013 à 15:07
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 23 avril 2013 à 16:15
Bonjour,

J'ai crée une macro qui permet de mettre à jour une feuille Excel à partir d'un onglet de référence. Je voudrai que dans une cellule soit répertoriée le code fournisseur/une donnée X. Cette donnée X pourra me servir dans d'autre module de la macro. J'ai trouvé qu'en utilisant Global avant Sub, la donnée sauvegardée était utilisable dans toutes les macros (s'il n'y a pas d'interruption du code). Voici mon code, dites-moi ce qui cloche car la formule dans laquelle on devrait retrouver la donnée X s'affiche en erreur.

Merci d'avance de votre aide.

Global PériodeRI As String, NomFichierRI As String

Sub a2_mise_en_forme()

'Définition des variables
PériodeRI = InputBox("Quelle est la période du RI concernée (au format <<du mois de MM AAAA>>) ?", "Période de RI concercée")
NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")

Sheets("Transaction_Register").Select

Range("a2").Select
Selection.End(xlDown).Select
lastli = ActiveCell.Row

Range("H1").Select
ActiveCell.FormulaR1C1 = "Franchisés1"
Range("i1").Select
ActiveCell.FormulaR1C1 = "Franchisés2"
Range("j1").Select
ActiveCell.FormulaR1C1 = "Franchisés"
Range("k1").Select
ActiveCell.FormulaR1C1 = "Org Id"
Range("l1").Select
ActiveCell.FormulaR1C1 = "Business Account"
Range("m1").Select
ActiveCell.FormulaR1C1 = "CodeNum"

Range("m2").Select
ActiveCell.FormulaR1C1 = _
"=rIGHT(LEFT(C[-12],5),3)"

Range("m2").Select
Selection.Copy
Range("m3:m" & lastli).Select
ActiveSheet.Paste
Calculate
Range("M2:M" & lastli).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Columns("M:M").Select
Selection.TextToColumns Destination:=Range("M1"), DataType:=xlDelimited, _
TextQualifier:=xlNone, ConsecutiveDelimiter:=False, Tab:=True, Semicolon _
:=False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, _
1), TrailingMinusNumbers:=True

Range("I2").Select
ActiveCell.FormulaR1C1 = _
"=IF(RIGHT(C[-8],2)=""CM"","""",VLOOKUP(C[4],CodesNum!C[-8]:C[-3],6,0))"

Range("J2").Select
ActiveCell.FormulaR1C1 = "=IF(C[-2]="""",C[-1],C[-2])"
Range("K2").Select
ActiveCell.FormulaR1C1 = _
"=IF(ISERROR(VLOOKUP(C[-2],'CodesNum'!C[-5]:C[-2],3,0)),VLOOKUP(C[-3],'CodesNum'!C[-5]:C[-1],3,0),VLOOKUP(C[-2],'CodesNum'!C[-5]:C[-2],3,0))"
Range("L2").Select
ActiveCell.FormulaR1C1 = _
"=IF(ISERROR(VLOOKUP(C[-3],'CodesNum'!C[-6]:C[-3],3,0)),VLOOKUP(C[-4],'CodesNum'!C[-6]:C[-2],4,0),VLOOKUP(C[-3],'CodesNum'!C[-6]:C[-3],4,0))"

Range("I2:l2").Select
Selection.Copy
Range("i3:i" & lastli).Select
ActiveSheet.Paste
Calculate

Columns("E:F").Select
Selection.NumberFormat = "dd/mm/yy;@"

Columns("A:A").Select
Selection.NumberFormat = "0"
Columns("E:F").Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With

Columns("G:G").Select
Selection.NumberFormat = "#,##0.00"

Columns("E:F").Select
Selection.NumberFormat = "dd/mm/yy;@"

Range("n2").Select
ActiveCell.FormulaR1C1 = "=ABS(C[-7])"
Selection.Copy
Range("n2:n" & lastli).Select
ActiveSheet.Paste
Calculate

Range("a2:n" & lastli).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Range("a1:n" & lastli).Select
Selection.Sort Key1:=Range("j2"), Order1:=xlAscending, Key2:=Range("n2") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom

'C'est ici que je veux que ça fonctionne mais ce n'est pas le cas...
La cellule affiche

Range("O2").Select
ActiveCell.FormulaR1C1 = "=NomFichierRI"

Sheets("Procédure").Select
ActiveWorkbook.Save

End Sub





A voir également:

5 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
22 avril 2013 à 15:37
Bonjour,

Bon. Alors. On commence par la déclaration de ta variable. Remplace Global par Public, juste pour voir. Par contre, les variables Public sont à déclarer en tête de module.
Option Explicit
Public Var1 As String, Var2 As Integer

Sub 1()
Dim Var3 As Byte
...
End Sub
Sub 2()
...
End Sub
etc... 


Mais bon, je ne penses pas qu'il s'agisse de cela. En effet, tu déclares une variable en public si tu en as besoin dans d'autres procédures, d'autres modules. Là ce n'est pas le cas car tu l'utilises (apparemment mais je peux me tromper) dans la même Sub.
Sub a2_mise_en_forme() 

'Définition des variables 
PériodeRI = InputBox("Quelle est la période du RI concernée (au format <<du mois de MM AAAA>>) ?", "Période de RI concercée")
 NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")
 
'.............bla bla bla ton code ici

'C'est ici que je veux que ça fonctionne mais ce n'est pas le cas... 
La cellule affiche 

Range("O2").Select 
ActiveCell.FormulaR1C1 = "=NomFichierRI" 

End Sub

Donc, il te suffit de :
déclarer tes variables en dessous de "Sub a2_mise_en_forme()" et virer les guillemets pour pouvoir les utiliser :
Sub a2_mise_en_forme() 
'Déclaration des variables
Dim PériodeRI As String, NomFichierRI As String
'Définition des variables 
PériodeRI = InputBox("Quelle est la période du RI concernée (au format <<du mois de MM AAAA>>) ?", "Période de RI concercée")
 NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")
 
'.............bla bla bla ton code ici

'C'est ici que je veux que ça fonctionne mais ce n'est pas le cas... 
La cellule affiche 

Range("O2").Value = NomFichierRI

'.............bla bla bla ton code ici
End Sub


Ensuite, évite tous tes Select. Le fait de sélectionner une feuille, cellule, ralentit l'exécution de ton code et ne sert à rien.
Donc remplace, par exemple :
Range("H1").Select 
ActiveCell.FormulaR1C1 = "Franchisés1" 
Range("i1").Select 
ActiveCell.FormulaR1C1 = "Franchisés2" 
Range("j1").Select 
ActiveCell.FormulaR1C1 = "Franchisés" 
Range("k1").Select 
ActiveCell.FormulaR1C1 = "Org Id" 
Range("l1").Select 
ActiveCell.FormulaR1C1 = "Business Account"


par :
Range("H1").Value = "Franchisés1" 
Range("i1").Value = "Franchisés2" 
Range("j1").Value = "Franchisés" 
Range("k1").Value = "Org Id" 
Range("l1").Value = "Business Account"


ou encore, remplace :
Range("a2").Select 
Selection.End(xlDown).Select 
lastli = ActiveCell.Row


par :
lastli = Range("a2").End(xlDown).Row

!!! Attention ce code est dangereux si tu n'as rien en A3.......
0
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 4
22 avril 2013 à 16:02
Merci Franck pour tes commentaires. ça m'aide beaucoup!
Afin de mieux cerner ma problématique, j'aurai bien voulu joindre mon fichier Excel mais je ne vois pas comment faire... En fait la variable NomFichierRI et même la variable PériodeRI me serve autant dans le module "a2_mise_en_forme" mais également dans une autre module. J'ai en fait créé un module par Sub mais le but sera d'utiliser une fonction "Call" afin de relier les modules. Merci beaucoup pour la simplification du code, je n'ai jamais pensé à ça... comment je fais si je veux joindre une pièce ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
22 avril 2013 à 16:04
Pour joindre un fichier, utilise https://www.cjoint.com/
Tu va sur ce site créer un lien vers ton fichier et reviens ici coller ce lien dans une réponse.

Une sub par module est inutile et va t'embrouiller plus qu'autre chose......
0
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 4
22 avril 2013 à 16:44
Voici: https://www.cjoint.com/?0DwqSuaiLNX
Merci d'avance.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
22 avril 2013 à 16:49
oui ... et???
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
22 avril 2013 à 16:54
En y regardant un peu, je rassemblerais les codes de tes modules Macro1, Macro2 et Macro3, dans un même module (appelé par exemple : Mise_En_Page), avec, en entête de ce nouveau module, la déclaration de tes variables :
Dim PériodeRI As String, NomFichierRI As String

Sub 1
etc....

Remarque : les 2 macros utilisant tes variables étant regroupées dans le même module, tu n'as pas besoin de déclarer tes variables comme Public, Dim suffit, mais en tête de modul et en dehors de toute Sub ou Function.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
23 avril 2013 à 10:25
référence à toutes les cellules non vide de "O2" à "lastli" de la colonne K
Je ne comprends donc pas ce que tu souhaites afficher en Cellule O2...
- Le nombre de valeurs contenues en colonne K,
- la moyenne des valeurs de la colonne K?
etc...
0
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 4
23 avril 2013 à 10:39
en fait en O2 je veux afficher la formule =K:K&"/"&"050413" car le résultat devrait être égal à O2=690/050713 par exemple. Cette référence deviendra un numéro de facture par la suite dans le code car le but de cette macro c'est d'automatiser le traitement des données de l'onglet "Transaction_Register" afin d'alimenter les onglets qui se créent par entités et surtout les onglets "header" et "line". Mais la problématique c'est que en tapant la formule dans la cellule, on obtient l'affichage que je recherche. Mais avec mon code de départ (C[-4]...), la cellule affiche le résultat 690/050413=0.01360..... De plus, il me faut cette donnée dans toutes les celles de la colonne O pour lesquelles il y a une valeur différente de "rien" en colonne K:K.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
23 avril 2013 à 10:57
Essaye donc ceci :

Dim maVar As String, NomFichierRI As String

NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")
var = "=K:K"
Range("O2") = var
Range("O2") = Range("O2") & "/" & NomFichierRI 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 4
23 avril 2013 à 11:19
Super, ça fonctionne bien. Et si je veux le faire pour toutes les cellules allant de O2 à ma dernière cellule non vide?
J'ai tenté ce qui suit (où ai-je faux ?)

Dim maVar As String, NomFichierRI As String

    NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")
    maVar = "=K:K"
     
    Sheets("Transaction_Register").Select
    
    If Range("a3").Value = "" Then
    lastli = Range("a2")
    Else: lastli = Range("a2").End(xlDown).Row
    End If
    
    Range("O2:O" & lastli) = maVar
    Range("O2:O" & lastli) = Range("O2:O" & lastli) & "/" & NomFichierRI
    Range("O2:O" & lastli).Select
    Selection.Copy
    Range("O2:O" & lastli).Select
    ActiveSheet.Paste
    Calculate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
23 avril 2013 à 11:53
Essaye ceci :

Dim maVar As String, NomFichierRI As String, lastli As Long, i As Long

NomFichierRI = InputBox("Quel est le nom du fichier RI de Vivian ?", "Nom du fichier RI à traiter")
maVar = "=K:K"
Sheets("Transaction_Register").Select
If Range("a3").Value = "" Then
    lastli = Range("a2")
Else
    lastli = Range("a2").End(xlDown).Row
End If
Range("O2:O" & lastli) = maVar
For i = 2 To lastli
    Range("O" & i) = Range("O" & i) & "/" & NomFichierRI
Next
0
conrade82 Messages postés 96 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 9 septembre 2016 4
23 avril 2013 à 15:32
C'est parfait !!! Grand merci.
Mon souci a été résolu. A bientôt,

Cordialement,

Jean
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
23 avril 2013 à 16:15
de rien.
A+
Franck
0