【问题标题】:run-time error '381': occurs when I add an item into a listbox after removing an item运行时错误“381”:在删除项目后将项目添加到列表框中时发生
【发布时间】:2017-08-16 03:55:33
【问题描述】:

这是填充列表框的代码,从 TextBoxes 中获取大部分数据。

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

【问题讨论】:

  • 您能否在添加新项目之前显示您设置i 的代码? (但是,如果您的第一个代码块紧跟在您的第二个代码块之后,则 i 的值为 -1,这样就可以解释错误。)
  • 您需要发布足够多的内容,以便我们可以看到i 在到达.List(i, 0) = txt1 行时被设置为无效值(可能是-1)。我害怕“整个代码”有多少代码——如果只有几百行,把它贴出来,然后我们可以将它编辑到相关部分。如果不止于此,您将需要自己进行一些编辑,以摆脱与i 如何获得其价值绝对无关的内容。
  • @MarkVincentManansala iListCount 是全球性的吗?如果是这样,它看起来会在您删除后设置为列表的 (last + 1) 索引。在Next iListCount 之后,您应该将其重置为零。
  • 很难看出它是如何工作的,但也许它可能是iListCount = lstFCHRGS.ListCount - 1,而不是我之前建议的零。在任何情况下;这很好地说明了为什么使用这样的全局变量通常是个坏主意。 iListCount 应该是一个局部变量
  • @Rob,尽力使答案连贯。大声笑希望有效!干杯!

标签: vba excel listbox listboxitem


【解决方案1】:

将 5 个项目添加到列表后,iListCount 将等于 4。由于 到这一行 iListCount = iListCount + 1 现在将等于 5。

私人子 cmdDelChrgs_Click() 将 x 调暗为整数 Dim y 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 当它循环时,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 

【讨论】:

  • For iListCount = 0 To 4 循环中,Next iListCount 增加了iListCount 的值,因此,当它为 3 时,它增加到 4 并决定“好的,我仍然可以再次循环”但是当它是 4 时,它会增加到 5 并说“嗯,5 大于 4 的最终值,我不需要再处理了”。那么代码在Next 之后继续,但iListCount 是5。你真的应该只使用循环计数器在循环内 - 永远不要在外面再次使用它们。 (某些未来版本的 VBA 可能会改变当前的行为,并导致您在修复代码时遇到数不清的痛苦。)
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多