Excel VBA - ListBox.RemoveItem err Vyřešeno

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

Moderátor: Mods_senior

Adalbert
nováček
Příspěvky: 28
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Excel VBA - ListBox.RemoveItem err

Příspěvekod Adalbert » 19 bře 2015 11:33

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

Reklama
Azuzula
Level 3
Level 3
Příspěvky: 452
Registrován: leden 12
Bydliště: Země, bohužel...
Pohlaví: Žena
Stav:
Offline
Kontakt:

Re: Excel VBA - ListBox.RemoveItem err

Příspěvekod Azuzula » 19 bře 2015 13:36

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: únor 11
Pohlaví: Muž
Stav:
Offline

Re: Excel VBA - ListBox.RemoveItem err

Příspěvekod Adalbert » 19 bře 2015 14:31

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: leden 12
Bydliště: Země, bohužel...
Pohlaví: Žena
Stav:
Offline
Kontakt:

Re: Excel VBA - ListBox.RemoveItem err

Příspěvekod Azuzula » 19 bře 2015 15:25

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: únor 11
Pohlaví: Muž
Stav:
Offline

Re: Excel VBA - ListBox.RemoveItem err  Vyřešeno

Příspěvekod Adalbert » 19 bře 2015 15:37

Vida, to zni logicky. Diky za rady.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • EXCEL -jak otevřít 2 excel sobory abych je viděla současne a samostatně
    od Ketty02 » 30 srp 2024 21:19 » v Vše ostatní (sw)
    2
    4743
    od Riviera kid Zobrazit poslední příspěvek
    02 zář 2024 16:21
  • Přechod z Excel 21 na Excel 24
    od Snekment » 29 led 2025 13:46 » v Kancelářské balíky
    2
    12160
    od Snekment Zobrazit poslední příspěvek
    29 led 2025 15:05
  • Pohoda a excel Příloha(y)
    od brownwld » 06 kvě 2025 17:28 » v Kancelářské balíky
    1
    4527
    od atari Zobrazit poslední příspěvek
    07 kvě 2025 09:41
  • Excel - výpočet nočních hodin Příloha(y)
    od Uziv00 » 17 říj 2024 11:22 » v Kancelářské balíky
    3
    3296
    od lubo. Zobrazit poslední příspěvek
    24 říj 2024 00:00
  • Tisk sloupců vedle sebe na A4 - Excel
    od atari » 24 dub 2025 10:51 » v Kancelářské balíky
    5
    3903
    od atari Zobrazit poslední příspěvek
    26 dub 2025 09:11

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů