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)

Staple1600

XLDnaute Barbatruc
Re

1) Si j'étais moi, je ferai ceci
' Impacts '
Me.Frame1.Controls("OptionButton3").Visible = True
Me.Frame1.Controls("OptionButton4").Visible = True
Me.Frame1.Controls("OptionButton5").Visible = True
et cela
'Pour le formulaire
Private Sub UserForm_Initialize()
Set Ws = Insertion_outils 'Onglet concerné
Sans oublier ceci
Set LO = Insertion_outils.ListObjects("Tab_outils_utilises")
Je te laisse chercher les autres choses qui coincent
(comme par exemple des noms de feuilles dans le code qui n'existent pas dans ton fichier exemple)
 

Ananas94

XLDnaute Junior
Bonjour !

Merci beaucoup pour votre aide, il est vrai que j'avais fait des erreurs vraiment bêtes..
J'ai corrigé, et désormais, mon formulaire apparaît, je suis contente.

Néanmoins, il y a encore un problème lors de l'insertion de l'outil en lui-même. En effet, si j'écris un nom d'outil en exemple, et que je clique directement sur "insertion outil", j'obtiens le message d'erreur suivant : Variable objet ou variable de bloc With non définie". Le débogage me désigne le bloc With, où l'on remplit le tableau. Néanmoins, je ne vois pas où ets le problème puisque le seul objet utilisé dans le bloc with est le tableau en lui-même (désigné sous le nom LO comme listObject). Ainsi, je ne vois pas où est l'erreur.

Par ailleurs, j'ai voulu insérer un calendrier pour deux textBox (correspondants aux critères du formulaire "Date mise à jour" et "date V1".
Lorsque j'essaye de sélectionner une date du calendrier, j'obtiens le message d'erreur suivant :"Impossible d'afficher une feuille non modale lorsqu'une feuille modale est affichée".
Je pense qu'il y a un problème avec mes témoins booléens, mais j'ai bien relu et je ne vois pas où est le problème...

Auriez-vous une idée de solution pour ces deux problèmes ? :)
Merci !

Excellente journée,

Anna
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    52.7 KB · Affichages: 4

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Anna

•>Anna
Il restait quelques corrections... :rolleyes:
Enrichi (BBcode):
Private Sub CommandButton1_Click() 'Pour le bouton Insertion d un outil
Dim LO As ListObject 'Déclaration du tableau
 Set LO = _
Insertion_outils.ListObjects("Tab_outils_utilises") '-< modif ici
   With LO.ListRows.Add(AlwaysInsert:=True)
   .Range(1, 2) = TextBox1
   .Range(1, 3) = TextBox2
   .Range(1, 4) = ComboBox1.Value
   .Range(1, 5) = TextBox3
   .Range(1, 6) = TextBox4
   .Range(1, 7) = ComboBox2.Value
   .Range(1, 8) = TextBox5
   .Range(1, 9) = TextBox6
   .Range(1, 10) = ComboBox3.Value
   .Range(1, 11) = TextBox7
   .Range(1, 12) = TextBox8
   .Range(1, 13) = ComboBox4.Value
   .Range(1, 14) = ComboBox5.Value
   .Range(1, 15) = ComboBox6.Value
   .Range(1, 17) = Frame1.OptionButton3'-< modif ici
   .Range(1, 18) = Frame1.OptionButton4 '-< modif ici
   .Range(1, 19) = Frame1.OptionButton5 '-< modif ici
   .Range(1, 20) = TextBox9
   .Range(1, 21) = TextBox10
   .Range(1, 22) = TextBox11
   .Range(1, 24) = TextBox12
   .Range(1, 23) = ComboBox7
   .Range(1, 24) = TextBox13
   .Range(1, 25) = TextBox14
   End With
''    'Ajout de la clef de tri'
'' Pas vue cette feuille dans la PJ ...
''    ActiveWorkbook.Worksheets("Vue_générale_mois_en_cours").ListObjects("Tab_Vue_generale").Sort.SortFields. _
''    Add Key:=Range("Tab_Vue_generale[Numero]"), SortOn:=xlSortOnValues
Me.Hide
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Avec le code du poste#8, je n'ai pas le message d'erreur relaté dans le message#7
Dans le message#7¸ est écrit ce qu' Anna à dit:
En effet, si j'écris un nom d'outil en exemple, et que je clique directement sur "insertion outil", j'obtiens le message d'erreur suivant : Variable objet ou variable de bloc With non définie".
Donc il devait rester quelques soucis, non ?
 

Ananas94

XLDnaute Junior
Bonjour Staple,

J'espère que vous allez bien !

J'ai ajouté dans mon code comme vous me l'aviez dit, le fait que les checkBox soient placées dans un cadre Frame1.

1585123261847.png


