XL 2010 Userforms modal avec accès aux feuilles

PEagle

XLDnaute Nouveau
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
 
Dernière édition:

Paf

XLDnaute Barbatruc
Bonjour PEagle,

Où ai-je fait une erreur ?
Heu... en ne joignant pas de classeur qui permettrait d'y voir plus clair ?

Mon problème est que le code continue à s'exécuter, les valeurs n'étant pas entrées, le code crashe.
Ben ... en ne lançant le code qu'après la saisie ?

Mon but est de passer les valeurs de l'userform vers mon main
Quest ce que c'est ce 'main' ?
A+
 

PEagle

XLDnaute Nouveau
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.
 

PEagle

XLDnaute Nouveau
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...

Merci d'avance.
 

Pièces jointes

  • Userform.xlsm
    17.9 KB · Affichages: 57

Paf

XLDnaute Barbatruc
re,

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

comme ça il n'y a pas d'attente à gérer !! ??

A+
 

PEagle

XLDnaute Nouveau
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.

Voilà une partie du code final (en pièce jointe).
 

Pièces jointes

  • Userform.xlsm
    20.7 KB · Affichages: 54

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

PEagle

XLDnaute Nouveau
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.
 

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
365
Réponses
6
Affichages
202

Statistiques des forums

Discussions
311 720
Messages
2 081 920
Membres
101 840
dernier inscrit
SamynoT