Récupération de valeur - Cellule/TextBox

Bonjour,

Je suis actuellement en train de créer un petit logiciel contenant des bases de données et permettant différents calculs.

Je joins un exemple permettant de mieux comprendre ma demande :

J'ai trois feuilles ("Compteurs"), ("Théorie"), ("Résultats").

Dans la feuille "Résultats" se trouve un bouton qui ouvre un userform avec une liste déroulante et 5 Textbox.

La liste déroulante récupère la liste d'armoire de la feuille ("Compteurs") et lorsque l'on choisi une armoire, on retrouve dans les TextBox 1, 2, 3 et 4 les valeurs qui correspondent à la feuille ("Compteurs")

Cependant, pour la TextBox 5, je souhaite récupérer la valeur correspondant à la puissance de la feuille "Théorie" mais mon programme tel qu'il est aujourd'hui ne fonctionne pas puisqu'il récupère la valeur correspondant à la ligne et non à l'armoire choisie.

Me.TextBox5.Text = Sheets("Théorie").Cells(Ligne, 4)

J'espère que mes explications sont assez claires.

L'idéal étant de pouvoir avoir un code équivalent à une rechercheV au lieu d'une recherche par ligne tel que j'ai pour le moment.

Je vous remercie d'avance !

24exemple.xlsm (26.30 Ko)

Bonsoir,

Je suis dubitatif ! 8) Tu es apparemment débutant en VBA, tout au moins c'est ce que dénote ton code.

Tu donnes l'impression de vouloir travailler en VBA de la même façon que tu opères avec Excel, soit essayer de faire des formules, copier-coller, etc. Or VBA met à ta disposition des moyens que ne te donne pas Excel ! C'est tout un état d'esprit à créer pour se mettre en situation de l'utiliser efficacement, et de combiner les avantages d'Excel avec ceux de VBA. Dès lors qu'il est justifié d'utiliser VBA, c'est une erreur de penser agir en VBA comme tu le ferais devant ta feuille et d'essayer de reproduire de la procédure manuelle automatisé. Il faut plutôt penser comment ferais-je si je n'avais pas Excel et tu vas découvrir que VBA t'offre des outils pour le faire comme tu le penses, que c'est enfantin comme façon de procéder, mais prodigieusement efficace, genre je veux savoir combien j'ai de billes rouge et de billes bleu, eh bien je les compte une par une, ça a l'air long, mais c'est ce qui sera le plus rapide avec VBA, et puis les comptant je les laisse pas à leur place, je les sors, je me les compte et trie en dehors d'Excel, et toute les manipulations se feront plus rapidement. De façon générale, une opération optimale consiste à prélever tous les éléments dont on a besoin dans Excel, à faire tout ce que l'on doit hors Excel, et reposer dans Excel le tout réorganisé à la fin.

Cela n'a pas l'air d'avoir de rapport avec ton problème, et c'est à la fois un peu généralisé et à peine ébauché, il faudrait de longs développements... Mais tu vas voir par rapport à ta problématique :

D'abord tu as sorti tes armoires pour les lister dans un ComboBox. Très bien, ta méthode les liste de façon ordonnée, donc tu sais immédiatement où est chaque armoire, et au lieu de chercher à composer une formule, à la sélection dans la Combo, tu peux aller directement à :

Ligne = ComboBox1.ListIndex + 2

Il faut cependant prévoir le cas que aucun choix n'a été fait, ou qu'on l'a défait, dans ce cas ListIndex = -1 et Ligne = 1. Ligne n'est donc valide que si >=2, il faut le tester.

