VBA Excel 2003 : valeur cellule dans TextBox

Fermé
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 - 4 oct. 2011 à 13:10
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 - 13 oct. 2011 à 16:49
Bonjour,

Débutant en VBA Excel, je ne parviens pas à récupérer dans un TextBox le contenu de cellules nommées.

Je m'explique :

J'ai une feuille de calcul contenant une base de données (Nom, Index, Adresse, ...)
Mon application VBA contient un UserForm permettant de visualiser un enregistrement en sélectionnant le nom via une ComboBox.
Le changement dans cette ComboBox (Private Sub Cbx_Frn_Nom_change()) déclenche la recherche de l'enregistrement dans ma feuille puis nomme chaque cellule (nom, index, adresse1, adresse2, CP, Ville). Jusque là tout va bien.
Ensuite, je souhaite que les infos contenues dans ces différentes cellules nommées alimentent les TextBox dans mon UserForm en faisant appel au nom donné à chacune des cellules.
Ma question est sans doute "bête" et la réponse très basique, mais... comment faire ?


Merci d'avance pour vos réponses !



A voir également:

5 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 13:32
Bonjour,
Il n'est pas utile de nommer vos cellules.
Au changement de valeur de la combobox, il suffit d'aller chercher le n° de la ligne ou se trouve la valeur, et de renvoyer le contenu des cellules voisines dans les textbox.
Un peu comme ceci [Code non testé]:
Private Sub Cbx_Frn_Nom_change()
Dim Lign As Long
'évite l'erreur de la méthode find si la combobox est vide.
If Cbx_Frn_Nom = "" Then Exit Sub
With Sheets("Feuil1") 'A ADAPTER mettre ici le nom de la feuille ou vous cherchez vos valeurs
    'A ADAPTER Columns(1) va chercher dans la colonne A le contenu de la Combo
    Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom).Row
    Me.TextBox1 = .Cells(Lign, 2) 'textbox1 = contenu colonne B
    Me.TextBox2 = .Cells(Lign, 3) 'textbox2 = contenu colonne C
    'etc...
End With
End Sub
--
Cordialement,
Franck P
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
4 oct. 2011 à 14:50
Merci Franck !

Petit souci tout de même... Cependant ça bloque à "Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom).Row"
Message d'erreur = "Erreur d'exécution 91:
Variable objet ou variable de bloc White non définie
"

D'où ce la peut-il venir sachant que j'ai bien vérifié toutes les lignes de commande ?

Merci d'avance...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 14:55
peux tu copier/coller tout ton code ici dans une réponse?
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
4 oct. 2011 à 15:00
Pas de souci, le voici :

Private Sub Cbx_Frn_Nom_change()
'
Dim Lign As Long
'
Windows("Tab_Saisie_Facture.xls").Activate
Sheets("Listes").Select
'
' Evite l'erreur de la méthode find si la combobox est vide.
If Cbx_Frn_Nom = "" Then Exit Sub
'
With Sheets("Listes")
Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom).Row
Me.Cbx_Frn_Code = .Cells(Lign, 2)
Me.Zt_Frn_Index = .Cells(Lign, 3)
Me.Zt_Frn_Adr_Num = .Cells(Lign, 5)
Me.Zt_Frn_Adr_Voie = .Cells(Lign, 6)
Me.Zt_Frn_Adr_Compl = .Cells(Lign, 7)
Me.Zt_Frn_Adr_BP = .Cells(Lign, 8)
Me.Zt_Frn_Adr_CP = .Cells(Lign, 9)
Me.Zt_Frn_Adr_Ville = .Cells(Lign, 10)
End With
End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 15:05
Je ne vois aucune erreur dans ce code...
Essaye de remplacer (sans conviction), les 2 Cbx_Frn_Nom du code par Cbx_Frn_Nom.Value...
Sinon, peux tu nous passer une copie de ton classeur, sans données confidentielles, au format Xl97-2003 (.xls) via : https://www.cjoint.com/
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 15:22
Essaye ceci peut être...
Private Sub Cbx_Frn_Nom_change() 
Dim Lign As Long 

' Evite l'erreur de la méthode find si la combobox est vide. 
If Cbx_Frn_Nom = "" Then Exit Sub
With WorkBooks("Tab_Saisie_Facture.xls").Sheets("Listes")
    Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom).Row 
    Me.Cbx_Frn_Code = .Cells(Lign, 2) 
    Me.Zt_Frn_Index = .Cells(Lign, 3) 
    Me.Zt_Frn_Adr_Num = .Cells(Lign, 5) 
    Me.Zt_Frn_Adr_Voie = .Cells(Lign, 6) 
    Me.Zt_Frn_Adr_Compl = .Cells(Lign, 7) 
    Me.Zt_Frn_Adr_BP = .Cells(Lign, 8) 
    Me.Zt_Frn_Adr_CP = .Cells(Lign, 9) 
    Me.Zt_Frn_Adr_Ville = .Cells(Lign, 10) 
