XL 2013 Remplissage d'un formulaire qui ajoute une ligne à un tableau - VBA

Ananas94

XLDnaute Junior
Bonjour,

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
 

Pièces jointes

  • etat_des_lieux_test.xlsm
    50.1 KB · Affichages: 15
Solution
Bonjour le fil, Anna

•>Anna
C'est bien cela: le Tag correspond au numéro de colonne.
01Anna.jpg


EDITION: Je viens juste de voir les nouvelles PJ.
Sauf qu'un classeur *.xlsx ne peut contenir de code VBA (donc d'Userform)

Ananas94

XLDnaute Junior
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 ? :)

Anna
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    62.2 KB · Affichages: 7

Staple1600

XLDnaute Barbatruc
Re

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
masque-a-gaz-steampunk--mw-132571-1.jpg


Je repasserai plus tard.
 

Ananas94

XLDnaute Junior
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
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, 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:
Private Sub CommandButton1_Click()
Dim CTRL As Control
Application.ScreenUpdating = False
[A1:F1] = "=""Colonne N°: ""&COLUMN()": [A1:F1].Font.Bold = -1: [A1:F1].Interior.Color = vbYellow
'(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)
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                                 '(*)
'(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)
Next
With [A1].CurrentRegion: .Value = .Value: .Columns.AutoFit: .Borders.Weight = 2: End With
Me.Hide
End Sub

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
Dans un module standard, colles le code ci-dessous
(il sert à afficher l'userform)
VB:
Sub Show_USF()
UserForm1.Show 0
End Sub
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)
;)
 

Ananas94

XLDnaute Junior
Bonjour,

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 !


A tout à l'heure !
encore merci !
anna
 

Ananas94

XLDnaute Junior
Bonjour Staple !

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
 

Ananas94

XLDnaute Junior
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


Je dis peut être n'importe quoi ..?
 

Ananas94

XLDnaute Junior
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.... :)
 

Ananas94

XLDnaute Junior
Re Re Re

j'ai oublié les pièces jointes :

-Nouveau_test = votre code dans un nouveau fichier excel
-etat_des_lieux_carto_test = le fichier de départ

mille mercis :)
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    52.6 KB · Affichages: 1
  • nouveau_test.xlsx
    7.5 KB · Affichages: 1

Ananas94

XLDnaute Junior
Re

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 formulaire
Private Sub UserForm_Initialize()

    Dim LO1 As ListObject
    Dim LO2 As ListObject
   Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    Dim j As Integer
    Dim nbOutils As Integer
    
    Set 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:
Private Sub CommandButton1_Click() 'Pour la mise hors application d'un outil


    Dim confirmation
    Dim i As Integer
    Dim 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 Me
    
End Sub

Lorsque je teste mon code, j'obtiens un message d'erreur :

1585558525729.png

Et lorsque je clique sur Débogage :

1585558563233.png


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 :

ComboBox1.ColumnCount = 1
ComboBox1.List() = LO1.ListColumns("Nom")

Est faux. Mais je ne vois pas comment l'améliorer.

Auriez-vous une petite idée?

Merci :)
Anna
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    56.9 KB · Affichages: 1

Discussions similaires

Réponses
7
Affichages
368

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote