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 a OneDrive
    od sginfo » 11 zář 2023 15:28 » v Kancelářské balíky
    16
    6266
    od mirekol Zobrazit poslední příspěvek
    20 říj 2023 08:31
  • Excel komparacedvou soborů Příloha(y)
    od teichmann.ondrej » 15 dub 2024 17:26 » v Kancelářské balíky
    7
    1666
    od teichmann.ondrej Zobrazit poslední příspěvek
    dnes, 12:28
  • excel-posun makra
    od actionboy » 12 bře 2024 18:59 » v Kancelářské balíky
    1
    384
    od Grimm Zobrazit poslední příspěvek
    12 bře 2024 21:43
  • Excel - vlastní formát Příloha(y)
    od Story-Long » 11 srp 2023 14:50 » v Kancelářské balíky
    3
    1979
    od Story-Long Zobrazit poslední příspěvek
    14 srp 2023 10:11
  • Excel - funkce když
    od Martyn20 » 13 črc 2023 11:56 » v Kancelářské balíky
    5
    2520
    od mmmartin Zobrazit poslední příspěvek
    13 črc 2023 18:44

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

Kdo je online

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