End With 
End Sub


En passant, pour mettre du code dans ce forum, la balise à utiliser n'est pas italique (I) mais code : <>
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
4 oct. 2011 à 15:53
Super ta réactivité, pijaku !

J'ai essayé la seconde méthode, même message d'erreur...

Je joindrai donc mon fichier via Cjoint.com. Pour le moment la mise en place du lien ne fonctionne pas (problème de serveur du boulot semble-t-il). Je ferai donc cela ce soir depuis chez moi (ça marche mieux qu'à la boite !).

Petit détail quand même : ton code a fonctionné... Mais, mais j'ai glissé un "On error Goto" au cas où l'utilisateur entre un nom inexistant. En le lançant le code bouclait et je n'avais plus la main. J'ai donc fait un Ctr+Alt+Suppr... N'ayant pas sauvegardé (eh oui...), j'ai entré à nouveau le code et là... marche plus !
Ça a son importance ?

En attendant...

Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
Modifié par pijaku le 4/10/2011 à 16:00
1- quand tu n'as plus la main, avec VBA, la manip à faire est : CTRL+Pause (du côté de Impr Ecran)
2- On error Goto pourquoi pas...
Comme ceci :
Private Sub Cbx_Frn_Nom_change()  
Dim Lign As Long  
On Error goto Faute 
' Evite l'erreur de la méthode find si la combobox est vide.  
If Cbx_Frn_Nom = "" Then Exit Sub 
With WorkBooks("Tab_Saisie_Facture.xls").Sheets("Listes") 
    Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom).Row  
    Me.Cbx_Frn_Code = .Cells(Lign, 2)  
    Me.Zt_Frn_Index = .Cells(Lign, 3)  
    Me.Zt_Frn_Adr_Num = .Cells(Lign, 5)  
    Me.Zt_Frn_Adr_Voie = .Cells(Lign, 6)  
    Me.Zt_Frn_Adr_Compl = .Cells(Lign, 7)  
    Me.Zt_Frn_Adr_BP = .Cells(Lign, 8)  
    Me.Zt_Frn_Adr_CP = .Cells(Lign, 9)  
    Me.Zt_Frn_Adr_Ville = .Cells(Lign, 10)  
End With  
Exit Sub 
Faute: 
MsgBox "La saisie dans la liste est obligatoire. Il convient de ne pas y ajouter d'autres noms" 
End Sub


Voir ce tutoriel pour la gestion des erreurs
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
4 oct. 2011 à 16:44
Voici le lien contenant mon fichier... https://www.cjoint.com/?3JeqRz1ELdo

Merci par avance de tes tests
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 16:49
t'es déjà rentré?
Eh ben c'est du beau....... ;-)
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
4 oct. 2011 à 16:54
Nan, nan !
Le serveur du boulot daigne enfin fonctionner convenablement... pfff
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
4 oct. 2011 à 17:03
Ouais c'est ce qu'on dit!!!
Bon en colonne A, tu as quoi?
Des valeurs? Des formules?
Des formules!! Ahhhh!!!!
Donc il manque un paramètre à la méthode Find.
Ce paramètre est : Regarde dans les valeurs. En VBA : Lookin:=XlValues.
Comme ceci :
Private Sub Cbx_Frn_Nom_change()
'
Dim Lign As Long
'On Error GoTo Erreur
' Evite l'erreur de la méthode find si la combobox est vide.
If Cbx_Frn_Nom = "" Then Exit Sub
    With Workbooks("Saisie_Pièce_Cpta.xls").Sheets("Listes")
        Lign = .Columns(1).Cells.Find(Cbx_Frn_Nom, LookIn:=xlValues).Row
        Me.Cbx_Frn_Code = .Cells(Lign, 2)
        Me.Zt_Frn_Index = .Cells(Lign, 3)
        Me.Zt_Frn_Adr_Num = .Cells(Lign, 5)
        Me.Zt_Frn_Adr_Voie = .Cells(Lign, 6)
        Me.Zt_Frn_Adr_Compl = .Cells(Lign, 7)
        Me.Zt_Frn_Adr_BP = .Cells(Lign, 8)
        Me.Zt_Frn_Adr_CP = .Cells(Lign, 9)
        Me.Zt_Frn_Adr_Ville = .Cells(Lign, 10)
    End With
'Exit Sub
'Erreur:
'MsgBox "La saisie dans la liste est obligatoire. Il convient de ne pas y ajouter d'autres noms"
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
Modifié par pijaku le 12/10/2011 à 09:09
Salut,
Il est possible de "grouper" les codes. C'est ce que je te disais lorsque je t'ai dit que mon code n'était pas du tout optimisé.
Cependant, pour cela, il faudrait que tu nous communique ton classeur afin de voir quels sont les contrôles utilisés.

