【发布时间】:2017-02-02 23:47:20
【问题描述】:
我最近开始处理一位同事的旧项目以消除错误。主要问题是,在一个 Sub 中,他必须在纸上数一些数字。但在我重置、暂停和重置代码之前,他什么都不算。几个小时后,我意识到,他甚至没有首先找到开始行, startrow 和 endrow 被返回为 Nothing。 (startDate 和 endDate 都很好并且已填充)
但是,如果我再次手动重置、暂停和重置代码(通过 VBA 控件),那么即使我更改工作表等,它也可以正常工作。只有当我关闭并再次打开它时,才会再次出现这个错误(是的,我尝试停用打开的 makro,没有帮助)。
Dim startDate As String, endDate As String
For i = 1 To UBound(auftraegeVar, 1)
' Adopt range to be looked in for each order according to user specified months
Set startrow = Worksheets(auftraegeVar(i)).Range("A1:A200").Find(what:=startDate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
Set endrow = Worksheets(auftraegeVar(i)).Range("A1:A200").Find(what:=endDate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
Next i
编辑: 这是应用@shairado 建议的更改后的模块。当 startrow 和 endrow 是范围并且如上所述设置时,一切运行良好(除了事实上,他总是将它们设置为空[我观察到变量],除了我重置、暂停和重置 makros)。但是现在(如果 find 返回 Nothing,我在 find(bla).row 上得到错误 91,因此是 if 部分)
Public Sub HourCounting(auftraegeVar As Variant)
Dim indices As Range
Dim startrow As Integer, endrow As Integer
Dim startDate As String, endDate As String
'Do stuff that works
' Get start and end month in which to look for names
startDate = Worksheets("Main").cmbPastDate.Value
endDate = Worksheets("Main").cmbCurrentDate.Value
' Get start and end month in which to look for names
startDate = CDate(Worksheets("Main").cmbPastDate.Value)
endDate = CDate(Worksheets("Main").cmbCurrentDate.Value)
' ------------------- Search in all the workbooks for names, orders and months -------------------
For i = 1 To UBound(auftraegeVar, 1)
' Adopt range to be looked in for each order according to user specified months
If Worksheets(auftraegeVar(i)).Range("A:A").Find(what:=startDate, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) Is Nothing Then
startrow = 0
Else
startrow = Worksheets(auftraegeVar(i)).Range("A:A").Find(what:=startDate, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).row
End If
If Worksheets(auftraegeVar(i)).Range("A:A").Find(what:=endDate, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) Is Nothing Then
endrow = 0
Else
endrow = Worksheets(auftraegeVar(i)).Range("A:A").Find(what:=endDate, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).row
End If
' Do stuff in Loops that works
Next i
End Sub
工作表包含 A1:A200 公式,用于返回某个月份的第一个月。其格式为仅显示 MMM YY。这与我的 searchTerms 结构相同(startDate 和 endDate)。 如果我手动尝试搜索它可以工作。
【问题讨论】:
-
以防万一:auftraegeVar 也不为空,并提供正确的工作表名称
-
根据你的代码
startrow和endrow是Ranges,对吧?因为您使用的是Set。如果您真的想找到该行,请使用startrow = Worksheets(auftraegeVar(i)).Range("A1:A200").Find(what:=startDate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False).Row,并定义Dim startrow As Long -
我怀疑 idleTimer 在后台运行。那是什么> 一些在启动时启动的 VBA 代码?您能否提供更多详细信息?
-
@ShaiRado 是的,startrow 和 endrow 是范围。我明天会尝试你的建议,并让你更新。感谢您的快速建议:)
-
@A.S.H idleTimer 只是一些计时器,它在 300 秒后显示一个 MsgBox。这不是问题。 (基本上它和VBA Sub)。我的第一个想法是,这个愚蠢的计时器是万恶之源,但即使删除了计时器,错误仍然发生。