预期输出是正确提取约2000个数据点的ID。我正在检查数据是否与用户输入日期匹配。如果是这种情况,我想在另一张纸上打印事件的ID。理想情况下,我将有一个具有数字ID的输入列表。
当我从控制台或调试器运行代码时,我会得到一系列ID,例如:1,2,4,5,6,11,14,166 ...但是,当我运行此代码时按钮我始终获得前2个数据点。无论哪个字段(日期,时间,大小),我总是会获得前2个数据点。
问题出现了,因为如果我在调试器中设置了一个断点,然后按下按钮,代码就可以了。我所要做的就是保持运行(F5)并且代码完美无缺。我认为这告诉我代码编译和工作;意味着错误不是编译或逻辑错误。
因此,我认为由于竞争条件我遇到了错误。所以,我继续运行 doEvents 命令。再次,我得到了相同的结果。控制台和调试器正确运行代码,但按钮没有。
Sub ThisBookSource()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Start = Now()
Dim masterRow As Integer
Dim myEvents
masterRow = 9
masterRow2 = 9
ActiveWorkbook.Worksheets("Graphs by Source").Activate
myCode = Range("D" & "2").Value
Range("C9:C2290").Clear
Range("T9:U2290").Clear
ActiveWorkbook.Worksheets("Data").Activate
For I = 3 To 2113
If Range("T" & I) = myCode Then
Worksheets("Data").Range("M" & I).Copy
Worksheets("Graphs by Source").Range("C" & masterRow).PasteSpecial xlPasteValues
masterRow = masterRow + 1
If I Mod 250 = 0 Then
DoEvents
End If
End If
Next I
ActiveWorkbook.Worksheets("Graphs by Source").Activate
Calculate
For I = 9 To 2290
If Range("I" & I).Value <> "NA" Then
Range("T" & masterRow2) = Range("G" & I).Value
Range("U" & masterRow2) = Range("I" & I).Value
masterRow2 = masterRow2 + 1
If I Mod 250 = 0 Then
DoEvents
End If
End If
Next I
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
MsgBox "Done. Started at " & Start & ", and ended at " & Now & "!"
End Sub
答案 0 :(得分:5)
如果您的意思是使用ThisWorkbook
,请使用ThisWorkbook
。执行Range("foobar")
[隐式]可以关闭ActiveSheet
,其中可能会或可能不会成为ThisWorkbook
中的工作表 - 这是当前任何工作簿中的工作表活性。它完全不同。并且每天都会导致错误。
经验法则,明确任何东西都比VBA中隐含的东西更好。这种语言已经在你背后做了太多的事情,你需要控制。
Rubberduck(我管理的开源VBE加载项项目)可以帮助您查找隐式ActiveSheet
引用的所有实例......以及许多其他潜在问题。