【VBA入门】WorkBook 对象 Name操作 宏录制筛选删除代码

VBA 入门

问题记录

宏录制的这两行代码注释后不影响总表筛选,所以想删除,但是又不确定是否会造成隐藏BUG,所以对ActiveWorkbook.Names.Add 展开系统学习。

vbnet 复制代码
    Selection.AutoFilter
    ActiveWorkbook.Names.Add Name:="Sheet1!_FilterDatabase", RefersTo:="=Sheet1!$A$1:$AG$1", Visible:=False

Selection.AutoFilter

这行代码的作用是执行之后就会出现筛选的按钮,再次执行则取消筛选。

这个我虽然知道,但是还是用别人的宏录制展示给萌新看一下。

1 了解Excel工作簿、表格关系

简单来说:workbook包含sheets,而sheets又包含了特定的worksheet

在WorkBook、WorkSheet、Sheets三者间存在的关系是"大于"或"包含"的关系。

1、WorkBook指的是工作簿文件;

2、WorkSheet指的是工作表;

3、Sheets指的是工作表集合;

这样来看关系为:WorkBook>Sheets>WorkSheet

Workbook对象代表一个工作簿,Workbooks集合对象则代表同一Excel进程中打开的所有工作簿对象。

1 默认新建WorkBook

使用Add方法在Workbooks集合中创建新工作簿,所创建的工作簿为活动工作簿。其语法为:

Workbooks.Add(Template)

参数Template可选,决定如何创建新工作簿。如果将该参数设置为已存在的Excel模板文件名称,那么将以该文件作为模板创建工作簿。该参数可以为下列XlWBATemplate常量之一:

xlWBATChart(值-4109,代表图表)、xlWBATExcel4IntlMacroSheet(值4)、xlWBATExcel4MacroSheet(值3)、xlWBATWorksheet(值-4167,代表工作表)

在创建新工作簿时,如果指定该参数,那么将创建包含指定类型工作表的工作簿;如果省略该参数,那么将创建包含一定数量空工作表的工作簿,工作表数为SheetsInNewWorkbook属性所设置的数量。

vbnet 复制代码
'应用示例1:创建一个新工作簿
Sub CreateNewWorkbook1()
    MsgBox "将创建一个新工作簿."
    Workbooks.Add
End Sub

运行结束后生成的工作簿5、工作簿6如上图所示。注意: 生成的工作簿对象默认不会保存

2 新建WorkBook并命名工作表添加数据

vbnet 复制代码
Sub CreateNewWorkbook2()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim i As Long
    MsgBox "将创建一个新工作簿,并预设工作表格式."
    Set wb = Workbooks.Add
    Set ws = wb.Sheets(1)'断点记录此行效果
    ws.Name = "产品汇总表" 
    ws.Cells(1, 1) = "序号"
    ws.Cells(1, 2) = "产品名称"
    ws.Cells(1, 3) = "产品数量"
    For i = 2 To 10
        ws.Cells(i, 1) = i - 1
    Next i
End Sub


对应的工程文件视图中,有两个Sheet1,现在我手动改变Sheet1表格名字,测试wb.Sheets(1)表示所有Sheet表(Sheets)的第一表命名为"产品名称"

3新建带有指定数量工作表的工作簿

vbnet 复制代码
Sub testNewWorkbook()
    MsgBox "创建一个带有10个工作表的新工作簿"
    Dim wb As Workbook
    Set wb = New_Workbook(10)
End Sub
 
Function New_Workbook(wsCount As Integer) As Workbook
    '创建带有由变量wsCount提定数量工作表的工作簿,工作表数在1至255之间
    Dim OriginalWorksheetCount As Long
    Set NewWorkbook = Nothing
    If wsCount < 1 Or wsCount > 255 Then Exit Function
    OriginalWorksheetCount = Application.SheetsInNewWorkbook'默认初始工作簿中的工作表数
    Application.SheetsInNewWorkbook = wsCount
    Set New_Workbook = Workbooks.Add
    Application.SheetsInNewWorkbook = OriginalWorksheetCount
End Function

自定义函数New_Workbook可以创建最多带有255个工作表的工作簿。本测试示例创建一个带有10个工作表的新工作簿。

测试 上面代码中Application.SheetsInNewWorkbook函数的用法

