[Déplacé .Net --> VBA] colonne ListBox : Erreur d'exécution '380'

Résolu
cs_Gekco Messages postés 20 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 17 mai 2010 - 30 mars 2010 à 12:14
Gresko Messages postés 1 Date d'inscription mercredi 27 août 2014 Statut Membre Dernière intervention 27 août 2014 - 27 août 2014 à 13:44
Bonjour,

J'essai de concevoir un userform sous excel afin d'afficher dans une ListBox des données de colonnes.
J'ai bidouillé un code qui fonction avec 10 colonnes seulement quand je passe à 11 cela ne fonctionne plus. Il y erreur d'exécution '380'.

Voici le code qui marche :

Private Sub CommandButton1_Click()

Range("A4:K2000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:K2"), Unique:=True

UserForm2.ListBox1.Clear
UserForm2.ListBox1.ColumnCount = 11
For i = 4 To Range("A65536").End(xlUp).Row
If Not Rows(i - 1).Hidden Then UserForm2.ListBox1.AddItem
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 0) = Feuil1.Cells(i, 1)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 1) = Feuil1.Cells(i, 2)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 2) = Feuil1.Cells(i, 3)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 3) = Feuil1.Cells(i, 4)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 4) = Feuil1.Cells(i, 5)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 5) = Feuil1.Cells(i, 6)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 6) = Feuil1.Cells(i, 7)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 7) = Feuil1.Cells(i, 8)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 8) = Feuil1.Cells(i, 9)
UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 9) = Feuil1.Cells(i, 10)
Next i
UserForm2.ListBox1.ColumnWidths = "20;20;20;20;25;150;150;150;50;50"
UserForm2.Show
UserForm1.ComboBox1.Clear
Range("A4:K2000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:K2"), Unique:=True
End Sub

et lorsque je rajoute un :

UserForm2.ListBox1.List(UserForm2.ListBox1.ListCount - 1, 10) = Feuil1.Cells(i, 11)

eh bé cela ne marche plus.


Quelqu'un pourrait-il me renseigner sur le problème ?

Merci

T

9 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 mars 2010 à 13:16
Oups
C'est bien ce que tu as fait.
Dans l'aide, toujours, ils disent que, si tu as associé ta ListBox à une source de données indépendante, la limite est de 10 colonnes.
Je ne comprends pas trop ce que cela veut dire concrêtement, mais je pense que c'est ton cas.

Peut-être peux-tu remplir ta liste par l'intermédiaire d'un tableau (Array) tel que décrit dans le premier exemple de ColumnCount.
J'ai fait personnellement cet essai et ça fonctionne correcteemnt :
J'ai placé des textes dans les cellules A1 à M16 (13 colonnes et 16 lignes)
    Dim aCC(0 To 15, 0 To 12)
    For r = 0 To 15
        For t = 0 To 12
            aCC(r, t) = Cells(r + 1, t + 1)
        Next t
    Next r
    With ListBox1
        .Clear
        .ColumnCount = 13
        .ColumnWidths = "50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50"
        .List() = aCC
    End With


Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 mars 2010 à 12:57
Salut
Quand tu donne un code d'erreur, donne le descriptif avec, merci
Error 380 : Valeur de propriété incorrecte

Précise aussi sur quelle ligne apparait cette erreur.

Comme expliqué dans l'aide, les numéros de colonnes (ou des lignes) d'une ListBox commencent à 0, et pas à 1.
Donc, si tu précises .ColumnCount = 11, tu auras 11 colonnes, numérotées de 0 à 10.
La 11ème n'existant pas, cela donne une erreur, oui.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Gekco Messages postés 20 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 17 mai 2010
30 mars 2010 à 14:45
Merci Jack pour ton aide.
J'ai utilisé ton conseil et j'arrive à ce que je veux. C'est nickel.
J'utilise ce code ci :

Private Sub CommandButton1_Click()

Dim aCC(0 To 2000, 0 To 12)

Range("A4:K" & Ligne).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:K2"), Unique:=True

UserForm2.ListBox1.Clear
For i = 4 To Range("A65536").End(xlUp).Row
If Not Rows(i + 1).Hidden Then
For t = 0 To 12
aCC(i, t) = Cells(i + 1, t + 1)
Next t
End If
Next i

UserForm2.ListBox1.Clear
UserForm2.ListBox1.ColumnCount = 13
UserForm2.ListBox1.ColumnWidths = "20;20;20;20;25;150;150;150;50;50;50;50;50"
UserForm2.ListBox1.List() = aCC
UserForm2.Show
UserForm1.ComboBox1.Clear
Range("A4:K" & Ligne).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:K2"), Unique:=True
End Sub

Reste tout de même un petit problème : les lignes non masquées qui apparaissent dans la listbox n'apparaissent pas au niveau de la première ligne de la listbox. Serais-tu comment les décaler ?
Merci encore pour ton aide.

T
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 mars 2010 à 20:54
Bah ... ta recherche commence à la ligne 4 et tu commences par remplir aCC(4)
Donc oui, c'est normal que les premières données soient vides !
Dans le remplissage du tableau aCC, il faut impérativement remplir à partir de 0 --> Il faut déclaer ton index i de 4
aCC(i - 4, t) = Cells(i + 1, t + 1)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Gekco Messages postés 20 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 17 mai 2010
30 mars 2010 à 21:44
Ah oé !! J'avais pas vu ça comme ça.
Je débute plus ou moins en VBA et j'essai d'apprendre grâce à ce que je trouve sur la toile mais bon parfois je galère un peu sur certaines petites conneries surtout quand t'as passé toute la journée au taff devant l'écran. Enfin bref !!

