Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno VBA - napĺňanie ListBox-u procedúrou

Ahojte, viete niekto poradiť, prečo mi VBA nedovolí naplniť položku ListBoxu, pokiaľ je poradové číslo jej stĺpca viac ako jednociferné?
Problém spôsobuje riadok .lsbLRD.List(j, 10) = Sheets("RPNI").Range("Y" & i).Text kvôli číslu stĺpca 10.

With frmKarta
    .lsbLRD.AddItem
    .lsbLRD.List(j, 0) = Sheets("RPNI").Range("A" & i).Text
    .lsbLRD.List(j, 9) = Sheets("RPNI").Range("X" & i).Text
    .lsbLRD.List(j, 10) = Sheets("RPNI").Range("Y" & i).Text
End With

Počas behu, keď program narazí na uvedený riadok, dostanem chybové hlásenie:

Run-time error ´380´
Could not set the List property. Invalid property value

Poznámka: lsbLRD.ColumnCount=13 takže tým to nebude

Předmět Autor Datum
Je tam obmedzenie na 10 stĺpcov v prípade, že mu nenastavíš zdroj dát: ListBox.ColumnCount Property…
los 01.08.2015 22:06
los
Los ďakujem veľmi pekne, pomohlo, ale len čiastočne. Moja definícia problému je, vzhľadom na poskytn…
robert13 02.08.2015 17:21
robert13
Nie, toto funguje pre ľubovoľný počet riadkov. Dôležité je na začiatku priradiť vlastný zdroj dát:…
los 02.08.2015 18:37
los
Žiaľ nefunguje... vlastný zdroj dát som priradil, spravil som dve verzie, jednu bez ReDim, druhú s R…
robert13 02.08.2015 19:54
robert13
Bez ReDim (na začiatku je RemoveItem, aby bolo pole prázdne): Sub NaplnenieZoznamuR() Dim Rozsah(0,…
los 02.08.2015 20:13
los
Som Ti veľmi vďačný, nebol by som sa z toho vymotal... Proste sa z času na čas dostanem do stavu, ke… poslední
robert13 02.08.2015 20:26
robert13

Je tam obmedzenie na 10 stĺpcov v prípade, že mu nenastavíš zdroj dát: ListBox.ColumnCount Property

Uprav si to nejako takto:

Dim aList(0 To 0, 0 To 12)
With frmKarta
    .lsbLRD.List = aList
    .lsbLRD.AddItem
    .lsbLRD.List(j, 0) = Sheets("RPNI").Range("A" & i).Text
    .lsbLRD.List(j, 9) = Sheets("RPNI").Range("X" & i).Text
    .lsbLRD.List(j, 10) = Sheets("RPNI").Range("Y" & i).Text
End With

Los ďakujem veľmi pekne, pomohlo, ale len čiastočne.
Moja definícia problému je, vzhľadom na poskytnuté riešenie, nedostatočná.
Riešenie funguje bezchybne pre pevné definovanie dvojrozmerného poľa.
Problém je však v tom, že počet riadkov nemôžem definovať pevne, je totiž premenný a zisťuje sa v inej procedúre a ukladá sa do verejnej premennej napr PocRiadkov.
Takže by som potreboval deklaráciu:

Dim A(0 To PocRiadkov, 0 To 26)

Takýto zápis však spôsobí chybu:

Constant expression required

Dá sa aj toto nejak ošetriť?
Díky

Žiaľ nefunguje... vlastný zdroj dát som priradil, spravil som dve verzie, jednu bez ReDim, druhú s ReDim s nasledovnými výsledkami:
(uvádzam celé procedúry, pričom RZapisu je definovaná v hlavnom module ako Public)

bez ReDim :

Sub NaplnenieZoznamuR()
    Dim Rozsah(RZapisu, 12)
 
    frmKarta.lsbLRD.List = Rozsah
    frmKarta.lsbLRD.ColumnCount = 13
    frmKarta.lsbLRD.ColumnWidths = "30;70;0;0;110;80;0;80;45;45;0;0"
    
    j = 0
    For i = 4 To RZapisu
        If Sheets("RPNI").Range("C" & i) = Meno Then
            With frmKarta
                .lsbLRD.AddItem
                .lsbLRD.List(j, 0) = Sheets("RPNI").Range("A" & i).Text
                .lsbLRD.List(j, 1) = Sheets("RPNI").Range("B" & i).Text
                .lsbLRD.List(j, 4) = Sheets("RPNI").Range("E" & i).Text
                .lsbLRD.List(j, 5) = Sheets("RPNI").Range("F" & i).Text
                .lsbLRD.List(j, 7) = Sheets("RPNI").Range("H" & i).Text
                .lsbLRD.List(j, 8) = Sheets("RPNI").Range("I" & i).Text
                .lsbLRD.List(j, 9) = Sheets("RPNI").Range("J" & i).Text
                .lsbLRD.List(j, 12) = Sheets("RPNI").Range("M" & i).Text
            End With
            j = j + 1
        End If
    Next i
End Sub

V tomto prípade dochádza k chybe, že žiada pevnú hodnotu, nie premennú... Constant expression required

s ReDim (skúška "prenásilnenia :-)) :

Sub NaplnenieZoznamuR()
    Dim Rozsah(100, 12)
    ReDim Rozsah(RZapisu, 12)
    
    frmKarta.lsbLRD.List = Rozsah
    frmKarta.lsbLRD.ColumnCount = 13
    frmKarta.lsbLRD.ColumnWidths = "30;70;0;0;110;80;0;80;45;45;0;0"
    
    j = 0
    For i = 4 To RZapisu
        If Sheets("RPNI").Range("C" & i) = Meno Then
            With frmKarta
                .lsbLRD.AddItem
                .lsbLRD.List(j, 0) = Sheets("RPNI").Range("A" & i).Text
                .lsbLRD.List(j, 1) = Sheets("RPNI").Range("B" & i).Text
                .lsbLRD.List(j, 4) = Sheets("RPNI").Range("E" & i).Text
                .lsbLRD.List(j, 5) = Sheets("RPNI").Range("F" & i).Text
                .lsbLRD.List(j, 7) = Sheets("RPNI").Range("H" & i).Text
                .lsbLRD.List(j, 8) = Sheets("RPNI").Range("I" & i).Text
                .lsbLRD.List(j, 9) = Sheets("RPNI").Range("J" & i).Text
                .lsbLRD.List(j, 12) = Sheets("RPNI").Range("M" & i).Text
            End With
            j = j + 1
        End If
    Next i
End Sub

V tomto prípade hlási chybu, že pole už je definované... Array already dimensioned

Kde robím chybu?

Bez ReDim (na začiatku je RemoveItem, aby bolo pole prázdne):

Sub NaplnenieZoznamuR()
    Dim Rozsah(0, 12)
 
    frmKarta.lsbLRD.List = Rozsah
    frmKarta.lsbLRD.RemoveItem 0
    frmKarta.lsbLRD.ColumnCount = 13
    frmKarta.lsbLRD.ColumnWidths = "30;70;0;0;110;80;0;80;45;45;0;0"
    
    j = 0
    For i = 4 To RZapisu
        If Sheets("RPNI").Range("C" & i) = Meno Then
            With frmKarta
                .lsbLRD.AddItem
                '...
            End With
            j = j + 1
        End If
    Next i
End Sub

S ReDim (už sa nevolá AddItem, pretože pole má požadovaný rozsah):

Sub NaplnenieZoznamuR()
    Dim Rozsah
 
    ReDim Rozsah(RZapisu, 12)
    frmKarta.lsbLRD.List = Rozsah
    frmKarta.lsbLRD.ColumnCount = 13
    frmKarta.lsbLRD.ColumnWidths = "30;70;0;0;110;80;0;80;45;45;0;0"
    
    j = 0
    For i = 4 To RZapisu
        If Sheets("RPNI").Range("C" & i) = Meno Then
            With frmKarta
                '...
            End With
            j = j + 1
        End If
    Next i
End Sub

Som Ti veľmi vďačný, nebol by som sa z toho vymotal...
Proste sa z času na čas dostanem do stavu, keď mi žiadny manuál neporadí, lebo neviem, kde robím chybu a potom je rada skúsenejšieho neoceniteľná...
Teraz je to už jasné... (aspoň táto konkrétna vec :-) )

Ďakujem!

:beer:

Zpět do poradny Odpovědět na původní otázku Nahoru