Quid des Dim quand Call My_Sub...

Résolu/Fermé
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 - Modifié par dhaze le 10/04/2015 à 15:41
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 - 10 avril 2015 à 16:12
Salut, c'est encore moi :-)

J'ai une macro "solo" qui fonctionne très bien.
Mais quand je veux l'appeler d'une autre ça bug.

L'intérêt d'une première Sub et de déclarer des variables dans une macro courte (il y aura une quinzaine de Sub). La macro appelée sera toujours la même pour éviter les répétions, et alléger mon tableau au maximum.

Function Feuille_Existe(Feuille As String) As Boolean
    On Error Resume Next
    Feuille_Existe = Not Sheets(Feuille) Is Nothing
End Function

Private Sub Nouvelle_Feuille_Click()
'
Dim Sheets_Add_Name As String
Dim Range_Copy As String

    Sheets_Add_Name = "Nouvelle Feuille"
    Range_Copy = "Zone_Entete_Colonnes"

    Call Créer_Feuille_Type

End Sub

Sub Créer_Feuille_Type()
'
    Application.ScreenUpdating = False

    Dim Sheets_Add As Worksheet

'--- Partie désactivée si passe par "Nouvelle_Feuille_Click" --------
    'Dim Sheets_Add_Name As String
    'Sheets_Add_Name = "Nouvelle Feuille"
'----------------------------------------------------------------------------------
     
    If Feuille_Existe(Sheets_Add_Name) Then
        MsgBox "Une feuille " & """" & Sheets_Add_Name & """" & " existe déjà dans ce classeur.", vbExclamation, "Doublon"
        Exit Sub
    Else
        Set Sheets_Add = Sheets.Add(After:=Sheets(Sheets.Count))
        Sheets_Add.Name = Sheets_Add_Name
    End If

    Worksheets("Feuille_Entete_Colonnes").Visible = xlSheetVisible
    Sheets("Feuille_Entete_Colonnes").Select

'--- Partie désactivée si passe par "Nouvelle_Feuille_Click" --------
    'Range("Zone_Entete_Colonnes").Copy
'--- Partie désactivée si autonome ---------------------------------------------------
    Range("Range_Copy").Copy
'----------------------------------------------------------------------------------

    Sheets(Sheets_Add.Name).Select
    Rows(1).Select
    
    With Selection
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteColumnWidths
        .PasteSpecial Paste:=xlPasteFormats
        .Application.CutCopyMode = False
    End With
    
    Worksheets("Feuille_Entete_Colonnes").Visible = xlSheetVeryHidden
    Application.ScreenUpdating = True

End Sub

Sub Créer_Feuille_Type_solo()
'
'Version solo OK
'
    Application.ScreenUpdating = False

    Dim Sheets_Add As Worksheet
    Dim Sheets_Add_Name As String

    Sheets_Add_Name = "Nouvelle Feuille"
     
    If Feuille_Existe(Sheets_Add_Name) Then
        MsgBox "Une feuille " & """" & Sheets_Add_Name & """" & " existe déjà dans ce classeur.", vbExclamation, "Doublon"
        Exit Sub
    Else
        Set Sheets_Add = Sheets.Add(After:=Sheets(Sheets.Count))
        Sheets_Add.Name = Sheets_Add_Name
    End If

    Worksheets("Feuille_Entete_Colonnes").Visible = xlSheetVisible
    Sheets("Feuille_Entete_Colonnes").Select
    Range("Zone_Entete_Colonnes").Copy

    Sheets(Sheets_Add.Name).Select
    Rows(1).Select
    
    With Selection
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteColumnWidths
        .PasteSpecial Paste:=xlPasteFormats
        .Application.CutCopyMode = False
    End With
    
    Worksheets("Feuille_Entete_Colonnes").Visible = xlSheetVeryHidden
    Application.ScreenUpdating = True

End Sub


La version appelée bloque à :
If Feuille_Existe(Sheets_Add_Name) Then

"Erreur de compilation:
Type d'argument ByRef incompatible"

La déclaration :
Sheets_Add_Name = "Nouvelle Feuille"
n'ait pas conservée à l'exécution de la deuxième macro ?
Ou y'a-t-il autre chose qui m'échappe ?

Lo.

3 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
10 avril 2015 à 15:54
Bonjour,
mettre:
Dim Sheets_Add_Name As String
Dim Range_Copy As String


au debut du module pour avoir une declaration de variables globales pour le module
0
Thorak83 Messages postés 1051 Date d'inscription jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017 156
10 avril 2015 à 16:01
Bonjour,
Un dim à l'intérieur d'une sub ou d'une function n'as de portée que dans la sub ou la function et n'existes pas ailleurs.
Pour qu'une variable soit commune à toutes les sub/function, il faut la déclarer tout en haut de la page de code

Cordialement
0
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
10 avril 2015 à 16:12
Merci à vous deux.

Le déroulement de la macro est normal.

Il y avait une autre anomalie.
Apparemment, des guillemets de trop dans :

Range("Range_Copy").Copy

Bon WE

Lo.
0