Excel VBA - ListBox.RemoveItem err

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

Zamčeno
Adalbert
nováček
Příspěvky: 28
Registrován: 09 úno 2011 13:13

Excel VBA - ListBox.RemoveItem err

Příspěvek od Adalbert »

Zdravim,

mam jednoduchou proceduru, ktera mi odmazava zaznamy z ListBoxu2 pokud jsou i v ListBoxu1.
Jednoduchou, presto nefunkcni. V kodu jsem vyznacil problemovy radek.


Kód: Vybrat vše

Private Sub cmbTest_Click()

Dim i As Long

For i = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.List(i) <> vbNull Then
        OdstranItem Me.ListBox1.List(i)
    End If
Next i

End Sub

Kód: Vybrat vše

Private Function OdstranItem(str As String)

Dim valExists As Boolean
Dim j As Long

valExists = False

    For j= 0 To Me.ListBox2.ListCount - 1
        If Me.ListBox2.List(j) = str Then valExists = True
    Next j

    If valExists Then
        MsgBox "Zaznam " & str & " nalezen, bude vymazan", vbInformation     ' ## Msg se zobrazi spravne
        Me.ListBox2.RemoveItem str     ' ##  chyba: Neplatny argument
    Else

    End If

End Function
alternativni funkce mi take pada na stejnou chybu

Kód: Vybrat vše

Private Function OdstranItem(str As String)

Dim j As Long

    For j = 0 To Me.ListBox2.ListCount - 1
        If Me.ListBox2.List(j) = str Then
        MsgBox "Zaznam " & str & " nalezen, bude vymazan", vbInformation
        Me.ListBox2.RemoveItem str
        End If
    Next j

End Function
pokud radek odmazu zaznamu upravim na:

Kód: Vybrat vše

Me.ListBox2.RemoveItem (j)
pripadne na:

Kód: Vybrat vše

Me.ListBox2.RemoveItem j
hlasi mi to chybu tentokrat pri zpracovani funkce na radku:

Kód: Vybrat vše

 If Me.ListBox2.List(j) = str Then                    ' ## Chyba: Could not get the List property. Invalid property array index
Predem diky za rady jak z toho ven.

--- Doplnění předchozího příspěvku (19 Bře 2015 11:42) ---

Pouze pro doplneni mozna dulezitych informaci:

ListBox1 je plnen daty z Worksheetu metodou AddItem
ListBox2 je plnen daty z db Oracle opet metodou AddItem

Oba ListBoxy jsou soucasti UserForm
Azuzula
Level 3
Level 3
Příspěvky: 452
Registrován: 14 led 2012 18:44
Bydliště: Země, bohužel...
Kontaktovat uživatele:

Re: Excel VBA - ListBox.RemoveItem err

Příspěvek od Azuzula »

Z nápovědy lze vyčíst, že funkce .RemoveItem požaduje index řádku který má smazat, požaduje číselný datový typ* místo typu string. První řádek má číslo 0, druhý řádek 1 atd.

Takže Me.ListBox2.RemoveItem j by měl normálně mazat řádky listboxu.

* Pro proměnnou i a j bych radši použila datový typ Integer nebo Byte. Byte je podle mě asi vhodnější, max. 256 řádků na seznamy ve formulářích většinou postačí, příp. integer pro max. 32tis. řádků. Typ long, mimo jiné, by se hodil tak na procházení řádků listu v opravdu rozsáhlé tabulce která má víc než 32tis. záznamů. Sice to na výkonu makra nepůjde poznat, ale proč zbytečně používat datový typ dlouhý 32bitů místo 8bitů?
Pokud je to vše.
Vše co znám z VBA jsem se naučila tady na fóru, na Office.lasakovi, david-zbiral.cz a hlavně hledáním na googlu.
SZ není poradna, na pokládání dotazů je tu fórum. Děkuji.
Adalbert
nováček
Příspěvky: 28
Registrován: 09 úno 2011 13:13

Re: Excel VBA - ListBox.RemoveItem err

Příspěvek od Adalbert »

