Excel Vba删除工作表后停止执行

3

我是一名新手VBA程序员。我编写了一个删除特定工作表的代码。执行完该删除工作表的宏后,Excel宏停止执行。它没有继续执行下去。

以下是我的代码:

Sub CopyAcross()
Dim sheetName As String
sheetName = "Master_Base"
If WorksheetExists(sheetName) Then
 DeleteSheet (sheetName)
End If
MsgBox "Debug"

Workbooks("Master_Base.csv").Sheets("Master_Base").Copy Before:=Workbooks("Copy of    test.xlsm").Worksheets("Sheet3")
End Sub 

Sub DeleteSheet(strSheetName As String)
' deletes a sheet named strSheetName in the active workbook
Application.DisplayAlerts = False
Sheets(strSheetName).Delete
Application.DisplayAlerts = True
End Sub

有人可以帮忙吗?

先行致谢。


对我来说完全正常运行。 - Siddharth Rout
我已经逐行执行了代码,并在copyAcross API处设置了断点。它确切地停在了Sheets(strSheetName).Delete这一行。 - kayle
1
我已经将其删除了。但它仍然停在同一点。 - kayle
不行,它仍然在同一点停止执行。让我解释一下用例。我需要从Masterbase.csv复制一个工作表到活动工作簿。第一次它正常工作。第二次它通过创建新工作表来复制数据。就像这样继续下去。我不想发生这种情况。所以我想如果已经存在就删除该工作表。但是在删除该工作表时它会停止。它没有抛出任何错误消息也没有突出显示。 - kayle
你的工作簿中是否有任何事件代码或者在条件格式中使用的自定义函数? - Rory
显示剩余7条评论
2个回答

4
我也遇到了同样的问题。我的电脑是Windows 7,Excel版本为16.0.10730.20264 32位,代码可以正常运行没有问题。但是在安装了相同Excel版本的Windows 10电脑上,宏在执行Sheets.Delete后会立即停止运行。
我发现这种情况仅在尝试操作包含VBA代码的工作簿时出现,而且在宏执行期间已经打开该文件。
问题是由电脑上的宏安全设置引起的。如果在打开工作簿之前将自动化安全性设置为低,您就不应再收到错误信息。
使用以下代码:
Application.AutomationSecurity = msoAutomationSecurityLow

1
非常感谢! 我遇到了同样的问题,你的解决方案非常有效。在我的情况下,AutomationSecurity设置为msoAutomationSecurityForceDisable,更改为Low后一切正常。 - Rafał B.
我曾经遇到过同样的问题... 我首先尝试将其切换为 msoAutomationSecurityForceDisable,但那并没有起作用... 必须使用 msoAutomationSecurityLow 才行。又是一个 bug。 - rohrl77

2

由于您正在使用多个工作簿,因此请使用对象。否则,您的代码可能会与错误的工作簿/工作表一起使用。

尝试以下代码(未经测试):

Sub CopyAcross()
    Dim wbI As Workbook, wbO As Workbook

    '~~> The workbook from where the code is running
    Set wbO = ThisWorkbook

    '~~> Here you open the csv
    Set wbI = Workbooks.Open("E:\OPM\OPM Sheet\Master_Base.csv")

    '~~> This will delete the sheet if it exists
    '~~> no need to check if it exists
    On Error Resume Next
    Application.DisplayAlerts = False
    wbO.Sheets("Master_Base").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0

    '~~> The csv will always have 1 sheet
    '~~> so no need providing a name
    wbI.Sheets(1).Copy Before:=wbO.Worksheets("Sheet3")
End Sub

当我从不同的工作簿执行代码时,代码可以完美地运行。执行过程中没有任何中断。谢谢Siddharth。 :) - kayle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接