【发布时间】: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 这完全解决了我的问题!太感谢了。为什么这在调试中不会成为问题,而在脚本一次运行时会成为问题?
-
那是因为隐式引用意味着它正在引用当时活动的工作表。在调试时,您可能激活了正确的工作表。但是,在运行时可能不会。