我正在使用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
Start
和End
的格式为日期字段。
我在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作为原型,最终将成为具有适当数据库的正确应用程序。我的目标是使数据接口看起来与应用程序实现完全相同。)
答案 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