VBA, module de déclaration

tom -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. Utilisateur anonyme
     
    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
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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. Utilisateur anonyme
       
       
      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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      il faut « Workbooks ».
      Tout à fait. J'ai fait un copié-collé de son code sans regarder.
      Je corrige
      Merci
      0
  4. tom
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tom
     
    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. Utilisateur anonyme
       
       
      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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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