Aide code textbox

Bonjour le forum,

J'ai dans un userform créé 349 text box.

Avec la fonction choose, je définis mes text box correspondant à mes colonnes.

Malheureusement la ligne de code est trop longue.

Comment puis-je "splitter" la ligne pour paramétrer mes 349 textbox avec mes colonnes ?

Merci

Bonjour,

Quelle patience si tu les as créés à la main !

Sans voir ta ligne de code trop longue ni ton fichier, je ne peux que te dire qu'avec une boucle tu n'as jamais de ligne de code trop longue...

Cordialement.

Hello MFerrand,

Oui mais si je n'utilise pas une boucle c'est que mes colonnes ne sont pas à la suite des autres. Si la textebox correspondait à la colonne1, la textebox2 à la colonne2 cela aurait été plus simple mais ce n'est pas le cas

Je te montre la tête du code avec les lignes rouges qui sont "trop longues":)

Option Explicit
Dim Ws As Worksheet

Private Sub MultiPage1_Change()

End Sub

'Pour le formulaire
Private Sub UserForm_Initialize()
Dim J As Long
Dim I As Integer
ComboBox2.ColumnCount = 1
ComboBox2.List() = Array("", "OK", "NOK")
ComboBox3.ColumnCount = 1
ComboBox3.List() = Array("", "OK", "NOK")