vbnet 复制代码
Sub test_new()
    Dim wb, wb2 As Workbook
    Application.SheetsInNewWorkbook = 1'设置初始工作簿中的工作表数
    Set wb = Application.Workbooks.Add
    wb.Worksheets(1).Name = "wb_表1" '给第一个工作表设置名称
    Application.SheetsInNewWorkbook = 3
    Set wb2 = Application.Workbooks.Add
    wb.Worksheets(1).Name = "wb2_表1"
End Sub

一个工作簿中有一个工作表,另一个工作簿有三个

ActiveWorkbook.Names用法

在VBA中对名称的基本操作

(1) 创建名称 (全局名称和局部名称)

① 可以使用下面的代码在当前工作簿中创建名称:

vbnet 复制代码
ActiveWorkbook.Names.Add Name:="MyName", RefersToR1C1:="=Sheet1!R2C2:R6C4"
'或者
ActiveWorkbook.Names.Add Name:="MyName", RefersTo:="=Sheet1!$B$2:$D$6"

上面的代码在当前工作簿中将工作表Sheet1内的区域B2:D6命名为MyName,该名称为全局名称 。在所命名的名称中不能出现空格 和单元格引用 .

并且,如果对命名区域使用A1样式的引用,则最后使用绝对引用,否则所命名的区域将会不确定。

在所命名的名称前加上工作表名 ,则创建局部名称,如第一段代码。

也通过引用指定工作表来创建局部名称,如第二段代码。

上面的代码在工作表Sheet2中创建一个局部名称MyName2,代表Sheet2中的单元格区域A1:B3。

vbnet 复制代码
ActiveWorkbook.Names.Add Name:="Sheet1!MyName1", RefersTo:="=Sheet1!$B$2:$D$6"
'或者
Worksheets("sheet2").Names.Add Name:="MyName2", RefersTo:="=Sheet2!$A$1:$B$3"

上面的代码在工作表Sheet1中命名区域B2:D6为MyName1,该名称为局部名称。

② 一种简单的命名方法。例如:

vbnet 复制代码
Worksheets("Sheet1").Range("B8:C10").Name = "MyName3"

上面的代码将工作表Sheet1中的单元格区域B8:C10命名为MyName3,为全局名称

vbnet 复制代码
Worksheets("Sheet2").Range("H15:G16").Name = "Sheet2!MyName4"

上面的代码将工作表Sheet2中的单元格区域H15:G16命名为MyName4,为局部名称

至此能够了理解第二行代码是 对筛选的命名,只要后续代码没有用命名的局域名称进行操作,删除也无伤大雅。

宏录制验证删除可行性

开始宏录制筛选D列采购类型为F的数据

生成的代码如下

vbnet 复制代码
Sub Macro1()
'
' Macro1 Macro
' 宏由 Administrator 录制,时间: 2023/08/12
    Columns("D:D").Select
    Selection.AutoFilter
    ActiveWorkbook.Names.Add Name:="Sheet1!_FilterDatabase", RefersTo:="=Sheet1!$D:$D", Visible:=False
    Range("D1:D43012").AutoFilter Field:=1, Criteria1:=Array("F"), Operator:=xlFilterValues
    ActiveWorkbook.Names.Add Name:="Sheet1!_FilterDatabase", RefersTo:="=Sheet1!$D$1:$D$43012", Visible:=False
End Sub

下面开始删除这两行操作进行Debug,观察是否能够成功筛选。

先取消筛选状态,然后注释这两行代码。观察运行结果。

运行后可以看到采购类型能成功被筛选,所以删除这两行代码可行。

大招!!!咨询ChatGPT

参考

1 Excel VBA系列之通过筛选拆分数据至多张工作表:

2 Workbook 对象 应用示例

3Excel) (Worksheet.Names 属性(微软官网)
3Excel) (理解工作表中的名称

相关推荐
希忘auto3 分钟前
详解MySQL安装
java·mysql
娅娅梨5 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
汤米粥11 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾14 分钟前
EasyExcel使用
java·开发语言·excel
Leo.yuan15 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
拾荒的小海螺20 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Runing_WoNiu24 分钟前
MySQL与Oracle对比及区别
数据库·mysql·oracle
Jakarta EE37 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql