【问题标题】:VBA Runs in Debug mode, but fails in ProductionVBA 在调试模式下运行,但在生产中失败
【发布时间】:2020-01-21 04:01:06
【问题描述】:

我的代码在调试模式下运行良好。我单步执行每一行,它的输出完全符合我的预期。但是,当它像我想要的那样在打开状态下运行时,它不会正确执行最后 2-3 行。我在下面的代码片段中记下了它停止的地方。我是一个非常业余的编码员,所以请原谅蹒跚学步的组织和效率。欢迎任何和所有批评或建议,我真的只是在我去的时候弄清楚这一点。

Private Sub Workbook_Open()

'Message asks user if they want to update
Dim Answer As VbMsgBoxResult
Answer = MsgBox("Would you like to update the part HS database for your tracker?" & vbCrLf & "(It will take a hot minute)", vbYesNo + vbDefaultButton2, "Update Part DB")


'if check for running the subroutine

If Answer = vbYes Then


    ''Turn off screen updating
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False


        'Open parser
        Workbooks.Open Filename:="K:\04_Classification\Broker Templates\BrokerPartsListParser.xlsb", ReadOnly:=True

        'Setting Range Variables
        Dim RgData As Range
        Dim RgCriteria As Range
        Dim RgOutput As Range
        Set RgData = Workbooks("BrokerPartsListParser.xlsb").Worksheets("NewestIPExtract").Range("A1").CurrentRegion
        Set RgCriteria = ThisWorkbook.Worksheets("PartDBRef").Range("J1").CurrentRegion
        Set RgOutput = ThisWorkbook.Worksheets("PartDBRef").Range("A3").CurrentRegion

        'Clearing previous data
        RgOutput.Offset(1).ClearContents

        'Doing the Advanced Filter
        RgData.AdvancedFilter xlFilterCopy, RgCriteria, RgOutput







        'Check to see if ACE data needs to be pulled

        Dim ACEPull As Boolean: ACEPull = ThisWorkbook.Worksheets("ACE Data").Range("AO2")

        If ACEPull = True Then

            'setting pulled date
            ThisWorkbook.Worksheets("ACE Data").Range("AK2").Value = Date

            'Finding last row of old data set
            Dim LastRow As Long: LastRow = ThisWorkbook.Worksheets("ACE Data").Range("AA" & Rows.Count).End(xlUp).Row


            'Deleting old Data
            If IsEmpty(Range("AA2").Value) = False Then
                ThisWorkbook.Worksheets("ACE Data").Range("A2:AA" & LastRow).ClearContents
            End If


            'Setting Advanced Filter Parameters
            Set RgData = Workbooks("BrokerPartsListParser.xlsb").Worksheets("Unified ACE Data").Range("A1").CurrentRegion
            Set RgCriteria = ThisWorkbook.Worksheets("ACE Data").Range("AH1").CurrentRegion
            Set RgOutput = ThisWorkbook.Worksheets("ACE Data").Range("A1:AA1")


            'Doing the Advanced Filter
            RgData.AdvancedFilter xlFilterCopy, RgCriteria, RgOutput


''THIS IS WHERE MY CODE STOPS WORKING AS I WOULD EXPECT

            'Finding New Last Row
            LastRow = ThisWorkbook.Worksheets("ACE Data").Range("AA" & Rows.Count).End(xlUp).Row

            'Filling Formulas
            If IsEmpty(Range("AA3").Value) = False Then
            ThisWorkbook.Worksheets("ACE Data").Range("AB2:AD" & LastRow).FillDown
            End If


        End If




        ''close parser
        Workbooks("BrokerPartsListParser.xlsb").Close SaveChanges:=False




    ''Turn updating back on
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    ''Thank people for their patience
    MsgBox "Part DB has been updated.  Thank you for your patience :D"

    Exit Sub
Else
    Exit Sub
End If

End Sub

【问题讨论】:

  • 你有一个隐式范围引用。 IsEmpty(Range("AA3").Value)不是说这是你的罪魁祸首,但很可能是。我还没有完成你的其余代码。
  • @JvdV 这完全解决了我的问题!太感谢了。为什么这在调试中不会成为问题,而在脚本一次运行时会成为问题?
  • 那是因为隐式引用意味着它正在引用当时活动的工作表。在调试时,您可能激活了正确的工作表。但是,在运行时可能不会。

标签: excel vba


【解决方案1】:

重申 JvdV 的评论,您有一个隐式范围引用。尝试添加引用到 IsEmpty 语句的工作簿和工作表。

 'Filling Formulas
            If IsEmpty(ThisWorkbook.Worksheets("ACE Data").Range("AA3").Value) = False Then
            ThisWorkbook.Worksheets("ACE Data").Range("AB2:AD" & LastRow).FillDown
            End If

``

【讨论】:

  • 谢谢罗斯!!做到了:)
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多