Set Ws = Sheets("plm") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBox1
For J = 2 To Ws.Range("O" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("o" & J)
Next J
End With
For I = 1 To 349
Me.Controls("TextBox" & I).Visible = True
Next I
End Sub

'Pour la liste déroulante Code client
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim I As Integer
Dim tb As Integer
Dim col As Integer
Dim photo As String
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2

For I = 1 To 349
    'Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
[color=#FF0000] tb = Choose(I, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349)[/color]

   [color=#FF0000] col = Choose(I, 10, 11, 12, 13, 14, 6, 7, 8, 20, 21, 25, 28, 103, 102, 9, 17, 18, 5, 4, 23, 24, 26, 27, 74, 78, 82, 86, 90, 75, 79, 83, 87, 91, 76, 80, 84, 88, 92, 94, 95, 96, 97, 98, 99, 100, 101, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403)[/color]
    Me.Controls("TextBox" & tb) = Ws.Cells(Ligne, col + 1)
Next I

On Error GoTo defaut
photo = ComboBox1.Value
Image1.Picture = LoadPicture("C:\Users\nifranco\Pictures\" & photo & ".jpg")

Exit Sub
defaut:
Image1.Picture = LoadPicture("C:\Users\nifranco\Pictures\Defaut.jpg")
End Sub

'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer
Dim tb As Integer
Dim col As Integer
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2

For I = 1 To 349
    'Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
    [color=#FF0000]tb = Choose(I, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349)[/color]

    [color=#FF0000]col = Choose(I, 10, 11, 12, 13, 14, 6, 7, 8, 20, 21, 25, 28, 103, 102, 9, 17, 18, 5, 4, 23, 24, 26, 27, 74, 78, 82, 86, 90, 75, 79, 83, 87, 91, 76, 80, 84, 88, 92, 94, 95, 96, 97, 98, 99, 100, 101, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403)[/color]

    Me.Controls("TextBox" & tb) = Ws.Cells(Ligne, col + 1)

End If
Next I
End If
End Sub

'Pour le bouton Quitter
Private Sub CommandButton1_Click()
Unload Me
End Sub

Je ne sais ce dont il est question, et je n'ai aucune envie de lire du code pas indenté ou mal !

De ce que je peux voir sans faire d'effort particulier, je dirais que introduire un élément chaîne vide dans une liste de Combo n'est jamais une bonne idée, et rendre visible tes 349 TextBox à l'ouverture est d'une absurdité inqualifiable : ils le sont visibles, à l'ouverture, par défaut, sauf si tu pousses le vice à les programmer invisibles par défaut pour le plaisir (dont je ne vois ce qu'il apporte) de les faire réapparaître !!!

Quant à tes listes de numéros... on évite de s'engager dans ce genre de guêpier ! On fait autrement, parce qu'il y a toujours moyen de faire autrement, alors on cherche comment et on trouve...

Je dirai déjà que 349 TextBox, j'aurais évité. Mais bon, je n'ai pas idée de l'objet de la réalisation, mais on peut toujours créer des conditions d'utilisation de boucles, et de plusieurs façons en général...

Quand on arrive à ce genre de complication, il faut se dire que l'on n'a pas conçu la chose comme il aurait fallu, et que le plus sage serait de reconcevoir la réalisation à zéro...

Cordialement.

On est pas tous des experts comme toi.

Quand on débute on fait avec ce que l'on comprend.

Bonne journée.

Tu prends pas la mouche ! et tu commences par constater que lorsqu'on formule une demande :

1) On expose succinctement ce que l'on souhaite faire afin de donner une idée d'ensemble aux intervenants de ce dans quoi ils vont "patauger"...

2) On précise le problème ou les difficultés rencontrées en donnant les éléments utiles, mais en évitant autant que possible de vouloir à tout prix induire une idée préconçue de la solution (ceci dit les intervenants sont en principe assez aguerris pour ne pas se laisser pousser dans des impasses...)

3) On fournit un fichier, à la fois illustration du problème et de l'objectif, et document de travail pour chacun, qui lorsqu'il s'agit de VBA permet de voir le contexte d'exécution du code (qui peut avoir autant d'effet sinon plus que le code lui-même...)

Quand tu ne fournis rien ou pas l'essentiel, tu ne peux attendre en retour plus que des remarques à caractère général...

En ce qui me concerne, si tu me montres un code non indenté, je le dis toujours, c'est un handicap notable pour une lecture rapide et correcte, et (selon mon humeur du jour) je signale éventuellement que je n'irai pas plus loin. Aucune notion d'expertise là-dessous, indenter est à la portée de tous (apprentissage rapide, même si chacun [parmi ceux qui indentent systématiquement] n'est pas attaché à des règles uniques d'indentation, lorsqu'une indentation rigoureuse est appliquée, cela se sent dans tous les cas à la lecture). Je considère qu'une fois informé, quelqu'un qui continue de me présenter un code non indenté ne se soucie pas de la signification du code qu'il écrit (ou reproduit)...

Il y a d'autres remarques qui relèvent de la même orientation, notamment tous les éléments qui dénotent des fragments de code enregistrés et non réécrits, qu'on n'a donc nullement cherché à comprendre et à maîtriser...

Il y a enfin nombre d'éléments qui ne relèvent aucunement de VBA ! Donc pas question d'expertise à leur propos ! Exemples des formules de plusieurs lignes, une multiplication de contrôles qu'il va falloir gérer, des systèmes alambiqués qui font apparaître qu'on est en train (si ce n'est déjà fait) de s'engluer dans un labyrinthe... Là, je dis : quand ça commence à prendre cette allure, on stoppe tout et on réfléchit ! Simple question de bon sens : il faut s'assurer la maîtrise de ce qu'on réalise, du début à la fin autant que possible, et ça cela se règle à la conception, avant la première ligne de code... alors quand le projet se fourvoie, on reprend en chantier la conception, car c'est d'abord là que se trouve l'"erreur".

Après, on peut te dire que tout le reste s'apprend ! Et point par point, on peut apprendre à surmonter tout problème : si une boucle est plus pratique, il convient de se dire qu'il y a toujours moyen de faire une boucle, et si nécessaire on ira en amont créer les conditions pour que ce soit réalisable. Il y a toujours une diversité de solutions, c'est l'objet de la discussion d'en faire apparaître, cela fait partie de l'apprentissage, et s'il est sûr qu'il est préférable d'adopter des solutions que l'on comprend et maîtrise (nul ne peut d'ailleurs se targuer de tout maîtriser), il faut mettre à profit les difficultés rencontrées pour accroître le nombre de cordes à son arc...

Il reste cependant acquis que la grande majorité des problèmes rencontrés relèvent de la conception, et pour construire des choses simples et fonctionnelles, c'est surtout à ce niveau que cela se joue. Et à ce niveau, économie générale du processus qu'on veut mettre en place, la connaissance de VBA, ne peut tout au plus que permettre d'anticiper un peu comment on s'y prendra ensuite pour le faire, ce qui est négligeable : on trouvera toujours ensuite la méthode pour réaliser telle ou telle fonctionnalité, mais la façon dont on l'a conçue avant, VBA n'y pourra rien...

Cordialement.

Re bonjour,

Pour commencer, si "indenter" est à la portée de tous, encore faut il avoir le temps d'apprendre une méthode. Je n'en ai pas (encore) donc il est vrai que j'indente à l'emporte pièce.

Je le répète mais lorsque l'on est débutant et que l'on n'a pas le temps de s'y plonger un peu tous les jours pour apprendre ce langage (car c'est bien comme ça qu'on apprend une langue: en pratiquant tous les jours), c'est vite compliqué. D'où mes posts sur le forum.

Il est hélas difficile de progresser donc je récupère des brides de codes trouvés sur le forum pour répondre au mieux à mes besoins.

De plus je ne suis pas sur le forum pour recevoir des commentaires désagréables de la part de membres "passionés d'Excel" (vu que tu n'aimes pas le mot "expert" ) du style "rendre visible tes 349 TextBox à l'ouverture est d'une absurdité inqualifiable"

Je t'accorde le fait que pour un fois je n'ai pas mis en ligne de fichier, mille excuses.

Je réitère ma problématique si cela était mal expliqué:

Je souhaite créer un formulaire de saisie pour des utilisateurs.

Ce formulaire contient beaucoup d'attributs liés à la contrainte d'affichage de la page matrice tailles/coloris.

J'ai essayé de représenter au mieux ce formulaire en créant un userform (le userform3).

La difficulté étant que pour la même base de données, je souhaite créer différents formulaires.

J'ai donc commencé à créer le premier mais je suis bloqué par rapport au nombres important d'attribut

Je joins le fichier, en espérant avoir été plus clair.

N'exagérons pas les temps d'apprentissage... L'indentation ne réclame pas des mois d'apprentissage, ce qui doit s'apprendre à cet égard prend quelques minutes, et ensuite quand on constate le temps gagné à la lecture du code, ce n'est plus une astreinte !

Quand on a passé au crible une fois la fenêtre de propriétés de quelques contrôles, on prend vite l'habitude de commencer par là pour faire ses réglages par défaut...

Je veux bien croire aussi que mes remarques puissent être désagréables, je n'en fais pas pour être agréable. Si elles provoquent un sursaut aboutissant à ce que le phénomène visé soit rectifié dans le bon sens, ce ne sera pas une désagréabilité inutile, et c'est l'intéressé qui en sera le premier bénéficiaire... Sinon j'aurais simplement fait partager ma mauvaise humeur à une lecture ou une vision de choses inutiles parfaitement évitables.

Mais ne nous attardons pas plus !

Si tu n'exposes pas les grandes lignes de ton projet, et le fonctionnement prévu sur les points qui posent problème, je doute qu'un intervenant trouve opportun de passer des heures à reconstituer ce que tu as omis de dire au départ...

D'un point de vue technique :

- l'urgence est de supprimer tous les doublons de procédure du module Userform, il est inexploitable tant que ce n'est pas fait.

Bien évidemment, on ne peut faire coexister des procédures de même nom dans un module, mais les procédures évènementielles par définition sont uniques.

A cet égard, je conseille vivement d'éviter d'écrire les déclarations de telles procédures, mais de le faire faire par VBA, en sélectionnant le contrôle, puis l'évènement (et effacer la déclaration de procédure par défaut mise à la sélection du contrôle si ce n'est pas celle-la qu'on utilise). Et les laisser là où VBA les met, on les retrouvera plus facilement.

- Choose est évidemment inadéquat, la fonction CHOISIR accepte 254 choix et tu veux en coller considérablement plus...

Lorsqu'on utilise une fonction, il n'est jamais inutile de vérifier sa syntaxe et ses conditions d'utilisation, c'est à cela que l'aide sert, et efficacement, aussi dès qu'on a un doute ou à la première difficulté, c'est par là qu'on doit commencer (c'est un conseil, et à la portée de tous).

Par ailleurs je ne pense pas que l'utilisation d'une fonction de feuille de calcul soit une solution adéquate dans le contexte d'un Userform, mais pour proposer quelque chose qui convient il faut d'abord avoir compris ce qui est à définir ainsi et qui ne le serait pas à partir des sélections faites par l'utilisateur...

Autre conseil : il est toujours judicieux de renommer ses contrôles, c'est la première chose à faire. Pour s'y retrouver plus vite, surtout quand on en a beaucoup, pour en faire des séries qu'on peut parcourir en boucle (justement !), et aussi pour raccourcir un peu les noms, toujours longs quand on doit les écrire.

Cordialement.

Rechercher des sujets similaires à "aide code textbox"