Verwijderen van rij uit listbox werkt niet

Status
Niet open voor verdere reacties.

hub1961

Gebruiker
Lid geworden
26 nov 2012
Berichten
5
Hallo,

Probeer uit een listbox een geselekteerde rij te verwijderen.

Eerst heb ik het op onderstaande manier geprobeerd:

Code:
Private Sub LbFaktuurregels_Click()
Dim i As Integer, j As Integer, intCount As Integer, strValueArray() As String

Me.CbAnnuleer.Enabled = False                           'disable all other user actions
Me.CbOk.Enabled = False

Me.TbOmschrijving = Me.LbFaktuurregels.Column(0)        ' show selected item in various textboxes
Me.TbAantal = Me.LbFaktuurregels.Column(1)
Me.TbPrijs = Me.LbFaktuurregels.Column(2)
  
intCount = Me.LbFaktuurregels.ListCount

For i = Me.LbFaktuurregels.ListCount - 1 To 0 Step -1
'check all items in a ListBox; reverse order (Step -1) is used because rows are being deleted from ListBox.
With Me.LbFaktuurregels
If Me.LbFaktuurregels.Selected(i) = True Then
.RemoveItem [COLOR="#FF0000"].List(i)  of (i)   of (Listindex)[/COLOR]
End If
End With
Next
End Sub

Krijg bij alle drie de opties de melding Fout -2147467259 (80004005) tijdens uitvoering

Saillant detail is dat de optie RemoveItem (1) wel werkt.


Daarna heb ik de optie m.b.v. arrays geprobeerd:

Code:
Private Sub LbFaktuurregels_Click()
Dim i As Integer, j As Integer, intCount As Integer, strValueArray() As String

Me.CbAnnuleer.Enabled = False                           'disable all other user actions
Me.CbOk.Enabled = False

Me.TbOmschrijving = Me.LbFaktuurregels.Column(0)        ' show selected item in various textboxes
Me.TbAantal = Me.LbFaktuurregels.Column(1)
Me.TbPrijs = Me.LbFaktuurregels.Column(2)
  
intCount = Me.LbFaktuurregels.ListCount

If intCount > 0 Then                                     ' Proceed only if items exist in listbox
    If intCount = 1 Then                                 ' nothing to gather just remove the only row
    Else
        ReDim strValueArray(intCount - 2, 3)             ' Re-size array to hold all listbox values, if necessary
        j = 0
        For i = 0 To intCount - 1                        ' Gather all values to remain in listbox
        If Not Me.LbFaktuurregels.Selected(i) Then       ' set aside value in array to keep for next step
            strValueArray(j, 0) = Me.LbFaktuurregels.Column(0, i)
            strValueArray(j, 1) = Me.LbFaktuurregels.Column(1, i)
            strValueArray(j, 2) = Me.LbFaktuurregels.Column(2, i)
            strValueArray(j, 3) = Me.LbFaktuurregels.Column(3, i)
            j = j + 1
        End If
        Next
    End If
    Me.LbFaktuurregels.RowSource = ""                     ' clear listbox of all values
    Me.LbFaktuurregels.Clear
    
    With Me.LbFaktuurregels                               ' re-insert values set aside
        .ColumnCount = 4
        .ColumnHeads = False
        .List = strValueArray
    End With
Else
    ' Inform user
    MsgBox "Listbox contains no items."
End If
End Sub


Het resultaat hier is dat de listbox compleet leeg is.
Verwijder ik de regel Me.LbFaktuurregels.Clear dan heeft de listbox de oude waarde (er is niets verwijderd)
Als ik tijdens uitvoering m.b.v. de inhoud van de variabelen bekijk dan is de array gevuld met de waarden zonder de verwijderde rij.

Iemand enig idee wat ik hier fout doe. Mij gaat het niet zozeer om een andere oplossing, ik ben veel meer geïnteresseerd in hetgeen ik hier fout doe bij beide opties.

P.s. de listbox wordt als volgt gevuld:

Code:
Public Sub Orderregel()
Dim i As Integer
Dim sTextboxLines() As String
sTextboxLines = Split(UfFaktuur.TbOmschrijving.Text, vbNewLine)  'split multiline textbox into parts

With UfFaktuur.LbFaktuurregels
    .AddItem
    .List(Icount, 1) = UfFaktuur.TbAantal.Value
    .List(Icount, 2) = UfFaktuur.TbPrijs.Value
    .List(Icount, 3) = UfFaktuur.TbPrijs.Value * UfFaktuur.TbAantal.Value
End With

For i = LBound(sTextboxLines) To UBound(sTextboxLines)
With UfFaktuur.LbFaktuurregels
    .List(Icount, 0) = sTextboxLines(i)
    Icount = Icount + 1
