尝试删除工作簿中的所有工作表,然后使用VBA添加其他工作表

aCa*_*lla 1 macros excel vba runtime-error excel-vba

尝试删除工作簿中的大多数工作表,然后将其重新添加,我一直遇到错误.

我无法删除工作簿中的所有工作表; 至少需要一张纸.精细.所以我先创建一个名为的表TempSheet.

targetWorkbook = ActiveWorkbook.Name
'/* ...more code... */
Application.Workbooks(targetWorkbook).Activate
Application.Workbooks(targetWorkbook).Worksheets.Add.Name = "TempSheet"
Run Code Online (Sandbox Code Playgroud)

所以现在,我想要删除TempSheet工作簿中的所有工作表.所以我试着这样做:

For Each ws1 In Application.Workbooks(targetWorkbook).Worksheets
    If ws1.Name <> "TempSheet" Then
        Workbooks(targetWorkbook).Sheets(ws1.Name).Delete '/* Line X. */
    End If
Next
Run Code Online (Sandbox Code Playgroud)

当我单步执行代码并进入时Line X,我得到了错误Can't enter break mode at this time.我试着更换所有的代码Line Xws1.Delete,我得到了同样的信息.我想至少单步执行代码,以便我可以看到正在删除的工作表.

我的代码的另一部分是这样的,我想从另一个工作簿中取出所有工作表,并将它们放在第一个工作簿中,我从上面删除了所有工作表.我的代码如下:

Application.Workbooks("OtherWorkbook").Activate '/* Line Y. */
For Each ws2 In Application.Workbooks(sheetsWorkbook).Worksheets
    ws2.Copy After:=Workbooks(targetWorkbook).Sheets(ws1.Name)
Next
Run Code Online (Sandbox Code Playgroud)

我打开一个断点Line Y,在我收到Can't enter break mode at this time错误后,我按下了Continue按钮.而不是在断点处停止,我得到错误Run-time error '424'. Object required,它没有显示它指的是哪一行而且不让我调试(按钮是灰色的,我可以选择的唯一按钮是end).

有关如何实现这一目标的任何建议?

Dav*_*ens 6

清理语法,不需要像以下那样多余:

targetWorkbook = ActiveWorkbook.Name
Application.Workbooks(targetWorkbook).Activate
Run Code Online (Sandbox Code Playgroud)

这基本上是说:ActiveWorkbook.Activate这不仅没有做任何事情(直译),它也几乎从来没有必要依靠ActivateSelect任何东西,假设你使用适当范围的对象变量.

Option Explicit
Sub foo()
Dim tempSheet as Worksheet, ws as Worksheet, wb As Workbook
Set wb = ActiveWorkbook ' Or ThisWorkbook, or Workbooks("filename.xlsx"), etc.
Set tempSheet = wb.Sheets.Add

For Each ws in wb.Worksheets
    Application.DisplayAlerts = False
    If ws.Name <> tempSheet.Name Then
        ws.Delete
    End If
    Application.DisplayAlerts = True
Next

'Now copy the other worksheets:
Workbooks("OtherWorkbook").Worksheets.Copy After:=wb.Worksheets(1)

'Finally, remove tempsheet
tempSheet.Delete

End Sub
Run Code Online (Sandbox Code Playgroud)

应该工作.如果您无法进入休息模式,那么您的电脑还有其他功能.

当我单步执行代码并进入第X行时,我收到错误此时无法进入中断模式.

如果您正在逐步执行代码,那么您已经处于中断模式,因此这没有任何意义.看看这些建议是否有助于确定错误的来源:

此时无法进入休息模式

  1. 从VBE调试菜单"编译VBA项目",它值得一试.
  2. 完全删除该行.运行代码.然后将该行重新放入并使用断点再次尝试.
  3. 之后添加一个DoEvents语句Sheets.Add
  4. MsgBox在a上使用a 而不是断点Debug.Print.显示消息框后,尝试使用ctrl+ fn+ 手动中断End.(此时,"打破"不是必要的,但看看你是否可以打破这种方式会很有趣)
  5. Sheets.Add改为使用断点; 实际上,Print如果您可以将断点放在前一行,则没有理由将断点放在语句上.
  6. 有没有Addins?如果是这样,请禁用所有这些并一次重新启用一个,测试哪个可能导致错误.