Macro Global ... As string/Integer

Résolu
conrade82 Messages postés 105 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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. conrade82 Messages postés 105 Statut Membre 4
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      oui ... et???
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  3. conrade82 Messages postés 105 Statut Membre 4
     
    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
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. conrade82 Messages postés 105 Statut Membre 4
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. conrade82 Messages postés 105 Statut Membre 4
       
      C'est parfait !!! Grand merci.
      Mon souci a été résolu. A bientôt,

      Cordialement,

      Jean
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      de rien.
      A+
      Franck
      0