我一直在尝试删除工作簿中的大多数工作表时遇到错误,然后重新添加它们。
我无法删除工作簿中的所有工作表;至少需要一张纸。精细。所以我首先创建一个名为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
)。
关于如何实现这一目标的任何建议?
答案 0 :(得分:6)
清理语法,不需要多余,例如:
targetWorkbook = ActiveWorkbook.Name
Application.Workbooks(targetWorkbook).Activate
这基本上是这样说的:ActiveWorkbook.Activate
,它不仅没有任何(字面意思),而且几乎没有必要依赖Activate
或{{1假设您使用适当范围的对象变量。
Select
此应该有效。如果你不能进入休息模式,那么你的电脑还有其他功能。
当我单步执行代码并进入第X行时,我收到错误此时无法进入中断模式。
如果您正在逐步执行代码,那么已经处于中断模式,因此这没有任何意义。看看这些建议是否有助于确定错误的来源:
Can't enter break mode at this time
- 从VBE调试菜单“编译VBA项目”,值得一试。
- 完全删除该行。运行代码。然后将该行重新放入并使用断点再次尝试。
- 在
之后添加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
DoEvents
语句- 在
Sheets.Add
上使用MsgBox
代替断点。显示消息框后,尝试使用 ctrl + fn + End 手动中断。 (此时,“破解”不是必要的,但看看你是否可以打破这种方式会很有趣)- 在
Debug.Print
上设置一个断点;实际上,如果您可以将断点放在前一行,则没有理由将断点放在Sheets.Add
语句中。- 有没有Addins?如果是这样,请禁用所有这些并一次重新启用,测试哪一个可能导致错误。
醇>
答案 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