XL 2019 variables théoriquement déclarées en global non reconnues dans une procédure

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

chris4785478547

XLDnaute Junior
Bonjour le fil,
Je croyais savoir que pour qu'une variable soit utilisable dans toutes les procédures, donc globale, elle devait être déclarée en tête de procédure, c'est à dire avant le nom de la procédure. C'est ce que j'ai fait, pourtant mes variables ne semblent pas reconnues puisque la valeur de mes 2 variables n'apparait pas.
Si j'intègre ma procédure à la procédure principale, tout se passe bien.

Voici ma procédure:
VB:
Sub PropoEtValidationDates()

rep = MsgBox("Votre banque vous propose l'importation de vos opérations entre le" & DateDebut & " et le " & DateFin & " Ces dates vous conviennent-elles ?", vbYesNo, Sélection_dates)

    If rep = vbNo Then
        erreur = True
        While erreur
        erreur = False
            DateDebut = InputBox("Choisissez votre date de DEBUT importation au format jj/mm/aa entre le " & DateDebutBanque & " et le " & DateFinBanque)
            If Int(CDate(DateDebut)) < Int(CDate(DateDebutBanque)) Or Int(CDate(DateDebut)) > Int(CDate(DateFinBanque)) Then
                erreur = True
            End If
        Wend
        
        erreur = True
        While erreur
            erreur = False
            DateFin = InputBox("Choisissez votre date de FIN importation au format jj/mm/aa entre le " & DateDebut & " et le " & DateFinBanque)
            If Int(CDate(DateFin)) < Int(CDate(DateDebutBanque)) Or Int(CDate(DateFin)) > Int(CDate(DateFinBanque)) Or Int(CDate(DateFin)) < Int(CDate(DateDebut)) Then
                erreur = True
            End If
        Wend
    End If
        
  
    If rep = vbYes Then
    ' en développement
    End If
  
End Sub

Voici la procédure appelante avec les déclarations:

VB:
Dim DateEnCours, DateDebut, DateFin, DateDebutBanque, DateFinBanque, Sélection_dates As String
Dim rep, LigneDebutSource, LigneDebutCible, LigneDebutEffectifSource As Integer
Dim erreur As Boolean
Dim L As Integer
Dim a, b As Range




Sub Aimportation_compte_bancaire()


    Workbooks.Open Filename:="C:\Users\Utilisateur\Desktop\importation_banque.xlsx"
        
    DateDebutBanque = Workbooks("importation_banque.xlsx").Worksheets("Feuil1").Range("B1").Value
    DateFinBanque = Workbooks("importation_banque.xlsx").Worksheets("Feuil1").Range("C1").Value
    SélectionDates = "Sélection_dates"
    
    DateDebut = DateDebutBanque
    DateFin = DateFinBanque
    
    'PROPOSITION ET VALIDATION DATES
    
    
 '   rep = MsgBox("Votre banque vous propose l'importation de vos opérations entre le" & DateDebut & " et le " & DateFin & " Ces dates vous conviennent-elles ?", vbYesNo, Sélection_dates)
'
 '   If rep = vbNo Then
  '      erreur = True
   '     While erreur
    '    erreur = False
     '       DateDebut = InputBox("Choisissez votre date de DEBUT importation au format jj/mm/aa entre le " & DateDebutBanque & " et le " & DateFinBanque)
      '      If Int(CDate(DateDebut)) < Int(CDate(DateDebutBanque)) Or Int(CDate(DateDebut)) > Int(CDate(DateFinBanque)) Then
       '         erreur = True
'        '    End If
 '       Wend
  '
   '     erreur = True
    '    While erreur
     '       erreur = False
      '      DateFin = InputBox("Choisissez votre date de FIN importation au format jj/mm/aa entre le " & DateDebut & " et le " & DateFinBanque)
'            If Int(CDate(DateFin)) < Int(CDate(DateDebutBanque)) Or Int(CDate(DateFin)) > Int(CDate(DateFinBanque)) Or Int(CDate(DateFin)) < Int(CDate(DateDebut)) Then
 '               erreur = True
  '          End If
   '     Wend
    'End If
        
  
'   If rep = vbYes Then
'       en développement
'   End If
    
    Call PropoEtValidationDates
    
    'COMPTAGE NOMBRE DE LIGNES A INSERER
    Call ComptageNbreDeLignesAInserer
    
    
    
    
 
    
End Sub



Merci par avance.
 
Solution
Bonjour,
Si tu mets Dim c'est comme Private, ça limite le scope au module.
Pour étendre le scope à tous les modules, il faut mettre Public. Sauf dans les modules de feuilles, classeurs et UserForms qui ne peuvent avoir que des variables dont le scope est limité à leurs modules mais qui peuvent "voir" les variables Public de modules indépendants.
Bonjour,
Si tu mets Dim c'est comme Private, ça limite le scope au module.
Pour étendre le scope à tous les modules, il faut mettre Public. Sauf dans les modules de feuilles, classeurs et UserForms qui ne peuvent avoir que des variables dont le scope est limité à leurs modules mais qui peuvent "voir" les variables Public de modules indépendants.
 
Par exemple on a souvent besoin d'échanger des valeurs avec un UserForm.
On peut déclarer des variables Public dans un module indépendant qui seront utilisables dans le UserForm (en entrée: valeurs déterminant une position, une liste, etc... en sortie; valeur choisie dans une ComboBox, etc...).
On peut aussi étendre cette notion aux Sub et Function et utiliser un module indépendant qui aura des Sub / Function Public (par défaut) dont le rôle sera de gérer des variables d'échange.
VB:
Option Explicit

'---------------------------------------------
'Permet l'échange de valeurs entre un UserForm
'et les modules qui l'utilisent
'---------------------------------------------
Private Dict As Object

'------------------------------------------
'Efface les valeurs d'échange d'un UserForm
'------------------------------------------
Public Sub ClearUserFormValue()
    If Not Dict Is Nothing Then Dict.RemoveAll
End Sub

'------------------------------------------
'Stocke les valeurs d'échange d'un UserForm
'------------------------------------------
Public Sub SetUserFormValue(ValueID As String, Value As Variant)
    If Dict Is Nothing Then Set Dict = CreateObject("Scripting.Dictionary")
    If Dict.exists(ValueID) Then Dict.Remove ValueID
    Dict.Add ValueID, Value
End Sub

'----------------------------------------
'Rend les valeurs d'échange d'un UserForm
'----------------------------------------
Public Function GetUserFormValue(ValueID As String) As Variant
    If Dict Is Nothing Then
        GetUserFormValue = vbEmpty
    Else
        If Dict.exists(ValueID) Then
            GetUserFormValue = Dict(ValueID)
        Else
            GetUserFormValue = vbEmpty
        End If
    End If
End Function
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
0
Affichages
676
Réponses
22
Affichages
3 K
Retour