En tout cas merci beaucoup. :)

T
0
cs_Gekco Messages postés 20 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 17 mai 2010
31 mars 2010 à 09:09
Bonjour Jack,

Je me permet de faire une petite réctificatiion à mon dernier message. En réalité, décaler de 4 dans les lignes du tableau Array n'a pas résolu mon problème de décalage de mes données. En y réflichissant un petit peu, j'ai trouvé la parade suivant que j'ai intégré à mon code précédent :

Calcule de la derniere ligne non masquées :
k = ActiveSheet.Cells.Find("*", , LookIn:=xlFormulas, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

Calcule du nombre de lignes non masquées :
For j = 5 To Cells(65536, 1).End(xlUp).Row
If Not Rows(j).Hidden Then w = w + 1
Next j

Calcule du nombre de lignes masquées présente au dessus de la première ligne non masquées :
q = k - w

Puis :
aCC(i-q,t)=Cells(i+1, t+1)

Cela fonctionne, j'arrive à décaler mes données non masquées à la premiere ligne de ma listbox. Il subsiste tout de même encore un dernier petit soucis. Lorsque les données filtrées sont les premieres lignes de ma plage de données, le k est alors égale à 1 (alors cela devrait être 11) dc le q devient négative et mes données sont alors décaler vers le bas. Je vais tenté de résoudre ce petit soucis.

Bonne journée

T
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mars 2010 à 09:42
Ok, tu as raison, cela ne corrige pas ton problème.
En fait, il ne faut pas utiliser 'i' pour désigner l'index dans le tableau, mais incrémenter une nouvelle variable :
    monIndex = 0
    For i = 4 To Range("A65536").End(xlUp).Row 
        If Not Rows(i + 1).Hidden Then 
            For t = 0 To 12 
                aCC(monIndex, t) = Cells(i + 1, t + 1)
                monIndex = monIndex + 1
            Next t 
        End If 
    Next i

NB : Merci d'utiliser la coloration syntaxique (3ème icone à partir de la droite) pour coller du code, sinon, sans les indentations et les couleurs, c'est chiant à relire.
0
cs_Gekco Messages postés 20 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 17 mai 2010
31 mars 2010 à 10:29
Ok, je vais essayé ta méthode qui est moins lourde que la mienne. Sinon, j'étais parvenu à régler mon soucis avec ce petit code :

Set Plage = [_filterdatabase].Offset(1).Resize(, 1)
Set Plage = Plage.Resize(Plage.Count - 1).SpecialCells(xlCellTypeVisible)
w = Plage.Count
j = Plage.Row
Plage(Plage.Count).Select
k = Plage.SpecialCells(xlCellTypeLastCell).Row


Puis : aCC(i-q)=cells(i+1, t+1).

Merci pour ton aide.

T
0
Gresko Messages postés 1 Date d'inscription mercredi 27 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 13:44
Bonjour,

Je rencontre un problème similaire sur mon code.

J'ai le code suivant :


Private Sub Search_Click()
Dim Ind As Integer, DLig As Long, Lig As Long
Dim TabCrit() As String, NbCrit As Integer, NbFind As Integer
' Tableau des champs pas rapport au sens des colonnes
TabCrit = Split("Base_source,Base,Table,Donnee,Equipe,Responsable,Categorie,Sous_catégorie,Usage_détaillé,BU,Groupe,Définition", ",")
' Effacer la ListBox avant
Me.ListBox1.Clear
' Avec la feuille
With Sheets("Cartographie")
' Mémoriser la dernière ligne remplie du tableau
DLig = .Range("C" & Rows.Count).End(xlUp).Row
' Pour chaque ligne
For Lig = 2 To DLig
' Mettre le nombre de critères et le nombre de valeurs trouvées à ZERO
NbCrit = 0: NbFind = 0
' Pour chaque critère correspondant à ceux de la carto
For Ind = 4 To 9
' Si le critère de recherche a été renseigné
If Me.Controls(TabCrit(Ind)) <> "" Then
NbCrit = NbCrit + 1
' Si le critère ressemble au contenu de la cellule
If UCase(.Cells(Lig, 1 + Ind)) Like UCase("*" & Me.Controls(TabCrit(Ind)) & "*") Then
' Comptabiliser le nombre de valeurs correspondantes
NbFind = NbFind + 1
End If
End If
Next Ind
' Si le nombre de critères rempli = le nombre de valeurs trouvées
If NbCrit = NbFind Then
' Ajouter l'item
Me.ListBox1.AddItem .Cells(Lig, 2)
' Pour chaque colonne
For Ind = 1 To 9
' Ajouter les valeurs correspondantes
Me.ListBox1.List(Me.ListBox1.ListCount - 1, Ind) = .Cells(Lig, 1 + Ind)
Next Ind
End If
Next Lig
End With
End Sub

La ligne soulignée en gras est celle qui me pose problème. En effet le tableau généré dans la listbox ne peut contenir l'intégralité des champs que je veux afficher.
TabCrit est un tableau virtuel représentant ma base de données. Lorsque dans la feuille je perçois une combobox (ie un champ de recherche) similaire à une colonne de TabCrit alors j'effectue une recherche dans ma base de données et affiche les colonnes de ma base de données (Ind).

Malheureusement, même avec l'aide provenant de votre discussion je n'arrive pas à adapter mon code pour aller au-delà des 10 colonnes de ma listbox. Pourriez-vous m'aider ?
0
Rejoignez-nous