Excel宏在控制台和调试器中运行,但不在按钮中运行

时间:2017-08-08 19:49:46

标签: excel vba excel-vba

嗨,

我有一个无效的宏。你可以在问题的底部找到它。

我的错误/预期输出

我对这段代码有一个非常奇怪的错误。每当我从VBA控制台运行它时,代码都会正确执行。此外,如果我在调试器中手动单步执行代码,则可以正常工作。

预期输出是正确提取约2000个数据点的ID。我正在检查数据是否与用户输入日期匹配。如果是这种情况,我想在另一张纸上打印事件的ID。理想情况下,我将有一个具有数字ID的输入列表。

当我从控制台或调试器运行代码时,我会得到一系列ID,例如:1,2,4,5,6,11,14,166 ...但是,当我运行此代码时按钮我始终获得前2个数据点。无论哪个字段(日期,时间,大小),我总是会获得前2个数据点。

问题出现了,因为如果我在调试器中设置了一个断点,然后按下按钮,代码就可以了。我所要做的就是保持运行(F5)并且代码完美无缺。我认为这告诉我代码编译和工作;意味着错误不是编译或逻辑错误。

我的最终目标

理想情况下,我希望按钮能够正常运行代码。这样,我可以将此发送给可能不了解如何使用VBA控制台的同事。

更多信息

假设我在每个循环的每次迭代中设置了一个断点。然后,我只是按下键。代码运行完美。这适用于从控制台窗口和按钮运行它。

因此,我认为由于竞争条件我遇到了错误。所以,我继续运行 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



重要提示

  • 由于数据敏感且机密,我无法发布截屏
  • 我不是VBA的新手,但我只编写了几年。错误可能是我所经历过/不知道的事情。

1 个答案:

答案 0 :(得分:5)

如果您的意思是使用ThisWorkbook,请使用ThisWorkbook。执行Range("foobar") [隐式]可以关闭ActiveSheet,其中可能会或可能不会成为ThisWorkbook中的工作表 - 这是当前任何工作簿中的工作表活性。它完全不同。并且每天都会导致错误。

经验法则,明确任何东西都比VBA中隐含的东西更好。这种语言已经在你背后做了太多的事情,你需要控制。

Rubberduck(我管理的开源VBE加载项项目)可以帮助您查找隐式ActiveSheet引用的所有实例......以及许多其他潜在问题。