Macro Global ... As string/Integer

Résolu
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

5 réponses

  1. Modérateur
    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
    1. 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
    2. Modérateur
      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
    3. Modérateur
      oui ... et???
      0
    4. Modérateur
      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
  2. Modérateur
    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
    1. 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
      1. Modérateur
        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
        1. 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
          1. Modérateur
            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
          2. C'est parfait !!! Grand merci.
            Mon souci a été résolu. A bientôt,

            Cordialement,

            Jean
            0
          3. Modérateur
            de rien.
            A+
            Franck
            0