Après quelques modifications, l'insertion de lignes avec numérotation fonctionne désormais :)

Néanmoins, maintenant j'ai un autre problème. En effet, lorsque je coche une ou plusieurs CheckBox, la valeur reportée dans le tableau récapitualtif des outils est :
-VRAI pour la/les case(s) cochée(s)
-FAUX pour la/les case(s) non cochée(s)

Serait-il possible de changer ces valeurs en :

-OUI pour la/les case(s) cochée(s)
-NON pour la/les case(s) non cochée(s)

?

je me suis renseignée et il y aurait peut-être un lien avec les balises <input /> mais j'ai l'impression que ça intervient davantage sur l'affichage dans le formulaire en lui-même, et non dans l'objet sur lequel il intervient.
Auriez-vous une idée ? :)
je vous remercie vivement par avance ,

Excellente journée,
Anna

NB : je vous joins à nouveau le fichier, corrigé cette fois :)
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    55.1 KB · Affichages: 5

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Anna

•>Anna
J'ai utilisé la propriété Tag (en y mettant le N° de colonne idoine)
Et j'obtiens une syntaxe un chouia allégée.
(Donc renseigner les Tag de 2 à 25)
VB:
Private Sub CommandButton1_Click() 'Pour le bouton Insertion d un outil
Dim LO As ListObject, CTRL As Control
Set LO = Sheets("Outils_utilises").ListObjects("Tab_outils_utilises")
With LO.ListRows.Add(AlwaysInsert:=True)
.Range(1, 1) = .Range(1, 1).Row - 10
    For Each CTRL In Me.Controls
        If Len(CTRL.Tag) Then
        .Range(1, CLng(CTRL.Tag)) = CTRL.Value
    End If
    Next
    .Range(1, 17) = IIf(Frame1.Controls("Checkbox1") = True, "OUI", "NON")
    .Range(1, 18) = IIf(Frame1.Controls("Checkbox2") = True, "OUI", "NON")
    .Range(1, 19) = IIf(Frame1.Controls("Checkbox3") = True, "OUI", "NON")
End With
'Message de confirmation'
MsgBox "Outil inséré avec succès !", 0, "Ajout d'un outil réussi"
Unload Me
End Sub
Je te laisse trouver le petit souci avec cette manière de faire ;)
 

Staple1600

XLDnaute Barbatruc
Re

Et parce que le confinement dure, dure, dure
Une petite simplification de plus
VB:
Private Sub CommandButton1_Click() 'Pour le bouton Insertion d un outil
Dim LO As ListObject, CTRL As Control
Set LO = Sheets("Outils_utilises").ListObjects("Tab_outils_utilises")
With LO.ListRows.Add(AlwaysInsert:=True)
.Range(1, 1) = .Range(1, 1).Row - 10
    For Each CTRL In Me.Controls
        If Len(CTRL.Tag) Then
        .Range(1, CLng(CTRL.Tag)) = CTRL.Value
    End If
    Next
.Range(1, 17).Resize(, 3) = Array(IIf(CheckBox1, "OUI", "NON"), IIf(CheckBox2, "OUI", "NON"), IIf(CheckBox3, "OUI", "NON"))
End With
'Message de confirmation'
MsgBox "Outil inséré avec succès !", 0, "Ajout d'un outil réussi"
Unload Me
End Sub
NB: avec toujours en sus le petit souci précédemment suggéré ;)
 

Ananas94

XLDnaute Junior
Bonjour !
Merci beaucoup pour votre réponse ! Je viens de me renseigner sur la propriété Tag ; c'est vraiment intéressant. :)

J'ai effectué votre code, et en fait j'ai 2 problèmes :

1- La ligne qui se remplit lorsque l'on ajoute un outil se remplit pas le numéro de la case
2- j'ai un message d'erreur :
Variable de bloc with non définie , avec l'erreur surlignée ci-dessous :

1585145047170.png


Précédemment, cette portion de code fonctionnait bien donc je pense que le problème provient plutôt de la portion de code ajoutée ....

Le problème rencontré à mon avis est que nous somme obligé d'intégrer une boucle if par paramètre, dans une boucle for, pour au final un seul changement (seules les checkBox exigent une modification in fine).

Auriez-vous une idée pour me débloquer ? :)

Merci par avance ;)

Anna
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    62.4 KB · Affichages: 5

Staple1600

XLDnaute Barbatruc
Re

•>Anna
Merci d'être un tantinet attentive...:rolleyes:
Tu auras remarqué que dans mon code j'ai supprimé ce bout de code qui te pose problème ...
Dans mon code, c'est cette simple ligne que se charge du numéro automatique
.Range(1, 1) = .Range(1, 1).Row - 10
 

Discussions similaires

Réponses
7
Affichages
334

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 868
dernier inscrit
pierreselo33