Vba 试图在关闭工作簿时清除不同工作簿中两个单元格中的值。运行时错误

Vba 试图在关闭工作簿时清除不同工作簿中两个单元格中的值。运行时错误,vba,excel,Vba,Excel,当我关闭正在使用的工作簿时,我试图清除不同工作簿中两个单元格中的值。当我关闭工作簿时,收到以下错误: 运行时错误“91”:未设置对象变量或带块变量 使用debug和单步执行,我可以找到收到错误的那一行,但就我的一生而言,我看不到我遗漏了什么 我从以下位置调用我的宏: Private Sub Workbook_BeforeClose(Cancel As Boolean) TestClear End Sub Sub TestClear() Application.Screen

当我关闭正在使用的工作簿时,我试图清除不同工作簿中两个单元格中的值。当我关闭工作簿时,收到以下错误:

运行时错误“91”:未设置对象变量或带块变量

使用debug和单步执行,我可以找到收到错误的那一行,但就我的一生而言,我看不到我遗漏了什么

我从以下位置调用我的宏:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    TestClear

End Sub

Sub TestClear()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim SourceWb As Workbook, myWS As Worksheet

    Set SourceWb = Workbooks.Open("Workbook file location, in this case it's on a network share")
    Set myWS = SourceWb.Sheets("Sheet1") <---- Here is where I receive the Run-Time error    '91'

    myWS.Range("A1").Clear
    myWS.Range("B1").Clear

    SourceWb.Close SaveChanges:=1
    ThisWorkbook.Close SaveChanges:=1

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub
Private子工作簿\u关闭前(取消为布尔值)
测试清除
端接头
子测试清除()
Application.ScreenUpdating=False
Application.DisplayAlerts=False
Dim SourceWb作为工作簿,myWS作为工作表
设置SourceWb=Workbooks.Open(“工作簿文件位置,在本例中为网络共享”)

设置myWS=SourceWb.Sheets(“Sheet1”)尝试运行以下代码,直到您可以在没有错误的情况下执行此操作:

Sub TestClear()

    Dim SourceWb        As Workbook
    Dim myWS            As Worksheet

    Set SourceWb = ThisWorkbook
    Set myWS = SourceWb.Worksheets("Sheet1")

    Debug.Print myWS.Name

End Sub

可能是您使用
SourceWb
时出错,或者您没有
Sheet1

请尝试运行以下代码,直到您可以无错误地执行此操作:

Sub TestClear()

    Dim SourceWb        As Workbook
    Dim myWS            As Worksheet

    Set SourceWb = ThisWorkbook
    Set myWS = SourceWb.Worksheets("Sheet1")

    Debug.Print myWS.Name

End Sub

可能错误在于您使用
SourceWb
的方式,或者您没有
Sheet1

您是重新进入的、理论上永无止境的例程的受害者在不禁用事件的情况下,在
工作簿关闭前
内部调用
此工作簿。关闭
,这将再次导致调用
工作簿关闭前
。这会导致未定义的行为(可能是StackOverfow!)

快速修复:禁用事件:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.EnableEvents = False '<------- To avoid re-entance
    On Error Resume Next
    TestClear
    Application.EnableEvents = True

End Sub
Private子工作簿\u关闭前(取消为布尔值)

Application.EnableEvents=False'您是重新进入的、理论上永无止境的例程的受害者在不禁用事件的情况下,在
工作簿关闭前
内部调用
此工作簿。关闭
,这将再次导致调用
工作簿关闭前
。这会导致未定义的行为(可能是StackOverfow!)

快速修复:禁用事件:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.EnableEvents = False '<------- To avoid re-entance
    On Error Resume Next
    TestClear
    Application.EnableEvents = True

End Sub
Private子工作簿\u关闭前(取消为布尔值)

Application.EnableEvents=False'是否有名为
Sheet1
的工作表?是的,我已将Sheet1保留在sourceWB中。手动打开该工作簿确认Sheet1存在,并且我正在写入单元格A1和B1的值也存在。从您的代码中,我了解到您使用的宏将打开excel,然后您想从刚刚打开的excel中删除一些内容。如果我的假设是正确的,您需要声明新的excel。尝试以下操作:Application.DisplayStatusBar=False Dim xl As New Excel.Application xl.Workbooks.Open(工作表(“MAIN”).Range(“B7”).Value)xl.Visible=True With xl工作表(“something”).Range(“A1”)。清除工作表(“something”).Range(“A1”)。清除结束With你有工作表吗,名为
Sheet1
?是的,我把Sheet1留在了sourceWB中。手动打开该工作簿确认Sheet1存在,并且我正在写入单元格A1和B1的值也存在。从您的代码中,我了解到您使用的宏将打开excel,然后您想从刚刚打开的excel中删除一些内容。如果我的假设是正确的,您需要声明新的excel。尝试这样的操作:Application.DisplayStatusBar=False Dim xl作为新Excel.Application xl.Workbooks.Open(工作表(“MAIN”).Range(“B7”).Value)xl.Visible=True与xl工作表(“某物”).Range(“A1”)。清除工作表(“某物”).Range(“A1”)。清除结束,就是这样。谢谢你的帮助!就这样。谢谢你的帮助!