Mais pour pouvoir travailler plus efficacement, si préalablement tu as nommé tes plages, tu peux y accéder plus vite pour des prélèvement ou des affectations (ça c'est un travail préalable dans Excel, qui se conserve et dont va pouvoir bénéficier VBA :

plage nommée Compteur (A2:A7, à nommer en dynamique et tu n'as plus à y retoucher). Même chose pour la théorie, tu nommes Armoire (A2:A21, en dynamique toujours... ça se fait avec la fonction DECALER). Tu as donc 2 plages nommées, la ligne d'en-tête est exclue (donc Ligne sera alors ListIndex +1) et en ce qui concerne Armoire tu as une série d'armoires numérotées dont le numéro correspond à la ligne de la plage !

Et en ce qui concerne Compteur, la plage correspond à ta liste de la Combo tu peux donc la mettre "en dur" en RowSource (dans la mesure où tu n'as nul besoin de la dissocier de la Combo) et plus besoin d'initialiser !

Je fais une petite pause avant de poursuivre.

Voilà, une fois que tu as testé, tu extrais ton numéro d'armoire choisie, qui te donne la ligne où tu trouveras ta puissance téhorique.

Puis tu affectes tes TextBox, ils se suivent c'est bien, tes colonnes de prélèvement aussi donc : premier réflexe en VBA = réflexe boucle ! On peut quasiment toujours en faire et si nécessaire il faut préparer le terrain en amont. Quand on n'as que des éléments ne pouvant constituer une série numérique, on en fait un tableau pour pouvoir boucler...

Dis-toi toujours que du code sans boucles ni tableaux, c'est que tu n'as pas vraiment utilisé VBA !

Private Sub ComboBox1_Change()
    Dim Ligne&, a&, i%
    Ligne = ComboBox1.ListIndex + 1
    If Ligne > 0 Then
        a = Val(Replace(ComboBox1.Value, "Armoire", ""))
        With [Compteur]
            For i = 1 To 4
                Controls("TextBox" & i).Value = .Cells(Ligne, i + 1)
            Next i
        End With
        TextBox5.Value = [Armoire].Cells(a, 4)
    Else
        For i = 1 To 5
            Controls("TextBox" & i).Value = ""
        Next i
    End If
End Sub

Il y aurait encore un bon petit chapitre à faire sur le renommage des contrôles et les noms de variables...

Mais ce sera pour une autre fois.

Bon weekend.

Bonjour,

Tout d'abord merci pour avoir pris le temps de me répondre !

Effectivement je débute en VBA et je suis conscient que la plupart du code que j'utilise n'est pas forcément très adapté.

Si tu voyais actuellement l'intégralité de mon code pour le logiciel que je met en place, je pense que tu te gratterais un peu la tête pour savoir ce que j'ai voulu faire et qu'il y aurait très certainement beaucoup de changements à faire pour simplifier tout ça.

Bien qu'il me permet de faire ce que je souhaite, il est vrai que le regard d'un expert me serais bien plus bénéfique et je pourrais au moins comprendre les bases et utiliser les meilleurs procédés.

Avec les forums, j'arrive à trouver des solutions à mes problèmes mais la plupart du temps sans comprendre véritablement la démarche du code et qui parfois n'est pas adapté à l'intégralité de mon programme.

A force de faire, il arrivera sans doute un jour où j'utiliserais le VBA plus efficacement !

En tout cas je te remercie pour tes renseignements, j'ai pu résoudre mon problème une nouvelle fois !

Bonsoir,

et merci de ton retour.

Effectivement je débute en VBA et je suis conscient que la plupart du code que j'utilise n'est pas forcément très adapté.

Honnêtement, cela a été un composant de ma surprise car dans un sujet précédent que j'ai suivi (sans intervenir je crois) je n'avais pas repéré des réactions de débutant !

Si tu voyais actuellement l'intégralité de mon code pour le logiciel que je met en place, je pense que tu te gratterais un peu la tête pour savoir ce que j'ai voulu faire et qu'il y aurait très certainement beaucoup de changements à faire pour simplifier tout ça.

On a tous été débutants, moins débutants, etc. et le code que j'écris aujourd'hui n'est pas exactement pareil que celui que j'écrivais il y a 5 ans, qui était déjà quelque peu différent de celui que j'écrivais il y a 10 ans, et je laisse mon code d'il y a 20 ans de côté...

Si ça fonctionne, c'est quand même l'essentiel. Et quand il sera temps de réviser, tu seras en mesure de le penser autrement, et il est toujours plus simple de repartir sur des base neuves que vouloir amender un code existant (ce qui n'empêche pas de réutiliser des morceaux intégrables dans ta nouvelle approche).

Cordialement et bonne continuation.

Rechercher des sujets similaires à "recuperation valeur textbox"