我通过使用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,无效的过程元素或调用。如何解决我的问题并从此集合中删除所有不相关的字符串?
答案 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
令人讨厌! >