01 工作表
按选择的名单在当前工作簿批量创建或删除工作表
用Excel_VBA,按指定的名单,可以批量创建工作簿、工作表、Word文档等等。
它的整个运行过程的逻辑也很简单,关键是几个错误处理的过程预先规避。
- 1、选择单元格区域为空时怎么处理?
- 2、当单元格内容格式不对,不能作为工作表时怎么处理?
批量删除工作表的过程和创建的过程几乎一致,只是循环中的处理过程不同,一个是.add的方法,一个是.delete的方法,这里用一个示例中的两段代码来演示。
如图所示,按照工作表的名单,在当前工作簿中批量创建(删除)工作表:
运行视频:
源码下载:
描述:
根据指定名单批量创建或删除工作表
VBA实现过程:
- 1.On Error Resume Next,因为有错误发生时的预处理,添加它是为了保证程序发生错误不中断;
- 2.Worksheets.Add after:=Sheets(Sheets.Count),新建工作表,位置在最后一个;
- 3.ActiveSheet.Name = Str_name,创建后对新创建的工作表命名;
- 4.在批量删除的过程中,只是在循环中增加一个对工作表的循环,把工作表名称不属于名单的工作表、又包含在需要删除的名单中的工作表,.delete删除即可;
- 5.两段代码关键的不同,在'------------的夹行中。
示例代码(批量创建)
复制成功!
1
Sub 工作表名单批量创建工作表()
If ActiveWorkbook.ProtectStructure = True Then '只能在解除工作簿保护的状态下,创建工作表,如有,先解除
MsgBox "工作簿有保护,无法新建工作表,请先撤除保护。"
Exit Sub
End If
Dim Name_list, rng As Range
Dim Str_name, Str_Errname, Act_name As String
Dim n As Integer
On Error Resume Next '在错误发生时,仍可以继续运行
Set Name_list = Application.InputBox("选择工作表名单", "提示_", Type:=8) '选择工作表名单
If Err.Number > 0 Then MsgBox "未选择内容": Exit Sub '未选择时退出
If WorksheetFunction.CountA(Name_list) = 0 Then MsgBox "选择的内容为空": Exit Sub '选择的单元格区域内容都是空时也退出
Act_name = Name_list.Parent.Name '获取选择的单元格区域所在的工作表名,最后要激活它
' 禁用屏幕更新和警告
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each rng In Name_list '遍历名单
Str_name = rng.Value '单元格内容赋值作为工作表名称
If Len(Str_name) Then '如果名称非空
Err.Clear
Worksheets.Add after:=Sheets(Sheets.Count) '新建工作表,位置在当最后一个
ActiveSheet.Name = Str_name '重命名
If Err.Number Then '如果发生了错误,说明工作表名称不规范(包含空格、\斜杠等)
ActiveSheet.Delete
n = n + 1
Str_Errname = Str_Errname & "," & Str_name '记录不规范的名称,最终告知
End If
End If
Next rng
Sheets(Act_name).Activate '激活名单所在在工作表
' 恢复屏幕更新和警告
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If n > 0 Then
MsgBox "有" & n & "张工作表创建失败,原因是工作表重名或格式错误。" & _
"名单有:" & vbCrLf & Str_Errname
End If
MsgBox "完成" '过程结束告知!
End Sub
示例代码(批量删除)
复制成功!
1
Sub 工作表名单批量删除工作表()
If ActiveWorkbook.ProtectStructure = True Then '只能在解除工作簿保护的状态下,创建工作表,如有,先解除
MsgBox "工作簿有保护,无法新建工作表,请先撤除保护。"
Exit Sub
End If
Dim Name_list, rng As Range
Dim Str_name, Act_name As String
Dim sht As Worksheet
Set Name_list = Application.InputBox("选择工作表名单", "提示_", Type:=8) '选择工作表名单
If Err.Number > 0 Then MsgBox "未选择内容": Exit Sub '未选择时退出
If WorksheetFunction.CountA(Name_list) = 0 Then MsgBox "选择的内容为空": Exit Sub '选择的单元格区域内容都是空时也退出
Act_name = Name_list.Parent.Name '获取选择的单元格区域所在的工作表名,最后要激活它
' 禁用屏幕更新和警告
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next '在错误发生时,仍可以继续运行
For Each rng In Name_list '遍历名单
Str_name = rng.Value '单元格内容
'---------------------------------------------------------------------------
For Each sht In Sheets
If Str_name = sht.Name And sht.Name <> Act_name Then
sht.Delete '如果工作表的名字没有在选择需要删除的名单中存在,且不是名单所在的工作表,就删除它
End If
Next sht
'---------------------------------------------------------------------------
Next rng
Sheets(Act_name).Activate '激活名单所在在工作表
' 恢复屏幕更新和警告
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "完成" '过程结束告知!
End Sub
请开发者喝杯咖啡!