VBA, module de déclaration

Bonjour,

Je souhaiterais dans mon projet avoir un module de déclaration qui me permettrai de regrouper les différentes variables utilisées dans les différents modules de façon a pouvoir changer facilement au besoin un chemin d'accés, un nom de fichier, etc,

Malgrés les différentes recherches je n'arrive pas organiser ce module :

Public Fichier1 as workbook
Public Fichier2 as workbook
Public Fichier3 as workbook
Public Fichier4 as workbook

Set Fichier1 = workbook("Suivi du temps")
Set Fichier2 = workbook("Aléas")
Set Fichier3 = workbook("Reste a faire")
Set Fichier4 = workbook("Emp")

Set pose problème, et je ne trouve pas comment corrgier, est ce que vous pouvez me guider ?

Merci d'avance

5 réponses

  1. Contributeur
    Je suggère ceci:
    Dans le module de déclaration:
    Option Explicit
    Public Function Fichier1() As Workbook
    Fichier1 = Workbooks("Suivi du temps")
    End Function
    Public Function Fichier2() As Workbook
    Fichier2 = Workbooks("Aléas")
    End Function
    Et dans un autre module:
    Option Explicit
    Sub test()
        Dim un_fichier As Workbook, autre_fichier as Workbook
        Set un_fichier = Fichier1()
        Set autre_fichier = Fichier2()
    End Sub
    Qu'en penses-tu?
    0
    1. Bonjour tom,

      Au début de Module1, mets tes déclarations de variables publiques
      avant ta première Sub :

      
      Option Explicit
      
      Public Fichier1 As Workbook
      Public Fichier2 As Workbook
      Public Fichier3 As Workbook
      Public Fichier4 As Workbook
      '
      
      Sub Essai()
        MsgBox Fichier1.Name & vbLf & Fichier2.Name & vbLf _
          & Fichier3.Name & vbLf & Fichier4.Name
      End Sub
      
      

      Dans Module1, tu peux mettre uniquement tes déclarations
      de variables publiques, et mettre ta 1ère Sub dans Module2.

      ----------------------------------

      Dans ThisWorkbook, mets ce code VBA :

      
      Option Explicit
      
      
      Private Sub Workbook_Open()
        Set Fichier1 = Workbooks("Suivi du temps")
        Set Fichier2 = Workbooks("Aléas")
        Set Fichier3 = Workbooks("Reste a faire")
        Set Fichier4 = Workbooks("Emp")
      End Sub
      
      

      Attention :

      Ce code sera exécuté uniquement à l'ouverture du classeur ;
      les variables publiques seront alors correctement initialisées.

      N'oublie jamais que si ton programme plante, alors cette
      brusque interruption fera que le contenu des variables en
      mémoire sera perdu : tes variables publiques ne seront plus
      valables ! Il faudra fermer le classeur puis le ré-ouvrir pour
      que tes variables publiques soient de nouveau correctes.

      ----------------------------------

      Si ton problème est réglé, merci de l'indiquer,
      pour que le sujet puisse être passé en résolu.

      Cordialement.  :)
       
      0
      1. Contributeur
        Bonjour,

        comment je procède en général. Dans un module Standard :
        Option Explicit
        
        Public initOk As Boolean
        Public Fichier1 As Workbook
        Public Fichier2 As Workbook
        Public Fichier3 As Workbook
        Public Fichier4 As Workbook
        
        Sub init()
            Set Fichier1 = Workbooks("Suivi du temps")
            Set Fichier2 = Workbooks("Aléas")
            Set Fichier3 = Workbooks("Reste a faire")
            Set Fichier4 = Workbooks("Emp")
            initOk = True
        End Sub
        
        ' dans les sub principaux et éventuellement workbook_Open() :
        Sub machin_truc()
            If Not initOk Then init
            ' etc
        End Sub 

        Avantage :
        si plantage lors de la mise au point (ou plus tard) les variables se ré-initialiseront car initOk sera repassé aussi à False.

        Note à Albkan : Workbook_Open() doit être un des rares événements qui peuvent se lancer par F5, donc sans fermer le fichier.
        eric
        En essayant continuellement, on finit par réussir. 
        Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
        En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
        0
        1.  
          Bonjour éric,

          Merci pour le raccourci < F5 > qui évite de fermer et ré-ouvrir le classeur :
          c'est drôlement pratique !  ;)

          Je trouve que ta méthode est très bien aussi, mais dans ta Sub init(),
          pour les 4 Set, il me semble qu'il faut « Workbooks ».

          Amitiés, albkan.  :)
           
          0
        2. Contributeur
          il faut « Workbooks ».
          Tout à fait. J'ai fait un copié-collé de son code sans regarder.
          Je corrige
          Merci
          0
      2. Bonjour,

        Merci pour vos retour très intéressant, je vais tester cela,

        j'utilise également le code suivant pour vérifier si le fichier est déjà ouvert, sinon l'ouvrir.

        On Error Resume Next

        je peux mettre ce type de code dans le module de déclaration et en spécifiant 1 chemin d’accès a un workbook de façon a ne pas le répéter dans les différents modules et de pouvoir changer le chemin d’accès facilement si besoin.. ?
        0
        1. Contributeur
          bonjour, tu pourrais mettre ceci dans le module de déclaration:
          Option Explicit
          Public Function NomFichier1() As String
          NomFichier1 = "Suivi du temps"
          End Function
          Tu pourrais ensuite utiliser
          NomFichier1()
          où tu veux.
          0
        2. Contributeur
          Bonjour,

          et en spécifiant 1 chemin d’accès a un workbook de façon a ne pas le répéter dans les différents modules et de pouvoir changer le chemin d’accès facilement si besoin.. ?
          j'ai compris la question autrement.
          Dans un module standard tu peux déclarer une constante Public qui sera visible dans tous les modules. La déclarer au début du module, avant toute procédure :
          Public Const chemin As String = "c:\tmp\"

          eric
          0
      3. Bonjour,

        Merci pour les infos, dans un module de déclaration j'ai procédé comme ci dessous,

        En plaçant le FichierSOk dans les autres modules qui peuvent appeler les workbook déclaré ci dessous,

        Cependant il y a une erreur :

        Erreur de compilation :
        Nom ambigu détecté

        le nom de la constante doit être différent de la variable workbook ?
        Merci pour vos conseils

        Option Explicit
        'Affectation constante
        Public Const Fichier2 As String = "X:\
        Public Const Fichier3 As String = "X:\
        Public Const Fichier4 As String = "X:\
        Public Const Fichier5 As String = "X:\
        Public Const Fichier6 As String = "X:\

        Public FichierSOk As Boolean
        Public Fichieranalyse As Workbook
        Public Fichier2 As Workbook
        Public Fichier3 As Workbook
        Public Fichier4 As Workbook
        Public Fichier5 As Workbook
        Public Fichier6 As Workbook

        Sub FichierSOk()
        Set Fichieranalyse = Workbooks("Fichier analyse")
        Set Fichier1 = Workbooks("Suivi du temps")
        Set Fichier2 = Workbooks("Aléas")
        Set Fichier3 = Workbooks("Reste a faire")
        Set Fichier4 = Workbooks("Emp")
        FichierSOk = True

        End Sub
        0
        1.  
          Pour tes 5 constantes : faudra pas oublier ton guillemet final !

          Ah ben oui, ça, il vaut mieux éviter qu'un nom de constante soit le même
          que celui d'une variable (qu'elle soit publique ou non) ! Donc pas de :
          Public Const Fichier2 As String = "X:\..."  ET  Public Fichier2 As Workbook

          De même, il vaut mieux éviter qu'un nom de Sub soit le même que celui
          d'une variable (qu'elle soit publique ou non) ! Donc pas de :
          Public FichierSOk As Boolean  ET  Sub FichierSOk()
           
          0
        2. Contributeur
          bonjour, Je pense que tu dois choisir : soit travailler avec des constantes publiques, comme suggéré (https://forums.commentcamarche.net/forum/affich-34186266-vba-module-de-declaration#8) par Eric, soit travailler avec des Workbook publics, et une fonction, comme suggéré (https://forums.commentcamarche.net/forum/affich-34186266-vba-module-de-declaration#3) par ... le même Eric.
          Je suggére les constantes publiques.
          Public Const Fichier2 As String = "Aléas"
          0
        3. Contributeur
          Bonjour,

          J'ajouterai que c'est le B.A.BA et que programmer ne s'improvise pas.
          Fait l'effort de consulter les initiations à VBA qui ne manquent pas sur le net, c'est quand même le minimum.
          Ce n'est pas le but des forums que de t'apprendre le basic du basic.
          eric
          0