web-dev-qa-db-fra.com

Excel - VBA: passer la variable de Sub à Userform

J'ai lu et appliqué la solution que j'ai trouvée sur des sujets similaires, mais rien ne semble fonctionner dans mon cas.

Donc, je veux passer une variable d'un sous de mon Module1 à un formulaire utilisateur. C'est une chaîne appelée "provinceSugg".

Voici la partie pertinente de mon code:

Public provinceSugg As String

Sub probaCity()
[...]
If province = "" And city <> "" Then
provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value
UserForm2.Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
UserForm2.Label1.TextAlign = fmTextAlignCenter
UserForm2.Show
Else
End If

End Sub

Et puis dans mon code utilisateur:

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

Quand j'exécute mon programme:

1 / J'ai le contenu de provinceSugg affiché dans la MsgBox appelée depuis mon sous (donc il y a un provinceSugg, ce n'est pas une variable vide).
2 / La MsgBox appelée à partir du formulaire utilisateur est vide (la transmission de la valeur a donc échoué) et mon programme se bloque lors de l'exécution de "sMain.Range (" J6 "). Value = provinceSugg" avec quelque chose comme "Erreur 424 objet requis" (donc la variable n'a pas pu passer à l'utilisateur).

J'ai essayé tout ce que j'ai trouvé sur le forum et ici (différentes façons d'indiquer que provinceSugg est une variable publique mais qui plante toujours ...).

Merci d'avance pour votre aide !

8
Phalanx

Vous seriez en mesure de créer des variables publiques dans le Userform qui peuvent être définies par le module.

Ces variables ne sont accessibles que dans le Userform lorsqu'il est chargé.

Dans le Userform, déclarez les variables publiques pour les deux objets.

Public sMain As Worksheet
Public provinceSugg as string

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

Dans le module, vous pouvez évaluer ces deux variables.

Sub probaCity()
[...]
If province = "" And city <> "" Then

    provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value

    With UserForm2
        .provinceSugg = provinceSugg 
        Set .sMain = sMain 
        .Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
        .Label1.TextAlign = fmTextAlignCenter
        .Show
    End With

End If

End Sub
9
Dan
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim selectColumn
selectColumn= Split(Target.Address(1, 0), "$")(0)

Call UserFormStart(selectColumn)
End Sub

Module principal intérieur

Public columnSelection As String
...
Public Sub UserFormStart(ByVal columnRef As String)
    'MsgBox "Debug columnRef=" & columnRef
    columnSelection = columnRef
    UserForm1.Show
End Sub

Inside UserForm

Private Sub UserForm_Initialize()

'MsgBox "Debug UserForm_Initialize =" & columnSelection
...

End Sub

Worksheet_SelectionChange appelle un sous-module sur le module où columnSelection est déclaré public et visible à partir de UserForm. J'ai utilisé trois variables différentes pour la référence de colonne pour montrer qu'il y a là où UserForm a accès au module. Tout cela fonctionne et a mis du temps à trouver et à travailler, d'où la soumission. Heureux les gens de chasse

1
Andrew Day