Passage du module de feuille variable au formulaire user dans VBA

Tout d'abord, c'est mon premier message sur le débordement de la stack, alors j'espère que je suis en train de suivre la procédure correcte. J'ai parcouru des dizaines de publications sur ces sites et d'autres, mais je ne parviens pas à extrapoler des solutions pour des cas semblables à la mienne. J'ai également essayé d'utiliser des lignes de debugging, mais je ne peux pas identifier le problème, probablement en raison du fait que je suis nouveau dans VBA. Voici ce que j'ai en bref, j'espère que vous pouvez aider:

Un button de command sur Sheet1 qui génère un msgbox Oui / Non / Annuler, je veux qu'un mécanisme se souvienne de ce choix dans les Formulaires Utilisateur et Modules qui suivent, alors j'ai déclaré boolNieuweOpdrachtgever en tant que variable Public, cependant, dans la forme suivante, la ligne Déboguer indique qu'il ne se souvient pas de sa valeur du tout. Voici le code:

Public boolNieuweOpdrachtgever As Boolean Public Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select End Sub 

Par exemple, dans le cas de vbYes, il passe par un formulaire de travail après quoi il entre dans un second qui a une déclaration IF basée sur boolNieuweOpdrachtgever . Cependant, d'ici là, il a déjà perdu sa valeur. Pouvez-vous me dire ce que je fais mal?

Je crois que le problème est que le code associé aux feuilles de calcul n'est pas du même type qu'un module. Le code de la feuille de calcul n'a pas la capacité de définir des variables publiques ou globales.

J'ai testé différents scénarios et la solution serait de prendre tout votre code dans le code de la feuille de calcul et de le placer dans un module distinct, puis appeler le module à partir des events de la feuille de calcul qui triggersnt votre code.

À ce stade, le module déclare la variable publique, et il est accessible en tant que variable publique.

Code de la feuille:

 Private Sub SomeValue_Change() 'What would have been your code, now moved to another module Call NewModule End Sub 

Code du module:

 Option Explicit Public tempValue As Ssortingng Sub NewModule() 'Code that was previously in the Worksheet Code tempValue = InputBox("Please input the public variable value.","Public Variable") 'You can test it by calling it from here to simplify the process. Call TestValues End Sub 

Autre code: mettez cela dans un module différent. Notez qu'il n'y a pas de déclaration de la variable du tout. Seulement dans le module qui contient "NewModule".

 Sub TestValues() MsgBox("The value from the public variable is :" & tempValue & ".") End Sub 

En déclarant la variable à partir d'un module au lieu du code de la feuille de calcul, la variable est capturée et accessible à l'échelle mondiale. Faire la même chose du code de feuille de calcul échoue.

J'ai essayé votre code et je pense que je connais votre problème. Lorsque vous acquérez la variable dans votre formulaire, indiquez la forme nieuweOpdrachtgeverForm, vous devez appeler le module et la variable, pas seulement la variable. Par exemple: Me.Label1.Caption = Module1.boolNieuweOpdrachtgever

Voici le code que j'ai utilisé pour le Sub (dans Module1) que le button appelle:

 Public boolNieuweOpdrachtgever As Boolean Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select End Sub 

Voici le code dans les formulaires, j'ai utilisé pour tester le passage de la variable. Notez que j'ai ajouté une label appelée Label1 et que la valeur résultante a été placée dans l'label:

 Private Sub UserForm_Initialize() Me.Label1.Caption = Module1.boolNieuweOpdrachtgever End Sub 

Voici les résultats sur les formulaires après avoir sélectionné Oui et Non:

Formulaire renvoyant faux

Formulaire renvoyant vrai

Sjors – Je me demandais si ma réponse était utile (je n'ai pas vu le chèque vérifié), mais je suis content. Pour répondre à votre dernier commentaire, j'ai ajouté un code. Le premier bit est le code dans Module1, le second est dans Sheet1, et l'autre provient des Forms (selon ma réponse ci-dessus). Je vous reorderais de couper et de coller le code dans votre projet et de le franchir (F8) pour voir comment il fonctionne. Cela devrait vous donner une bonne compréhension de base pour faire des appels entre des objects.

MODULE 1:

 Public boolNieuweOpdrachtgever As Boolean Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant Dim strFromSheet1 As Ssortingng nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select Call Sheet1.setSsortingng strFromSheet1 = Sheet1.strPublic Call Sheet1.Test(strFromSheet1) End Sub 

SHEET1:

 Public strPublic As Ssortingng Public Sub Test(ByVal strTest As Ssortingng) MsgBox (strTest) End Sub Public Sub setSsortingng() strPublic = "Hello" End Sub 

EXEMPLE DE L'UN DES FORMES:

 Private Sub UserForm_Initialize() Me.Label1.Caption = Module1.boolNieuweOpdrachtgever End Sub