Problème de niveau de variables
Bonjour à tous, je développe actuellement un fichier excell en phase de finalisation et je rencontre un souci de maitrise des variables, voici la description du problème :
Mon projets comporte plusieurs onglets et une partie de code dans ThisWorkbook, le code commence ainsi :
Private Sub Workbook_Open()
Dim lig As Long
'demande i MAJ de validation ou pas
Do
maj = InputBox("Veuillez indiquer ce que vous souhaitez faire :" & vbCrLf & vbCrLf & "1 : Pour une Validation," & vbCrLf & vbCrLf & "2 : Pour une Mise à Jour de validation," & vbCrLf & vbCrLf & "3 : Pour une Revalidation après 2 ans", "Type d'action?") ', , 11500, 7000)
If maj < 1 Or maj > 3 Then
MsgBox "vous avez saisie un nombre inexistant"
End If
Loop Until maj = 1 Or maj = 2 Or maj = 3
'validation normale
If maj = 1 Then
'Si yes valeur de 6 et No valeur de 7
nouveau = MsgBox("Voulez vous renseigner une nouvelle validation", vbYesNo, "Demande de renseignement")
'Si on fait une nouvelle validation
If nouveau = 6 Thenla variable maj est définie dans la partie général/déclaration comme suit : Public maj As Integer
dans cette phase de finalisation, pour améliorer le visuel je souhaite remplacer le imputbox par un userform, j'ai donc modifié le code comme suit :
Private Sub Workbook_Open()
Dim lig As Long
'récupération du type de validation
typeaction.Show
'on continue
If maj = 1 Then
'Si yes valeur de 6 et No valeur de 7
nouveau = MsgBox("Voulez vous renseigner une nouvelle validation", vbYesNo, "Demande de renseignement")
'Si on fait une nouvelle validation
If nouveau = 6 Thenet le code de la userform typeaction est le suivant :
Public Sub CommandButton1_Click()
Do
maj = CInt(TextBox2.Text)
If maj < 1 Or maj > 3 Then
MsgBox "vous avez saisie un nombre inexistant"
End If
Loop Until maj = 1 Or maj = 2 Or maj = 3
Unload typeaction
End Submalheureusement la variable maj semble bien récupérées dans le userform mais ne passe pas dans le code de thisworkbook, je pense que j'ai mal maitrisé la portée de cette variable au sein du fichier mais je ne trouve pas à quel moment
Merci d'avance de votre aide
Bonne journée à tous
Salut Patrick,
Dans l'océan de cellules d'une seule feuille Excel, il y en a bien une qui n'est impactée par aucune action de tes Sub(), j'imagine!
Une solution que j'utilise, sans créer une multitude de variables globales, dans le cas où j'ai besoin de garder des valeurs accessibles à tout instant dans les 4 coins d'un fichier : je nomme une cellule et j'y mets cette variable.
Ainsi, tu nommes quelque part une cellule [MAJ] et depuis ta Userform, tu l'initialises avec la variable 'maj'
Public Sub CommandButton1_Click()
Do
maj = CInt(TextBox2.Text)
If maj < 1 Or maj > 3 Then
MsgBox "vous avez saisie un nombre inexistant"
End If
Loop Until maj = 1 Or maj = 2 Or maj = 3
[MAJ]=maj
Unload typeaction
End Sub'récupération du type de validation
typeaction.Show
'on continue
If [MAJ] = 1 ThenA+
Bonjour Curulis, bonne idée merci, je n'y avait pas pensé, je regarde pour faire comme cela
bonne journée
Bonjour,
Curulis bonjour,
avez-vous fait une recherche de valeur dans le code correspondant à maj ?
Vous avez peut-être un résidu de définition qui crée une deuxième variable maj...
Dans mes applications j'utilise et "abuse" des variables publics (certains sont contre cela, mais vu mon niveau c'est tellement plus simple... enfin je pense...), mais je n'ai pas ce genre de problème, me semble-t-il...
@ bientôt
LouReeD
Bonjour à tous,
En définissant Public test As Integer dans un module de code (Module1), et en faisant un mini-sub dans le module de code de ThisWorkbook
Private Sub Workbook_Open()
MsgBox Module1.test
End SubJ'obtiens bien l'affichage de ma variable (0) en ouvrant le fichier.
Vérifiez que vous n'avez pas défini une autre variable "maj" dans votre Sub/module thisworkbook.
Utilisez Option Explicit pour voir si les variables sont bien définies.
Si vous écrivez "MsgBox Module1." et que vous appuyez sur CTRL+Espace, l'auto-compétition devrait vous proposer "test", signifiant bien que la variable est accessible.
Bonjour à tous
Une mise en application de la déclaration de MAJ comme étant "Public" dans le module de ThisWorkbook.
MAJ vaudra 1, 2, 3 ou 0 (si aucune action n'est n'a été sélectionnée).
Code dans ThisWorkbook :
Option Explicit
Public MAJ& ' déclaration de la variable publique MAJ
Private Sub Workbook_Open()
Dim lig As Long
Beep ' on attire l'attention de l'utilisateur
usfTypeAction.Show ' on affiche le USF de choix de l'action à entreprendre
MsgBox "C'est l'action n° " & MAJ & " qui a été choisie.", vbInformation ' vérification MAJ
End SubCode du UserForm :
Private Sub CommandButton1_Click()
Dim i&
ThisWorkbook.MAJ = 0 ' remise à zéro du choix de l'action
For i = 1 To 3 ' boucle sur les trois options
' si l'option i est cochée, on quitte la boucle d'index i
If Me.Controls("OptionButton" & i).Value = True Then Exit For
Next i
If i > 3 Then ' aucune action n'a été cochée -> on informe
MsgBox "Choisissez une des trois actions s'il vous plaît.", vbInformation
Else ' sinon l'option n° i a été cochée
ThisWorkbook.MAJ = i ' on attribue le n° de l'action choisie à la variable MAJ (publique)
Unload Me ' on décharge le userform
End If
End SubRe,
Une autre manière de faire.
[MAJ] sera un nom (de niveau classeur) qui va contenir le n° de l'action choisie soit 1, 2, 3 ou 0 (si pas de choix).
La valeur associée à ce nom sera accessible par [MAJ] dans le code VBA. Elle sera aussi accessible directement dans une cellule par la formule =MAJ
La valeur sera aussi visible via le menu Formules / Gestionnaire de noms
merci à tous de votre aide, j'ai testé chaque solution qui sont fonctionelles mais j'ai surtout appris à appréhender les choses de façons très diverses.
Bonne journée
Re,
Tiens encore une autre solution pour le fun.
On utilise une chose rarement utilisée qui est la création de propriétés personnalisées au niveau de chaque feuille de calcul.
Les caractéristiques de ces propriétés personnalisées c'est quelles ne sont pas directement visibles et accessibles et qu'elles persistent au-delà de l'enregistrement et fermeture du classeur (comme un nom masqué).
Dans le code, on trouvera un module nommé "mGestionPropPerso" qui :
- permet l'affectation d'une valeur à une propriété personnalisée d'une feuille (on crée la propriété si elle n'existe pas) - il faut noter que la valeur est transformée en string
- permet de lire une propriété personnalisée d'une feuille
- permet de supprimer une propriété personnalisée d'une feuille
Les codes dans ThisWorkbook et le userform utilisent les procédures et fonctions de ce module "mGestionPropPerso". Les codes sont commentés.
Super malin @mafraise les propriétés customs, c'est vrai que je n'y pense jamais mais c'est très pratique dans certains cas !
En plus ça permet d'itérer pour les parcourir.