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

时间:2016-12-22 17:22:05

标签: excel vba excel-vba macros runtime-error

我一直在尝试删除工作簿中的大多数工作表时遇到错误,然后重新添加它们。

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

targetWorkbook = ActiveWorkbook.Name
'/* ...more code... */
Application.Workbooks(targetWorkbook).Activate
Application.Workbooks(targetWorkbook).Worksheets.Add.Name = "TempSheet"

现在,我想删除工作簿中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

当我单步执行代码并转到Line X时,我收到错误Can't enter break mode at this time。我尝试用Line X替换ws1.Delete上的所有代码,我得到了相同的消息。我想至少单步执行代码,以便我可以看到正在删除的工作表。

我的代码的另一部分是我希望从另一个工作簿中获取所有工作表并将它们放在第一个工作簿中,我从上面删除了所有工作表。我的代码如下:

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

我在Line Y上设置了断点,在收到Can't enter break mode at this time错误后,我点击了Continue按钮。我没有在断点处停下来,而是收到错误Run-time error '424'. Object required,它没有显示我所指的是哪一行,也没有让我调试(按钮是灰色的&#39; d我可以选择的唯一按钮是end)。

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

4 个答案:

答案 0 :(得分:6)

清理语法,不需要多余,例如:

targetWorkbook = ActiveWorkbook.Name
Application.Workbooks(targetWorkbook).Activate

这基本上是这样说的:ActiveWorkbook.Activate,它不仅没有任何(字面意思),而且几乎没有必要依赖Activate或{{1假设您使用适当范围的对象变量。

。对于任何
Select

应该有效。如果你不能进入休息模式,那么你的电脑还有其他功能。

  

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

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

Can't enter break mode at this time

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

答案 1 :(得分:1)

您已经设置了ws1工作表对象,并在工作簿中循环,您可以直接删除ws1对象,而不会使语法过于复杂。

Dim ws1 As Worksheet

For Each ws1 In Application.Workbooks(targetWorkbook).Worksheets
    If ws1.Name <> "TempSheet" Then
        ws1.Delete
    End If
Next

您可以将工作簿设置为:

Dim wb1 As Workbook

Set wb1 = ActiveWorkbook ' better yet use ThisWorkbook if the workbook is the one with this code in it

For Each ws1 In wb1.Worksheets
    If ws1.Name <> "TempSheet" Then
        ws1.Delete
    End If
Next

完整代码

Sub Add_DeleteWorksheets()

Dim wb1 As Workbook
Dim ws1 As Worksheet
Dim tmpsht As Worksheet

Set wb1 = ActiveWorkbook ' better yet use ThisWorkbook if the workbook is the one with this code in it
Set tmpsht = wb1.Worksheets.Add
tmpsht.Name = "TempSheet"

For Each ws1 In wb1.Worksheets
    If ws1.Name <> tmpsht.Name Then
        ws1.Delete
    End If
Next

End Sub

答案 2 :(得分:0)

除了我在评论中提出的建议外,您可以尝试以下两种方法

方法1 - 首先插入新工作簿,然后删除现有工作簿

这种方法的优点是你不需要任何&#34; temp&#34;工作表,以及在临时阶段达到内存限制的可能缺点,您的活动工作簿有两个&#34; old&#34;和&#34;新&#34;工作表

Option Explicit

Sub delsheets1()
    ReDim existingSheets(1 To Worksheets.Count) As String
    Dim isht As Long

    For isht = 1 To Worksheets.Count
         existingSheets(isht) = Worksheets(isht).Name
    Next

    Application.DisplayAlerts = False
    Workbooks("Cartel2").Worksheets.Copy After:=Worksheets(1)
    Worksheets("OtherWorkbook").Delete
    Application.DisplayAlerts = True
End Sub

方法2 - 首先删除现有的,然后插入新的工作簿

这与您的方法相同,并且具有插入新的&#34; temp&#34;的(仅逻辑,确实)缺点。表

可能是&#34;组&#34;删除技术可以避免您使用当前代码时出现的问题

Option Explicit

Sub delsheets2()
    ReDim existingSheets(1 To Worksheets.Count) As String
    Dim isht As Long

    For isht = 1 To Worksheets.Count
         existingSheets(isht) = Worksheets(isht).Name
    Next

    Worksheets.Add.Name = "TempSheet"

    Application.DisplayAlerts = False
    Worksheets(existingSheets).Delete
    Workbooks("OtherWorkbook").Worksheets.Copy After:=Worksheets(1)
    Worksheets("TempSheet").Delete
    Application.DisplayAlerts = True
End Sub

答案 3 :(得分:0)

这里又是另一个。此例程将删除除单击新表按钮之外的所有表的所有表:

Public Sub Workbook_NewSheet(ByVal Sh As Object)

  Application.EnableEvents = False
  Application.DisplayAlerts = False
  For i = Workbooks(1).Sheets.Count - 1 To 1 Step -1
    Workbooks(1).Sheets(i).Delete
  Next
  Sheets(1).Name = "Sheet1"
  Application.DisplayAlerts = True
  Application.EnableEvents = True
End Sub