运行时错误5:从VBA集合中删除某些项目

时间:2019-06-03 15:42:18

标签: excel vba collections

我通过使用FOR迭代该列从Excel列创建了一个Excel集合。但是,此集合包括标题和空白列。我想从集合中删除这些空白列和标题,并且不知道如何。根据我的代码,我不断收到运行时错误5

我已尝试通过基于条件的collection和collection_name.Remove元素使用For Each迭代,但您无法在下面看到它。

Public Sub outer_lÖÖp()


'creating a collection of the policy numbers
Sheets("MappingSheet").Select
Dim policynums As New Collection
Dim i As Integer
For i = 1 To 100
    policynums.Add (Cells(i, 1))
Next i

'getting rid of "Policy Number" and empty strings from collection
Worksheets("GL").Activate
For Each element In policynums
    If element = "Policy Number" Or element = "" Then
        policynums.Remove element
    End If
Next element

For Each element In policynums
    MsgBox (CStr(element))
Next element


End Sub

这将继续返回运行时错误5,无效的过程元素或调用。如何解决我的问题并从此集合中删除所有不相关的字符串?

1 个答案:

答案 0 :(得分:2)

数据来自特定的工作表。第一步是获取该对象。

Dim sheet As Worksheet
'TODO make this work off a Workbook object so we don't need to care what workbook is currently active.
Set sheet = ActiveWorkbook.Worksheets("MappingSheet")

接下来,我们需要一个收集对象-避免使用As New,它会生成一个自动实例化的对象,这会带来您实在不想处理的后果。

Dim elements As Collection
Set elements = New Collection

接下来,我们循环1 To 100。虽然确实适合Integer范围,但我们避免使用传统的16位整数类型,尤其是对于行号之类的东西(可能是数百万):使用Long而不是32位整数类型。

Dim currentRow As Long
For currentRow = 1 To 100 'TODO determine how many rows we need before we start looping.
    elements.Add sheet.Cells(currentRow, 1).Value
Next

现在,为什么要再次迭代集合,只是删除本来不应该添加的内容呢?

Dim currentRow As Long
For currentRow = 1 To 100 'TODO determine how many rows we need before we start looping.
    Dim cell As Range
    Set cell = sheet.Cells(currentRow, 1)
    If Not IsError(cell.Value) Then
        If Trim$(cell.Value) <> vbNullString And cell.Value <> "Policy Number" Then
            elements.Add sheet.Cells(currentRow, 1).Value
        End If
    End If
Next

如果检查"Policy Number"文字的唯一原因是避免第一条记录即您的行标题,请删除该检查,然后开始循环到第二行-假设表头位于第一行:

For currentRow = 2 To 100 'TODO determine how many rows we need before we start looping.
    Dim cell As Range
    Set cell = sheet.Cells(currentRow, 1)
    If Not IsError(cell.Value) Then
        If Trim$(cell.Value) <> vbNullString Then
            elements.Add sheet.Cells(currentRow, 1).Value, Key:="Row" & currentRow
        End If
    End If
Next

注意Key命名参数(在本文中只是为了澄清而命名-它没有必须命名。尽管它也没有损害):如果需要要从集合中删除以"Row12"键的项,您可以这样做:

elements.Remove "Row12"

最后,MsgBox(以及您未捕获其返回值的任何其他过程调用)应如下所示:

MsgBox element

多余的括号具有语法上的含义,您可能没想到。无法编译:

MsgBox (element, vbInformation)

因为括号告诉VBA将它们的内容作为值表达式进行评估,并将该表达式的结果 ByVal 传递给调用的过程。但是(foo, bar)不是有效的表达式,因此代码拒绝编译。

无论如何,您想凭经验凭经验Debug.Print收集集合的内容,或者只使用调试器工具窗口检查其内容-循环中的MsgBox令人讨厌! >