Foreach over Excel单元格仅返回run中的第一行,但在单步执行该方法时可正常工作

时间:2016-05-18 14:34:02

标签: excel vba excel-vba foreach

我正在使用Excel电子表格作为时间段历史记录的数据表。结构如下:

ID  Person      Start   End
1   Alan        5/1     5/3
2   Bobbi       5/3     5/4
3   Chuck       5/1     5/2
5   Eugenia     5/3     5/6
6   Chuck       5/10    5/12

StartEnd的格式为日期字段。

我在VBA模块中编写了一个方法来查询此表并返回给定人员的所有行,例如Chuck。在SQL中,这很容易(select fields from History where Person = something)。我目前正在使用foreach循环并测试Person的值。我的循环如下:

Public Sub UpdatePeriod(currentPeriod as timePeriod)

Dim indexCell As Range
Dim colPeriods As New Collection
Dim priorPeriod As timePeriod

For Each indexCell in ThisWorkbook.Worksheets("History").Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Cells
    If Not (indexCell Is Nothing) And IsNumeric(indexCell) = True Then
        Set priorPeriod = GetPeriodObject(indexCell)
        If (priorPeriod.Person = currentPeriod.Person) Then
            colPeriods.Add priorPeriod
        End If
    End If
Next

'Do stuff with the entries in colPeriods....
End Sub

我已设置电子表格,以便某个工作表的Worksheet_Change事件处理程序将timePeriod对象传递给此方法。到目前为止,一切正常(尽管可能有更好的方法)。

当我在For Each之前测试方法而不会中断时,循环只会越过第2行(因为第1行包含标题)。但是当我在循环之前断开时,循环会正确地遍历所有行。

如何改进此方法以返回所有感兴趣的行?

(注意:该项目使用VBA作为原型,最终将成为具有适当数据库的正确应用程序。我的目标是使数据接口看起来与应用程序实现完全相同。)

2 个答案:

答案 0 :(得分:1)

最可能的原因是您没有限定第二个Range来电(或Rows)。使用:

For Each indexCell in ThisWorkbook.Worksheets("History").Range("A2:A" & ThisWorkbook.Worksheets("History").Range("A" & ThisWorkbook.Worksheets("History").Rows.Count).End(xlUp).Row).Cells

使用工作表的变量可以简化操作!

答案 1 :(得分:0)

With ThisWorkbook.Worksheets("History")
    For Each indexCell in .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row).Cells
        ....
    Next
End With