VBA Excel 2003 : valeur cellule dans TextBox
Nospam54
Messages postés
152
Date d'inscription
Statut
Membre
Dernière intervention
-
Nospam54 Messages postés 152 Date d'inscription Statut Membre Dernière intervention -
Nospam54 Messages postés 152 Date d'inscription Statut Membre Dernière intervention -
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 !
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:
- VBA Excel 2003 : valeur cellule dans TextBox
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
5 réponses
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é]:
Cordialement,
Franck P
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
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...
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...
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
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
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/
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/
Essaye ceci peut être...
En passant, pour mettre du code dans ce forum, la balise à utiliser n'est pas italique (I) mais code : <>
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 : <>
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
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
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 :
Voir ce tutoriel pour la gestion des erreurs
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
Voici le lien contenant mon fichier... https://www.cjoint.com/?3JeqRz1ELdo
Merci par avance de tes tests
Merci par avance de tes tests
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 :
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
Cordialement,
Franck P
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
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 !
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 !
Bonjour,
Question multipage :
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
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 !
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 !
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!!!
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!!!