cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 déc. 2008 à 19:21
Salut
Par défaut, la méthode .Show est vbModal, c'est à dire que le code qui suit ne sera exécuté que lorsque la UserForm1 aura été fermée.
Si tu ne veux pas de ce blocage, ajoute vbModeless après le .Show
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
jagjag36
Messages postés5Date d'inscriptionsamedi 29 novembre 2008StatutMembreDernière intervention13 décembre 2008 10 déc. 2008 à 01:10
Merci pour ton information. En réalité je m'aperçois que le problème provient de l'intruction avant le Show Ma procédure est la suivante :
unload UserForm1
UserForm1.Show (0) que l'on doit pouvoir remplacer par USF1.Show vbModeless
Textbox1.Visible = False
En effet si on la supprime cela va normalement MAIS j'ai trouvé cette astuce pour charger tous les contrôles des valeurs ControlSource de la Feuil, (et ils sont près de 80). Je cherche donc une solution globale pour remplacer les dizaines de :
,
donc pouvoir transérer d'un coup toutes les valeurs de Feuille de calcul sur l'USF et vice-versa.( Y a-t-il une méthode plus élégante car celle-ci).
A la place du unload UserForm1 j'ai essayé UserForm1.Hide. Rien n'y fait et l'action n'a pas lieu. J'ai aussi essayé de renvoyer le "textebox1.visible = False"dans une sous procédure dépendant de celle-ci et comportant l'instruction txtUserForm1.value=Feuil!AA1 mais sans succès
En réalité c'est sur tout le problème du transfert automatique des données de la Feuill au formulaire contenant la cellule , d'une part, mais d'autre cas se sont présentés
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 10 déc. 2008 à 10:05
Re
Tu parles de "txtUserForm1.value=Feuil!AA1" : Tu es sous Excel ? (ta question porte sur vb.Net)
Méthode institutionnelle pour charger une forme :
Dim maForme As UserForm1
Set maForme = New UserForm1
Load maForme
With maForme
.maVariable1 = "Codes Sources"
.maVariable2 = "c'est super !"
.Show vbModal
MsgBox .maVariable1
MsgBox .maVariable2
End With
Unload maForme
Set maForme = Nothing
Dans la partie déclarations de la UserForm1, j'ai :
Public maVariable1 As String ' Public pour qu'elles soient visibles
Public maVariable2 As String ' depuis l'extérieur
dans le Form_Load :
maTextBox1.Text = maVariable1
maTextBox2.Text = maVariable2
dans le code du bouton Annuler
Me.Hide
dans le code du bouton Ok
maVariable1 = maTextBox1.Text
maVariable2 = maTextBox2.Text
Me.Hide
Il est nécessaire de passer par des variables internes puis de les transférer dans les objets comme TextBox afin de ne pas être embété si l'utilisateur fait Annuler au lieu de Ok --> Les Variables ne seront pas remises à jour si Annuler
Alors la réponse à ta question : Oui, il faut autant de ligne de transfert que de variables.
Maintenant, ce que tu peux faire, c'est stocker tes variables dans un Tableau et transférer le tableau en un seul coup.
Tu peux aussi dimensionner une variable "Type personnel" qui renfermera toutes tes données, genre
Type monType
maVariable1 As String
maVariable2 As String
maVariable3 As Integer
End Type
Dim mesVariables As monType
Il faudra, bien sûr, que ce bloc de variable soit défini de la même manière dans ton application et dans ta UserForm1
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
jagjag36
Messages postés5Date d'inscriptionsamedi 29 novembre 2008StatutMembreDernière intervention13 décembre 2008 13 déc. 2008 à 00:12
Merci Jack pour tes informations. N'étant pas très fortiche en vb je n'ai pas tout compris mais j'ai surtout retenu qu'il n'était pas possible d'utiliser une solution miracle pour transférer en une seule opération les données soit du UserForm vers la Feuil, soit l'inverse. (Alors que, selon "l'aide", j'avais compris que le transfert se faisait de manière automatique dans les 2 sens, c'est à dire sans action de l'utilisateur).
J'ai donc écrit une procédure comportant tous les contrôles, du style :
Sub Transfert_Feuil1_vers_UserForm()
textbox1.Value=Sheets("Feuil1").Range("A1")
combobox2.Value=Sheets("Feuil1").Range("B1")
etc
listbox12.Value=Sheets("Feuil1").Range("N1")
End Sub
et une autre faisant l'inverse
Sub Transfert_UserForm1_vers_Feuil1()
Sheets("Feuil1").Range("A1")=textbox1.Value
etc
Sheets("Feuil1").Range("N1") =listbox12.Value
End Sub
Selon besoin j'appelle l'une ou l'autre ce qui ralentit l'exécution (à chaque fois 50 lignes de prgm !) mais au moins solutionne mon problème de manière claire.
Je n'ai pas compris la solution du tableau. En tout cas merci de ton aide. Je ne sais si la solution trouvée est la meilleure mais j'ai pu aller de l'avant !