2017-08-16 40 views
1

這是填充列表框的代碼,它從TextBoxes中獲取大部分數據。運行時錯誤'381':發生在刪除項目後將項目添加到列表框中

iListCount被聲明爲全局。由於我未知的原因,列表框只填充第一行,除非這樣做,否則不會採取後續行動。

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  

下面是我用來同時刪除列表框項目和工作表項的代碼。

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

你可以在添加新項目之前顯示代碼,設置「i」嗎? (但是,如果你的第一塊代碼緊跟着你的第二塊代碼,那麼'i'的值就是'-1',這樣就可以解釋錯誤。) – YowE3K

+0

@ YowE3k你完全正確,有沒有辦法解決這個問題,比如重置(i)或者某個東西來避免錯誤?我是編程新手,這實際上是我的第一次嘗試。我可以發佈整個代碼,我只是不確定是否可以這樣做......如果沒關係,我很樂意發佈整個代碼。感謝您的幫助。 –

+1

您需要發佈足夠的內容,以便我們可以看到'i'在到達'.List(i,0)= txt1'行時如何設置爲無效值(可能爲-1)。我很擔心有多少代碼是「整個代碼」 - 如果只有幾百行代碼,請發佈它,然後我們可以將其編輯到相關部分。如果不止這些,你將需要自己做一些編輯來擺脫那些與「我」的價值無關的東西。 – YowE3K

回答

1

加入5項列表iListCount將等於4。由於 該行之後iListCount = iListCount + 1,將現在等於5.

私人小組cmdDelChrgs_Click () 昏暗X作爲整數 昏暗ý作爲整數 昏暗噸作爲整數

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在這一點上 因爲它可以將iListCount將有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 

值刪除項目iListCount仍然是5之後很可能是錯誤的原因

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

在'For iListCount = 0 To 4'循環中,'Next iListCount'遞增'iListCount'的值,所以當它爲3時,它增加到4並決定「OK,我仍然可以再次通過循環」,但是當它是4時,它增加到5,並說「嗯,5大於最終值4,我不需要再處理」。因此,代碼在「Next」**之後繼續,但「iListCount」是5 **。你真的應該只在循環中使用循環計數器** - 不要在外面再使用它們。 (某些未來的VBA版本可能會改變當前的行爲,並會導致您無法修復代碼。) – YowE3K

+0

@ YowE3K lol會記住謝謝和歡呼! :) –