End With
Next

End Sub

Alvast bedankt voor de moeite
Gr. Hub
 
Probeer het eens.
Code:
with LbFaktuurregels
  .removeitem (.listindex)
end with
 
Code:
For i = Me.LbFaktuurregels.ListCount - 1 To 0 Step -1
'check all items in a ListBox; reverse order (Step -1) is used because rows are being deleted from ListBox.
    With Me.LbFaktuurregels
        If .Selected(i) Then .RemoveItem (i)
    End With
Next
 
Helaas, beide voorgestelde oplossingen leveren dezelfde fout -2147467259 (80004005) tijdens uitvoering.

Wat me wel opvalt is dat de eigenlijke removeitem wel goed is uitgevoerd. De fout treedt op bij het removeitem statement maar de aktie op het scherm is dan wel al uitgevoerd.

Andere suggesties ?

Gr.Hub
 
Ja, een voorbeeldbestand zodat we iets hebben om mee te werken, want in mijn testbestand werkt alles vlekkeloos zonder foutmeldingen zodat de fout ergens anders in jouw bestand moet zitten.
 
Heb een nieuw testbestandje gemaakt welke resulteert in dezelfde foutmelding.

Gr. Hub
 

Bijlagen

als de eigenschap multiselect single is:

Code:
if listbox1.listindex>-1 then listbox1.removeitem listbox1.listindex

om een item uit een listbox te verwijderen moet dat item geselecteerd zijn.

als de eigenschap multiselect 'multiselect' is

Code:
for j=listbox1.listcount-1 to 0 step -1
   if listbox1.selected(j) then listbox1.removeitem j
next
 
Laatst bewerkt:
Heb mijn testbestand meegestuurd.

Vraag is nu werkt dit bij een van jullie.

Ik kan proberen wat ik wil, krijg nog steeds gewoon dezelfde melding,

Krijg langzaam de indruk dat hier iets anders aan de hand is.

Heb inmiddels op twee PC's (windows 7) een keer excel 2007, een keer excel 2010 dezelfde problematiek.

Heb een workaround gemaakt m.b.v. arrays, maar baal een beetje van het feit dat ik hier een pagina code voor heb moeten maken.

Gr. Hub
 
Testbestand ?
Heb je de reactie van snb gelezen ?
Is je LB dus Single- of MultiSelect ? Afhankelijk hiervan met je ofwel de ene ofwel de andere code gebruiken.
Je voorbeeldbestand uit je vorige post(waar jij een foutmelding bij krijgt ?) heb ik zonder problemen aan't werk gekregen met de bovenste code van snb, aangezien de LB in dat bestand SingleSelect was.
Ik denk eerder dat je event nogal ongelukkig gekozen is. Als je nog maar een regel selecteerd om te verwijderen, worden alle regels al gewist ??
Heb eens een extra knop bijgezet voor het verwijderen v/e regel en dan onderstaande codes gebruikt. Probleem opgelost.
Code:
Option Explicit

Public Sub listbox1_Click()
    Me.TextBox1 = Me.ListBox1.Column(0)        ' show selected item in various textboxes
    Me.TextBox2 = Me.ListBox1.Column(1)
End Sub

Public Sub commandbutton1_click()
    With UserForm1.ListBox1
        .AddItem
        .List(.ListCount - 1, 0) = Me.TextBox1.Value
        .List(.ListCount - 1, 1) = Me.TextBox2.Value
    End With
End Sub

Private Sub CommandButton2_Click()
    If ListBox1.ListIndex > -1 Then ListBox1.RemoveItem ListBox1.ListIndex
End Sub
 
Laatst bewerkt:
Testbestand ?
Heb je de reactie van snb gelezen ?
Is je LB dus Single- of MultiSelect ? Afhankelijk hiervan met je ofwel de ene ofwel de andere code gebruiken.

Ik neem alle reacties zeer serieus en probeer die dan ook uit.
Mijn listbox is single select; bij mijn weten (maar ik ben maar een amateur) wordt alleen dan het click event getriggerd.

Ik heb de code van snb letterlijk gekopieerd en krijg dan de foutmelding.

Ook jouw code heb ik letterlijk gekopieerd en hij werkt met een commandbutton. Zet ik jouw code van de commandbutton2 in het listbox click event krijg ik weer dezelfde fout.

Resumerend beteknt dit bij mijn installaties het volgende:
Staat de removeitem in een commandbutton_click event werkt hij
Staat de removeitem in een listbox_click event werkt hij niet; resultaat is dan eerder genoemde foutmelding
Gr.
Hub
 
Niet iedere gebeurtenis is hiervoor natuurlijk geschikt.
Begin eens van voren af aan aan een VBA boek.
 

Bijlagen

Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan