Bonjour
Dans le code suivant, le résultat de listindex est toujours 1, donc la comparaison est toujours fausse, l'objectif est de vérifier si le code bailleur n'a pas été modifier avant l'enregistrement de modification
dans Initialisation userform
VB:
dim Var2 As Variant
With ComboBox3
For Var2 = 2 To Ws.Range("C" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("C" & Var2) & " - " & Ws.Range("D" & Var2)
Next Var2
End With
Dans combobox3 change()
Code:
'Controle des champs, Si le numéro de bailleur Correspond au locataire
Dim Ctrl As Range, Ctrl4 As Variant, lig As Long
Ctrl = ComboBox1.Value
MsgBox (Ctrl)
lig = Me.ComboBox3.ListIndex + 2
MsgBox (lig)
Ctrl4 = Cells(lig, 1).Value
MsgBox (Ctrl4)
If Ctrl <> Ctrl4 Then
MsgBox ("Code bailleur ne correspond pas au bailleur"), vbExclamation, "Erreur de saisie"
Exit Sub
End If
Combobox1 correspond au "code bailleur" , on ne l'initialise pas, il prend la valeur du choix dans combobox3 "bailleur",cela fonctionne bien.
Je commets certainement une erreur de raisonnement, mais je ne trouve pas.
Dans lig = Me.ComboBox3.ListIndex + 2 je veux récupérer le numéro de liste d'enregistrement de combobox3 (suite à la sélection d'un bailleur) auquel je rajoute 2 pour retrouver mon numéro de ligne dans ma feuille (tableau avec en tête)
Merci de ta réponse
Pourrais tu m'expliquer pourquoi ce que j'ai fait ne fonctionne pas STP
Je ne sais pas ajouter de colonne cachée dans un combobox....ni faire de combobox 2 colonnes dont une sur une variable
Je suppose que c'est une colonne virtuelle qui me comptera les lignes, car les valeurs suivront la variable var2 dans la boucle
Et tu as raison, je suppose que l'on peut faire différemment avec les tableau structurés, les erreurs de débutant
ben je suppute que ton tableau ne démarre pas en ligne 1 dons 2 pour le range d'un listobject
colonne caché
VB:
dim Var2 As Variant
With ComboBox3
.column.count=2
.columnwidths="150;0"
For Var2 = 2 To Ws.Range("C" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("C" & Var2) & " - " & Ws.Range("D" & Var2)
.list(.listcount-1,1)=var2
Next Var2
End With
la ligne sur sheets est donc
dans l’événement change par exemple
VB:
with combobox3:msgbox "la ligne sur feuille est " & .list(.listindex,1) :end with
J'aurais pu, du, le voir aussi.
Désolé de répondre si tard, mais boulot oblige....
Par contre, quand j'insère le code dans combobox3 change par exemple, il y a une erreur (sans l'insertion du code proposé, cela fonctionne bien pour ce qui est du remplissage de cellule, avec la première partie de code inscrit que vous proposez,dans l'initialisation du userform.)
VB:
Private Sub ComboBox3_Change()
' Remplissage cellules en fonction du Nom Bailleur sélectionné
With ComboBox3: MsgBox "la ligne sur feuille est " & .List(.ListIndex, 1): End With
Dim ligne As Long, i As Integer
ComboBox3 = UCase(ComboBox3)
If ComboBox3.ListIndex = -1 Then Exit Sub
ligne = ComboBox3.ListIndex + 2
ComboBox2 = Ws.Cells(ligne, "B")
ComboBox1 = Ws.Cells(ligne, "A")
ComboBox4 = Ws.Cells(ligne, "O")
ComboBox3 = Ws.Cells(ligne, "C")
For i = 1 To 11
Me.Controls("TextBox" & i) = Ws.Cells(ligne, i + 3)
Next i
If TextBox10.Value <> "" Then
OptionButton1.Value = True
Else
OptionButton2.Value = True
End If
End Sub
Tous les champs se renseignent bien, puis j' ai une msgbox qui apparait , m'indiquant le numéro de ligne, ensuite, tous les champs s'effacent, sauf combobox3, le msgbox réapparait avec le numéro de ligne et ensuite message d'erreur
"Erreur d’exécution 381
Impossible de lire la propriété List.Index de table de propriété non valide"
J'ai essayer plusieurs trucs mais rien n'y fait.
Je me suis dit pas trop grave, c'est pas en msgbox que je veux utiliser le numéro de ligne mais dans une comparaison. Mais j'aime bien comprendre.
Comment fait on copier le résultat de .List(.ListIndex, 1) dans une variable?
J'ai essayé dans option button1 click()
With ComboBox3
lig = Me.List(.ListIndex, 1)
End With
ou bien
lig = combobox3.List(.ListIndex, 1)
Ou bien l'erreur est de l'utiliser dans un OptionButton1_Click() ?
J'ai identifié quand l'erreur survient.
Si j’enlève
ComboBox3 = Ws.Cells(ligne, "C")
J'ai toujours les 2 messages annonçant le numéro de ligne, mais plus d'erreur. (Pourquoi 2 message?)
Mais dès que l'on modifie combobox3, (pour faire une modification du nom par exemple) l'erreur apparait
Par ailleurs : j'aime rappeler qu'il n'est pas vraiment sain de détourner de sa vocation l'utilisation d'un évènement qui n'est normalement là que pour contrôler la saisie dans la zone d'édition de la combobox. Et ce : même si cet évènement peut avoir pour effet une modification du listindex
A chaque évènement son rôle normal et les vaches seront mieux gardées.
Pour les majuscule, j'ai fait autrement
Vous me dites " qu'il n'est pas vraiment sain de détourner de sa vocation l'utilisation d'un évènement qui n'est normalement là que pour contrôler la saisie dans la zone d'édition de la combobox "
Je suis d'accord, Mais avec
With ComboBox3: MsgBox "la ligne sur feuille est " & .List(.ListIndex, 1): End With
Ça m'indique le numéro de ligne via un msgbox, mais j'aimerai pouvoir utiliser ce résultat.
C'était le but de ma question à l'origine, où par ma méthode, mon numéro de ligne restait toujours à 1.
Private Sub ComboBox3_Change()
Dim lign As Long
With ComboBox3: lign = .List(.ListIndex, 1): End With
MsgBox (lign)
end sub
Lors de la sélection d'un nom dans la liste de combobox3, apparait bien le numéro de ligne
Mais des que l'on modifie le texte , c'est à dire que l'on ne correspond plus à la liste initialement chargée, le message d'erreur revient.
Telle quelle, cette méthode ne convient que si c'est une liste immuable.
Si il n'y a pas de solution, tant pis, je vais faire autrement