Diky za odpoved. Datovy tzp jiste zmenit muzu.
Priznavam, ze to, ze RemoveItem pracuje pouze s cislelnym datovym typem mi uniklo.

Kazdopadne mi nefunguje ani Me.ListBox2.RemoveItem j .

Respektive mi zafunguje pouze pri odmazani prvniho nalezeneho zaznamu, jakmile se vsak otoci loop, kod pada na radku
If Me.lsbSeznamStanic.List(j) = str Then

Chyba: Could not get the List property. Invalid property array index
Azuzula
Level 3
Level 3
Příspěvky: 452
Registrován: 14 led 2012 18:44
Bydliště: Země, bohužel...
Kontaktovat uživatele:

Re: Excel VBA - ListBox.RemoveItem err

Příspěvek od Azuzula »

To nejspíš bude tím, že po vymazání první shody se změní počet řádků v listboxu a pak už nesedí j s počtem řádků, tím pádem cyklus končí chybou a kdyby makro našlo další shodu, už nebude sedět index řádku kde se hodnota nachází s číslem v proměnné j, takže by to smazalo špatný řádek.

Po každé nalezené shodě bych nechala makro vrátit na začátek cyklu aby indexy řádků seděly. Kdyby byl v listboxu víc než jeden hledaný řetězec.

Kód: Vybrat vše

Private Function OdstranItem(str As String)
Dim j As integer
zacatek:
    For j = 0 To Me.ListBox2.ListCount - 1
        If Me.ListBox2.List(j) = str Then
            MsgBox "Zaznam " & str & " nalezen, bude vymazan", vbInformation
            Me.ListBox2.RemoveItem j
            goto zacatek
        End If
    Next j
End Function
Pokud je hledaný řetězec vždycky jen jeden, můžeš makro jednoduše ukončit příkazem exit for po nalezení a odstranění první shody.

Kód: Vybrat vše

Private Function OdstranItem(str As String)
Dim j As integer
    For j = 0 To Me.ListBox2.ListCount - 1
        If Me.ListBox2.List(j) = str Then
            MsgBox "Zaznam " & str & " nalezen, bude vymazan", vbInformation
            Me.ListBox2.RemoveItem j
            exit for
        End If
    Next j
End Function
Nebo celý cyklus můžeš otočit aby hledal od konce. Funkční jak pro jeden hledaný řetězec, tak i když jich je víc.

Kód: Vybrat vše

Private Function OdstranItem(str As String)
Dim j As integer
    For j =  Me.ListBox2.ListCount - 1 to 0 step -1
        If Me.ListBox2.List(j) = str Then
            MsgBox "Zaznam " & str & " nalezen, bude vymazan", vbInformation
            Me.ListBox2.RemoveItem j
        End If
    Next j
End Function
Pokud je to vše.
Vše co znám z VBA jsem se naučila tady na fóru, na Office.lasakovi, david-zbiral.cz a hlavně hledáním na googlu.
SZ není poradna, na pokládání dotazů je tu fórum. Děkuji.
Adalbert
nováček
Příspěvky: 28
Registrován: 09 úno 2011 13:13

Re: Excel VBA - ListBox.RemoveItem err

Příspěvek od Adalbert »

Vida, to zni logicky. Diky za rady.
Zamčeno
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Přechod z Excel 21 na Excel 24
    od Snekment » » v Kancelářské balíky
    2 Odpovědi
    14410 Zobrazení
    Poslední příspěvek od Snekment
  • Pohoda a excel
    od brownwld » » v Kancelářské balíky
    1 Odpovědi
    7337 Zobrazení
    Poslední příspěvek od atari
  • Tisk sloupců vedle sebe na A4 - Excel
    od atari » » v Kancelářské balíky
    5 Odpovědi
    5915 Zobrazení
    Poslední příspěvek od atari
  • Excel 2016 - vzorec kombinace podmínek
    od MK_Vs » » v Kancelářské balíky
    5 Odpovědi
    6136 Zobrazení
    Poslední příspěvek od lubo.

Zpět na „Kancelářské balíky“