Un exemple de textbox "numérique" avec :
- séparateur de milliers
- saisie d'une virgule (celle du pavé numérque, donc le point en fait!) et d'une seule
- possibilité de saisie d'un signe - uniquement en premier caractère
- le remplacement du point par la virgule pour permettre le calcul dans un textbox2

Sources, l'excellet tuto de Didier Gonard

Code :
Private Sub TextBox1_Change() 
TextBox1 = Format(TextBox1, "# ##0") 
End Sub 

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
TextBox2 = Replace(TextBox1, ".", ",") 
End Sub 

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
If InStr("1234567890.-", Chr(KeyAscii)) = 0 Or TextBox1.SelStart > 0 And Chr(KeyAscii) = "-" _ 
Or InStr(TextBox1.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0 
End Sub

Cordialement,
Franck P
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
13 oct. 2011 à 09:59
Bonjour,

Et merci pour ce bout de code. D'autre part, j'ai parcouru le tuto de Didier Gonard et y ai trouvé pas mal de choses intéressantes pour l'immédiat et l'avenir de mon appli !
Je lui avais d'ailleurs déjà "piqué" quelques astuces...

Je peaufine en ce moment les points que j'avais laissés un peu en suspens...

Donc, un autre problème rencontré :
Mon UserForm contient un MultiPage. L'un des onglets de ce MultiPage sert à rentrer et/ou à modifier les paramètres de l'application. Lorsque je sélectionne celui-ci je veux que le programme garde en mémoire les différents paramètres actuels pour que, si l'utilisateur en a changé certains mais qu'il ne valide pas les changements, les anciens paramètres soient conservés.
Si coder pour mettre en mémoire les paramètres initiaux ne semble pas trop compliqué, je ne parviens pas à déclencher l'action à la sélection de l'onglet en question...
Si j'utilise le code "Private Sub MultiPage1_Change()", bien évidemment à chaque changement dans le MultiPage, il lance l'action. Ce qui ne me semble pas très... économique même si c'est transparent.
Je cherche donc la syntaxe pour que l'action de mise en mémoire ne se fasse qu'à la sélection de cet onglet en particulier...
Je ne sais pas si je suis bien clair, mais vois-tu une réponse à cela ?

Ce dont je te remercie par avance !

Dès que j'aurais terminé ce qui est en cours, je me permettrai donc de te faire parvenir mon classeur pour que tu vois là où j'en suis et, éventuellement, m'apporter ton opinion...

A bientôt !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
13 oct. 2011 à 10:05
Bonjour,
Question multipage :
Private Sub MultiPage1_Change()
'si la page concernée est la Page1 :
If Me.MultiPage1.SelectedItem.Index = 0 Then MsgBox "Coucou"
'si la page concernée est la Page2 :
'If Me.MultiPage1.SelectedItem.Index = 1 Then MsgBox "Coucou"
'si la page concernée est la Page3 :
'If Me.MultiPage1.SelectedItem.Index = 2 Then MsgBox "Coucou"
'etc...
End Sub
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
13 oct. 2011 à 14:11
C'est encore l'emm...eur ! ;-)
Merci pour l'exemple sur le chargement d'un onglet multipage...

Ok, maintenant je parviens sur ma page "Paramètres" et en modifie certains.
En cliquant sur le bouton "Valider", je veux récupérer les nouvelles données entrées et les mettre en dur dans le Text ou Value du TextBox modifié.
J'ai essayé de multiples façons... ça veut pô...
Si je fais le test avec un messagebox, il me retourne bien la nouvelle donnée, mais je ne parviens pas à la mémoriser dans les paramètres du TextBox.
Tu vois ce que je veux dire ?

En tout cas, quand j'aurais terminé cette appli, je pense que j'aurai fait un sacré tour du VBA !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
13 oct. 2011 à 14:27
Tu vois ce que je veux dire ?
Oui mais je ne peux rien faire pour t'aider si tu ne m'en dit pas plus....
je veux récupérer les nouvelles données entrées Entrées ou? dans quoi?
et les mettre en dur dans le Text ou Value du TextBox modifié. Quel Textbox?

Tu sais, tu es le seul à disposer de ton appli...

En tout cas, quand j'aurais terminé cette appli, je pense que j'aurai fait un sacré tour du VBA ! Je ne voudrais pas être pessimiste, mais oh que non!!!
0
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 13
13 oct. 2011 à 16:49
* sourire *
Alors restons optimistes !
Bon... je finis ce que je peux faire (et qui fonctionne) et je t'envoie le classeur en te précisant ce qui me bloque...

A bientôt
0