2017-08-16 36 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会记住谢谢和欢呼! :) –