2017-08-16 3 views
1

Dies ist der Code, der das Listenfeld füllte, wobei die meisten Daten aus TextBoxen übernommen wurden.Laufzeitfehler '381': tritt auf, wenn ich nach dem Entfernen eines Elements ein Element in ein Listenfeld einfügt

iListCount wird als global deklariert. Aus Gründen, die mir unbekannt sind, füllt das Listenfeld nur die erste Zeile und würde keine weiteren übernehmen, es sei denn, dies wird so gemacht.

Private Sub cmdAddFraudCharges_Click() 
    With Me.lstFCHRGS '<- ListBox   
     .ColumnCount = 6 
     .ColumnWidths = "60;65;50;26;35;70" 
     .AddItem 
     .List(iListCount, 0) = dtpAddDt |<--DateTimePicker|error occurs here 
     .List(iListCount, 1) = txtAddAmt |<--Continues till last column 
     iListCount = iListCount + 1 
    End With   
End Sub  

Hier ist der Code, den ich verwendet habe, um das Listbox-Element und den Arbeitsblatteintrag gleichzeitig zu löschen.

Private Sub cmdDelChrgs_Click() 
    Dim x As Integer 
    Dim y As Integer 
    Dim t As Integer 

    Dim rngTarget As Range 
    Set rngTarget = wksFraud.Range("A1").End(xlDown) 
    Set wksFraud = Application.ThisWorkbook.Worksheets("Fraud") 

    For iListCount = lstFCHRGS.ListCount - 1 To 0 Step -1 
     x = lstFCHRGS.ListCount 
     If lstFCHRGS.Selected(iListCount) Then 
      y = iListCount 
      t = (x - y) - 1 

      With rngTarget 
       Set rngTarget = rngTarget.Offset(-t, 0) 
       rngTarget.EntireRow.Delete 
      End With 

      lstFCHRGS.RemoveItem (iListCount) 
     End If 
    Next iListCount 
End Sub 
+0

Können Sie den Code anzeigen, in dem Sie "i" einstellen, bevor Sie das neue Element hinzufügen? (Aber wenn Ihr erster Code-Block unmittelbar auf Ihren zweiten Code-Block folgt, dann hat "i" einen Wert von "-1", was den Fehler erklären würde.) – YowE3K

+0

@ YowE3k Sie sind genau richtig, gibt es einen Weg Um dies zu umgehen, wie Reset (i) oder etwas, um den Fehler zu vermeiden? Ich bin neu in der Programmierung und das ist eigentlich mein erster Versuch. Ich könnte den gesamten Code posten, ich bin mir nur nicht sicher, ob es in Ordnung ist ... Wenn es in Ordnung ist, würde ich gerne den ganzen Code posten. Danke für Ihre Hilfe. –

+1

Sie müssen genug posten, um zu sehen, wie "i" auf einen ungültigen Wert (wahrscheinlich -1) gesetzt wird, wenn es in die Zeile ".List (i, 0) = txt1" kommt. Ich habe Angst davor, wie viel Code "der ganze Code" ist - wenn es nur ein paar hundert Zeilen sind, poste es und wir können es anschließend auf die relevanten Teile herunterarbeiten. Wenn es mehr ist, müssen Sie selbst etwas bearbeiten, um Dinge loszuwerden, die definitiv nicht damit zu tun haben, wie "ich" seinen Wert erhält. – YowE3K

Antwort

1

Nach Zugabe von 5 Elemente in die Liste iListCount würde 4. aufgrund zu dieser Linie gleich iListCount = iListCount + 1 nun gleich wäre, 5.

Private Sub cmdDelChrgs_Click() Dim x As Integer Dim y As Integer Dim t As Integer

Dim rngTarget As Range 
Set rngTarget = wksFraud.Range("A1").End(xlDown) 
Set wksFraud = Application.ThisWorkbook.Worksheets("Fraud") 

'For iListCount = lstFCHRGS.ListCount - 1 To 0 Step -1|<-- changed this with 
For iListCount = LBound(lstFCHRGS.List) To UBound(lstFCHRGS.List)  

iListCount = 0 an dieser Stelle wie es Schleifen iListCount den Wert von 5

If lstFCHRGS.Selected(iListCount) Then 
     x = lstFCHRGS.ListCount 
     y = iListCount 
     t = (x - y) - 1 

     With rngTarget 
      Set rngTarget = rngTarget.Offset(-t, 0) 
      rngTarget.EntireRow.Delete 
     End With 

     lstFCHRGS.RemoveItem (iListCount) 
End If 
Next iListCount 

Nach dem Löschen des Elements iListCount noch 5 ist und war wahrscheinlich die Ursache für den Fehler haben würde

iListCount = iListCount - 1|<-- Add after next to restores the value of iListCount 
+1

In einer 'For iListCount = 0 To 4'-Schleife inkrementiert der 'Next iListCount' den Wert von' iListCount' so, wenn er 3 war, wird er auf 4 erhöht und entscheidet" OK, ich kann die Schleife noch einmal durchlaufen " wenn es 4 ist, erhöht es sich auf 5 und sagt "Hmmm, 5 ist größer als der Endwert von 4, ich muss nicht mehr verarbeiten". Also geht der Code nach dem 'Next' ** weiter, aber 'iListCount' ist 5 **. Sie sollten wirklich nur Schleifenzähler ** innerhalb der Schleife ** verwenden - verwenden Sie sie nie wieder außerhalb. (Einige zukünftige Version von VBA kann das aktuelle Verhalten ändern und verursachen Sie unsägliches Elend, Ihren Code zu reparieren.) – YowE3K

+0

@ YowE3K lol wird das im Kopf behalten Dank und Prost! :) –

Verwandte Themen