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 Then

la 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 Then

et 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 Sub

malheureusement 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 Then

A+

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 Sub

J'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 Sub

Code 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 Sub

Re,

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.

Rechercher des sujets similaires à "probleme niveau variables"