VBA, module de déclaration

Fermé
tom - 16 déc. 2016 à 16:14
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 - 22 déc. 2016 à 18:57
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

yg_be Messages postés 23230 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 septembre 2024 Ambassadeur 1 538
Modifié par yg_be le 16/12/2016 à 21:34
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
Utilisateur anonyme
16 déc. 2016 à 21:46
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
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
Modifié par eriiic le 17/12/2016 à 00:25
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
Utilisateur anonyme
17 déc. 2016 à 00:04
 
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
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
17 déc. 2016 à 00:24
il faut « Workbooks ».
Tout à fait. J'ai fait un copié-collé de son code sans regarder.
Je corrige
Merci
0
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
yg_be Messages postés 23230 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 septembre 2024 1 538
18 déc. 2016 à 12:30
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
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
18 déc. 2016 à 13:30
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
 
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
yg_be Messages postés 23230 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 septembre 2024 1 538
22 déc. 2016 à 17:25
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
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
22 déc. 2016 à 18:57
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