Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'ai un formulaire géant à faire remplir à des utilisateurs dans le but de remplir un tableau (géant lui aussi). Le but est que une fois ce formulaire rempli, une ligne s'ajoute en bas du tableau, et que le numéro associé s'incrémente à chaque fois.
Néanmoins, au moment de lancer la macro "insertion d'un outil", j'obtiens l'erreur suivante :"L'indice n'appartient pas à la sélection". Lors du débogage, la ligne "UserForm1.Show" est surlignée. Je ne comprends pas où est le problème.. Auriez-vous une idée ?
Vous trouverez en pièce jointe le document sous forme de test.
Je vous remercie par avance,
Excellente journée,
Anna
Mais c'est énorme ! en fait, je croyais que cette ligne s'occupait juste de la colonne "Numéro"! Par contre je ne comprends pas ce que signifie "-10" à la fin ...
je viens de rendre inactif mon petit système d'incrémentation des numéros à la fin mais rien n'y fait, ces numéros se placent toujours dans toutes les cases (sauf les check-box !). On dirait que l'ordinateur ne lit en fait que la première ligne de code dans la boucle with, et qu'il applique ça à tous les ".range() du code (donc toutes les cellules citées).
Je suis bloquée, je ne vois vraiment pas comment avancer cette fois. Pourriez-vous me donner un coup de pouce ? 🙂
Si on regarde ton code initial, on avait
.Range(i,2)=TextBox1
.Range(i,3)=TextBox2
etct...
Donc ce j'ai fait
.Range(i,2)=TextBox1 -< Tag du TextBox2 = 2
.Range(i,3)=TextBox2 -< Tag du TextBox2 = 3
etc...
Question: Est-ce que c'est ce tu as fait sur ton classeur?
Pas le temps de vérifier maintenant, je sors du confinement pour aller chercher quelques victuailles et autres marchandises. 😉
Faut juste que je retrouve mon masque full-secure
Ah le voici
Bonjour,
Je n'ai pas compris. Quand je remplace "Tag" par un numéro, je reçois un message d'erreur. Donc je dois me tromper. d'ailleurs, quand je regarde des autres modèles de code, je vois textboxZ.Tag. On ne remplace donc pas le mot "Tag" par un numéro.
en fait, un tag est le contenu d'une cellule de formulaire ?
Pourriez-vous préciser s'il vous plaît ? merci
Anna
•>Anna
[Précisons, précisons avec un petit exemple tout frais (sorti du four)] Dans un classeur vierge (qui servira de test illustratif), insère un Userform et ajoute y un CommandButton
puis colle le code ci-dessous dans le code de l'Userform
VB:
PrivateSub CommandButton1_Click()Dim CTRL As Control
Application.ScreenUpdating =False
[A1:F1] ="=""Colonne N°: ""&COLUMN()": [A1:F1].Font.Bold =-1: [A1:F1].Interior.Color = vbYellow
'(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)ForEach CTRL In UserForm1.Controls '(*)>If Len(CTRL.Tag)Then'(*)>>> C'est ce bout de code qui compte
Cells(2,CLng(CTRL.Tag))= CTRL.Value '(*)>EndIf'(*)'(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)NextWith [A1].CurrentRegion:.Value =.Value:.Columns.AutoFit:.Borders.Weight =2:EndWithMe.Hide
EndSubPrivateSub UserForm_Activate()Dim txtB1 As Control, i
For i =0To5Set txtB1 = Controls.Add("Forms.TextBox.1")With txtB1
.Name ="TextBox"& i:.Top =11* i *2.Value ="Staple_"&(1601+ i).Tag = i +1.AutoSize =TrueEndWithNext i
EndSub
Dans un module standard, colles le code ci-dessous
(il sert à afficher l'userform)
VB:
Sub Show_USF()
UserForm1.Show 0EndSub
Affiche alors l'userform en lançant Show_USF puis clique sur le CommandButton
J'attends tes commentaires et questions 😉
(Normalement avec ce petit exemple, tu dois comprendre à quoi me sert ici la propriété Tag des TextBox) 😉
je regarde ça de suite. Désolée de ne pas avoir répondu plus tôt mais je suis un peu pressée par le temps, ma hiérarchie me rappelle des échéances, et je suis assez pressée pour ce code aussi !
J'espère que vous allez bien. Ca y est, j'ai enfin u peu de temps pour me poser. C'était laborieux la semaine dernière.
Je viens de tester ce code sur un nouveau fichier excel.
Si l'on regarde le code ci-dessous :
For Each CTRL In UserForm1.Controls '(*)>
If Len(CTRL.Tag) Then '(*)>>> C'est ce bout de code qui compte
Cells(2, CLng(CTRL.Tag)) = CTRL.Value '(*)>
End If
Tag semble être une propriété intrinsèque à CTRL (bouton controle) qui est ici une variable (puisque c'est dans une boucle For Each).
Tag emmagasine des informations sur chaque bouton de "controle" du formulaire.
Exemple pour moi : le Tag des boutons "Impacts" stockent "OUI" ou "NON" à la place de "VRAI" ou "FAUX" (valeur par défaut).
J'espère n'avoir pas dit trop de bêtises. Merci pour votre patience.
Excellente journée,
Anna
En fait, Tag serait le numéro de colonne ?
Quand on étudie la seconde partie du code, le numéro de tag correspond au numéro de colonne:
Private Sub UserForm_Activate()
Dim txtB1 As Control, i
For i = 0 To 5
Set txtB1 = Controls.Add("Forms.TextBox.1")
With txtB1
.Name = "TextBox" & i: .Top = 11 * i * 2
.Value = "Staple_" & (1601 + i)
.Tag = i + 1
.AutoSize = True
End With
Next i
End Sub
C'est bon j'ai compris ! en fait, je n'avais rien à renommer ! en fait il fallait juste que je laisse tout en mode variable et du coup ça fonctionne 🙂
merci 🙂
Par contre du coup, le problème est (je reprends vos post numéros 12 et 13) que le contenu des TextBox n'est pas affiché; sauf pour les colonnes où l'on définit nous-même une valeur par défaut (les colonnes "Impacts" où les valeurs par défaut sont OUI ou NON.). Je cherche .... N'hésitez pas à m'aider.... 🙂
Ca fonctionne trop bien merci 🙂🙂
Oui je n'avais pas enregistré le classeur lorsque je l'ai testé chez moi, bref, l'exemple était très parlant, merci beaucoup.
Mais ce n'est pas tout à fait fini ! J'ai un autre problèmes:
Je souhaite désormais, avec une autre macro, supprimer un outil; c'est à dire que l'outil passe du tableau de l'onglet "Outils_utilises" à l'onglet "Outils_HA". J'ai codé quelque chose, avec un autre userform cette fois (userForm2).
Je rencontre plusieurs problème : tout d'abord je souhaite que l'utilisateur choisisse son outil dans la liste des outils qui sont actuellement dans le tableau "Outils_utilisés". néanmoins, cette liste doit être dynamique car des outils sont susceptibles d'avoir disparus/ été ajoutés, etc.. En fait, j'aimerais lister la colonne "noms" du tableau, mais mon code ne fonctionne pas :
VB:
'Pour le formulairePrivateSub UserForm_Initialize()Dim LO1 As ListObject
Dim LO2 As ListObject
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim j AsIntegerDim nbOutils AsIntegerSet Ws1 = Sheets("Outils_utilises")Set LO1 = Ws1.ListObjects("Tab_outils_utilises")Set Ws2 = Sheets("Outils_HA")Set LO2 = Ws2.ListObjects("Tab_outils_HA")'Nom de l'outil'
ComboBox1.ColumnCount =1
ComboBox1.List()= LO1.ListColumns("Nom")[B] 'Affichage de la colonne "Noms" [/B]'Date de mise hors application :'Me.Controls("TextBox3").Visible =True
J'ai tenté beaucoup de codes, notamment en code java (c'est parti trèèèès loin) ; sans succès !
Ensuite, une fois que la personne a sélectionné le nom de son outil, l'ordinateur doit chercher le nom de cet outil dans le tableau et couper-coller les valeurs du tableau correspondantes. J'ai sectionné cette grosse partie en plusieurs étapes que voici :
VB:
PrivateSub CommandButton1_Click()'Pour la mise hors application d'un outilDim confirmation
Dim i AsIntegerDim LO1 As ListObject
Dim LO2 As ListObject
Set Ws1 = Sheets("Outils_utilises")Set LO1 = Ws1.ListObjects("Tab_outils_utilises")Set Ws2 = Sheets("Outils_HA")Set LO2 = Ws2.ListObjects("Tab_outils_HA")
[U]'Etape 1 - L'ordinateur cherche l'outil dans la liste des outils[/U]'[U]Etape 2 - Insertion d'une ligne à la fin du tableau "Tab_outils_HA :"[/U]
Insertion = LO2.ListRows.Add(AlwaysInsert:=True)
[U] 'Etape 3 - Couper-coller des cellules du tableau "tab_outils_utilises" qui se trouvent en colonnes 2 à 7 :'[/U]
Ajout1 = LO1.ListRows(nom_outil).Cut.Range(i,2/7)
[U] 'Etape 4 :Collage de ces cellules dans la dernière ligne , dans les cellules 2 à 7 du tableau "Tab_outils_HA":'[/U]
LO1.ListRows.Paste LO2.ListRows.Range(i,2/7)
[U] 'Etape 5 - Copie des cellules du tableau "tab_outils_utilises" qui se trouvent en colonnes 8 à 25 :'[/U]
Ajout2 = LO1.ListRows(nom_outil).Cut.Range(i,8/25)
[U] 'Etape 6 - Collage de ces cellules dans la dernière ligne , dans les cellules 9 à 26 du tableau "Tab_outils_HA" :'[/U]
LO1.ListRows.Paste LO2.ListRows.Range(i,9/26)
[I] 'Message de confirmation'[/I]
confirmation = MsgBox(Prompt:="Outil inséré avec succès !", Buttons:=vbOKOnly, Title:="Ajout d'un outil réussi")Me.Hide
Unload MeEndSub
Lorsque je teste mon code, j'obtiens un message d'erreur :
Et lorsque je clique sur Débogage :
Le problème viendrait donc de la toute première étape, lorsque je souhaite afficher la liste (dynamique) des outils listés dans la colonne "Noms" du tableau. Je pense que mon code :
Re
mais la dernière fois, j'avais créé une nouvelle discussion et vous m'aviez dit de continuer
Enfin comme vous voulez , je crée une nouvelle discussion si vous le souhaitez.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD