XL 2019 Listindex ne varie jamais

SPGoder

XLDnaute Occasionnel
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)
 

patricktoulon

XLDnaute Barbatruc
bonjour
ajoute une colonne masquée dans ta combo et met lui le var2 en colonne 1 (2d colonne)dans ta boucle

au change
with combobox3
lig=.list(.listindex,1)
'.....
end with
et tu sera plus jamais ennuyé

cela dit quand on travaille avec des tableaux structurés on travaille légèrement différemment
 

SPGoder

XLDnaute Occasionnel
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
 
Dernière édition:

patricktoulon

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

SPGoder

XLDnaute Occasionnel
C'est le nom de la feuille qui contienr la BDD
Voici comment je l'ai déclarée
VB:
Option Explicit
Dim Ws As Worksheet

Private Sub UserForm_Initialize()
Set Ws = Worksheets("Bailleurs")      

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
 

SPGoder

XLDnaute Occasionnel
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() ?
 
Dernière édition:

SPGoder

XLDnaute Occasionnel
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
 
Dernière édition:

jmfmarques

XLDnaute Accro
Bonjour
J'ai toujours les 2 messages annonçant le numéro de ligne, mais plus d'erreur. (Pourquoi 2 message?)

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) ' ----->> déclenche donc lui aussi l'évènement Change

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. :cool:
 

SPGoder

XLDnaute Occasionnel
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.
 

SPGoder

XLDnaute Occasionnel
VB:
 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
 

Discussions similaires

Statistiques des forums

Discussions
312 086
Messages
2 085 197
Membres
102 814
dernier inscrit
JLGalley