Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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.

Dudu2

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
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:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…