VBA Excel 2003 : valeur cellule dans TextBox

Nospam54 Messages postés 159 Statut Membre -  
Nospam54 Messages postés 159 Statut Membre -
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 !

5 réponses

Résumé de la discussion

Le problème central concerne l’alimentation des TextBox d’un UserForm à partir des valeurs nommées définies dans la feuille, après la sélection d’un nom via une ComboBox et le chargement de l’enregistrement correspondant. Plusieurs réponses indiquent d’assigner TextBox.Text avec la valeur de la cellule nommée, et d’utiliser des événements de la ComboBox pour déclencher le transfert des données dans l’ordre pertinent. D’autres échanges portent sur le formatage automatique des montants (séparateur de milliers, virgule ou point) et sur la préservation des paramètres lors de la navigation entre onglets MultiPage. En complément, certains évoquent l’utilisation de fonctionnalités externes comme Equiv/Match et mentionnent que des compléments Excel peuvent influencer la saisie numérique, ce qui peut nécessiter une approche plus robuste.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. Nospam54 Messages postés 159 Statut Membre 13
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      peux tu copier/coller tout ton code ici dans une réponse?
      0
  3. Nospam54 Messages postés 159 Statut Membre 13
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  4. Nospam54 Messages postés 159 Statut Membre 13
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      t'es déjà rentré?
      Eh ben c'est du beau....... ;-)
      0
    3. Nospam54 Messages postés 159 Statut Membre 13
       
      Nan, nan !
      Le serveur du boulot daigne enfin fonctionner convenablement... pfff
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    1. Nospam54 Messages postés 159 Statut Membre 13
       
      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
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    3. Nospam54 Messages postés 159 Statut Membre 13
       
      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
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    5. Nospam54 Messages postés 159 Statut Membre 13
       
      * 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