Sur deux boucles identiques une seule fonctionne

Joh-Ananas - 18 févr. 2016 à 22:23
Joh-Ananas Messages postés 1 Date d'inscription jeudi 18 février 2016 Statut Membre Dernière intervention 4 mars 2016 - 4 mars 2016 à 16:03
Bonjour,

J'ai suivi un tuto ultra efficace sur la création d'un formulaire (http://www.votreassistante.net/creer-formulaire-personnalise-pour-saisir-donnees-excel/) avec les fonctions dont j'ai besoin.

A l'origine le formulaire contenait 2 ComboBox et 7 TextBox. Le second ComboBox et les 7 TextBox sont incrémentés dans le premier ComboBox. Toutefois, j'ai voulu remplacer deux des TextBox par des ComboBox, afin de garder des valeurs identiques au remplissage du formulaire.

Cependant, je rencontre la difficulté suivante: je n'arrive pas à incrémenter la seconde ComboBox supplémentaire (ComboBox4). La modification du code visant à incrémenter les deux nouvelles ComboBox à la ComboBox1 fonctionne uniquement pour la ComboBox3 et non pour la ComboBox4. J'ai utilisé le même code pour les deux ComboBox supplémentaires (ComboBox 3 et 4) mais un message d'erreur d'exécution apparaît uniquement pour la ComboBox4 qui est à la ligne I + 5.

Je débute en codage VBA mais je dois avouer que cela me parait assez insolite.

Pourriez-vous m'éclairer svp???

Voici le code en entier



 
Option Explicit
Dim Ws As Worksheet


Private Sub UserForm_Initialize()
Dim J As Long
Dim I As Integer
Dim Calendar1 As Object

ComboBox2.RowSource = ("Modalitédepaement")
Set Ws = Sheets("Traitement pièces") 'Correspond au nom de votre onglet dans le fichier Excel

With Me.ComboBox1
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With

ComboBox3.RowSource = ("ListeType")
ComboBox3.ListIndex = 0
ComboBox4.RowSource = ("Modalitédepaement")
ComboBox4.ListIndex = 0

End Sub

'Pour la liste déroulante Code client
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim I As Integer
Dim Cpt As Byte

If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
ComboBox2 = Ws.Cells(Ligne, "C")

For I = 1 To 2
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
Next I

For I = 4 To 4
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
Next I

For I = 6 To 7
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
Next I

For I = 3 To 3
Me.Controls("ComboBox" & I) = Ws.Cells(Ligne, I + 3)
Next I

For I = 5 To 5
Me.Controls("ComboBox" & I) = Ws.Cells(Ligne, I + 3)
Next I


End Sub

'Pour le bouton Nouveau contact
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l’enregistrement de ce nouvelle pièce ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
L = Sheets("Traitement pièces").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide

Range("A" & L).Value = ComboBox1
Range("C" & L).Value = ComboBox2
Range("D" & L).Value = TextBox1
Range("E" & L).Value = TextBox2
Range("F" & L).Value = ComboBox3
Range("G" & L).Value = TextBox4
Range("H" & L).Value = ComboBox4
Range("I" & L).Value = TextBox6
Range("J" & L).Value = TextBox7

End If
End Sub

'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer

If MsgBox("Confirmez-vous la modification de cette pièce ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
Ws.Cells(Ligne, "C") = ComboBox2

For I = 1 To 2
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 3) = Me.Controls("TextBox" & I)
End If
Next I

For I = 4 To 4
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 3) = Me.Controls("TextBox" & I)
End If
Next I

For I = 6 To 7
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 3) = Me.Controls("TextBox" & I)
End If
Next I


For I = 3 To 3
If Me.Controls("ComboBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 3) = Me.Controls("ComboBox" & I)
End If
Next I

For I = 5 To 5
If Me.Controls("ComboBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 3) = Me.Controls("ComboBox" & I)
End If
Next I

End If

End Sub

2 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/02/2016 à 07:58
Bonjour,
Peux- tu tenter d'être plus précis et concis, car le code montré est (entre autres) en contradiction avec ton message
tu dis par exemple ne pas avoir de problème d'alimentation de ta combobox3 par cette boucle :
For I = 3 To 3
Me.Controls("ComboBox" & I) = Ws.Cells(Ligne, I + 3)
Next I

(pourquoi, d'ailleurs, une boucle pour finalement ne traiter que le 3 ???)
Cette boucle est à remplacer tout bêtement par :
Me.Combobox3 = Ws.Cells(Ligne, 6)

(elle ne fait rien d'autre !
Tu as plusieurs boucles dans le même cas ...

Or, tu as lié cette combobox par :
ComboBox3.RowSource = ("ListeType")
Tout ce code est pour le moins surprenant..
Commence par prendre la bonne habitude de toujours spécifier la propriété utilisée d'un contrôle (tes textboxes, tes comboboxes) ou d'un objet (tes cellules). Un exemple (parmi toutes les lignes dans le même cas) :
Ws.Cells(Ligne, "C") = ComboBox2
doit s'écrire, pour lever toute ambiguïté :
Ws.Cells(Ligne, "C").value = ComboBox2.list(combobox2.listindex)
Pour l'instant, c'est le "fouillis".

EDIT : je t'ai parlé plus haut de la nécessité d'écrire proprement en spécifiant les propriétés utilisées.
A propos de "propriétés" (pendant qu'on en parle). J'espère que tu ne t'es par ailleurs pas "amusé" à mettre la propriété Style de ta/tes combos qui "ne marchent pas", à la valeur 2 (fmstyledropdownlist), qui n'accepterait bien évidemment pas que l'on modifie la propriété text de la combo (bien évidemment !). ....

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Joh-Ananas Messages postés 1 Date d'inscription jeudi 18 février 2016 Statut Membre Dernière intervention 4 mars 2016
4 mars 2016 à 16:03
Avec bien du retard, merci pour ta réponse.

J'ai finalement obtenu la solution.
0
Rejoignez-nous