Bonjour à tous,
Je viens avec une question sur les userforms (ce sont les premiers que je pratique).
Mon problème est le suivant :
Je demande à l'utilisateur de saisir une suite de données (des noms de colonnes pour être exact), je voudrais que la fenêtre soit affichée mais que l'utilisateur ait tout de même accès aux feuilles (recherche de données, vérification des colonnes a entrer). Mon problème est que le code continue à s'exécuter, les valeurs n'étant pas entrées, le code crashe.
Y a-t-il un moyen de faire attendre le code autrement qu'en passant en modal ?
Merci,
PEagle
Edit:
Je rajoute une question,
Mon but est de passer les valeurs de l'userform vers mon main, j'ai fait des "string" public et je les modifie dans mon userform, quand je les appelle dans le userform (par un msgbox), ils sont correctement renseignés et quand je les appelle dans le main, ils ne le sont plus... Où ai-je fait une erreur ?
Merci
Code:
Private Sub cmdOK_Click()
'validation
If Me.txtTri1 = "" Or Me.txtTri1 = "aucun" Or Me.txtTri1 = "aucune" Then
MsgBox "veuillez entrer au moins une colonne", Title:="Erreur"
End If
If IsNumeric(Me.txtTri1) Or IsNumeric(Me.txtTri2) Or IsNumeric(Me.txtTri3) Then
MsgBox "Veuillez n'entrer que des lettres de colonne", Title:="Erreur"
End If
'exploitation
c1 = Me.txtTri1
c2 = Me.txtTri2
c3 = Me.txtTri3
MsgBox (c1 & " " & c2 & " " & c3)
Me.Hide
End Sub
Code:
Public c1, c2, c3 As String
Private Sub trialphav2()
'déclaration des variables
Dim i, j, ld, col1, col2, col3, lf As Integer
'initialisation des variables
c1 = ""
c2 = ""
c3 = ""
bool = False
triAlphaM.Show
MsgBox (c1 & c2 & c3)
End Sub
Je ne peux pas te joindre de fichier sans enfreindre la politique de confidentialité de mon travail -_-
Le main est la partie de code que j'ai mis et qui se nomme "trialphav2" (le code maitre si tu préfères, celui qui appelle le userform).
Pour ne lancer le code qu'après la saisie il faut que ce soit en modal (comme c'est le cas dans le code que j'ai joint) mais cela m'empêche de chercher des données spécifiques dans mon fichier.
si je met triAlphaM.show vbModeless, il m'affiche le msgbox sans attendre la saisie dans le userform.
Bon,
J'ai ré-écrit un petit code pour montrer les choses que je n'arrive pas à faire. Je passe les valeurs d'une autre manière maintenant qui fonctionne.
le userform est en modal et ne me permet pas d'accéder aux données présentes dans le classeur lorsque le userform est affiché, c'est pour moi un problème.
J'aimerais également "appeler" des subroutines que j'ai mis dans l'userform (notamment l'initialisation) mais je ne sais comment faire...
Soit j'ai l'esprit embrumé (heu ... oui!) soit c'est pas clair !
je ne comprend pas l'intérêt de vouloir 'piloter' une Userform depuis une macro pour faire afficher le contenu de 3 textbox, alors que cela pourrait être fait depuis l'USF ?
Dans Private Sub trialphav2() : I) 'je souhaite initialiser le prompt1 avec ma première sub mais le call renvoie une erreur
'Call prompt1.prompt1_Initialize
prompt1.Show
Call prompt1.prompt1_initialize ne peut pas fonctionner:
1) dans l'USF prompt1, il n'existe pas de sub prompt1_Initialize, mais la sub : Private Sub UserForm_Initialize()
2) comme son nom l'indique, cette sub est "private" sa portée ne dépasse celle du module qui la contient; il faudrait supprimer le private pour qu'un appel correcte puisse la lancer.Mais ça ne présente pas d'intérêt puisque, dès la commande prompt1.Show , la sub :Private Sub UserForm_Initialize() est lancée automatiquement !!
II)
c1 = prompt1.txtTri1
c2 = prompt1.txtTri2
c3 = prompt1.txtTri3 'je voudrais que le code fasse une pause ici, et "attende" que l'utilisateur clique sur OK
MsgBox (c1 & c2 & c3)
pourquoi ne pas écrire directement dans le code du bouton OK (Private Sub cmdOK_Click()) c1 =txtTri1
c2 = txtTri2
c3 = txtTri3
MsgBox c1 & c2 & c3
Plusieurs raisons à tout ça...
Pour le UserForm_Initialize(), il ne se lançait pas parce que je croyais qu'il devait être nommé suivant le UserForm (ici prompt1).
Ce n'est pas génant de tout mettre dans le code du OK ?
D'autre part si je mets tout dans le code du OK, en le mettant en modeless, le code arrive au end sub sans attendre la fin du prompt.
Bonsoir.
Pourquoi vous référez vous tout le temps à ce que vouliez faire initialement ? Vous ne pouvez plus le faire comme ça parce que vous avez besoin d'un affichague non modal, un point c'est tout.
Donc toute la programmation actuellement dans Module1 doit allez dans l'UserForm, et dans Module1 vous avez juste besoin d'une procédure minuscule qui se termine tout de suite après l'avoir mis à l'état affiché, mais qui ne fait rien d'autre.
L'essentiel du traitement sera donc bien dans la cmdOK_Click()
Observation: Typez convenablement toutes vos variables et pas seulement la dernière d'un Dim
Faute de spécification toutes celles qui précèdent sont assumées As Variant.
Bon, je reprends...
ça me dérange pas de tout passer dans le code du click OK, un de mes soucis c'est qu'en modeless, le programme saute directement au end sub et le userform disparaît instantanément...
Vous pensez à un code comme celui-ci surement :
Code:
sub main()
prompt1.show vbModeless
end sub
Quand au fait que les variables étaient mal déclarées, je pensais qu'en le mettant à la fin il les assumaient toutes comme étant du type (ça va faire une horriblement longue liste de ligne de déclaration de variables.
Pas chez moi.
Joignez votre classeur avec ce test que je voie si ça fait pareil chez moi.
Remarque: au lieu de spécifier vbModeless au Show je préfère mettre la propriété ShowModal de l'UserForm à False. Mais ça revient au même.
Pour le fun, un bricolage avec un userform en affichage modal et choix possible des colonnes au clavier ou bien via la souris directement sur la feuille Excel (cliquez sur la flèche à côté des textbox)