VBA 入门
- 问题记录
-
- [1 了解Excel工作簿、表格关系](#1 了解Excel工作簿、表格关系)
-
- [1 默认新建WorkBook](#1 默认新建WorkBook)
- [2 新建WorkBook并命名工作表添加数据](#2 新建WorkBook并命名工作表添加数据)
- 3新建带有指定数量工作表的工作簿
- ActiveWorkbook.Names用法
-
- [(1) 创建名称 (全局名称和局部名称)](#(1) 创建名称 (全局名称和局部名称))
- 宏录制验证删除可行性
- 大招!!!咨询ChatGPT
- 参考
问题记录
宏录制的这两行代码注释后不影响总表筛选,所以想删除,但是又不确定是否会造成隐藏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,观察是否能够成功筛选。
先取消筛选状态,然后注释这两行代码。观察运行结果。
运行后可以看到采购类型能成功被筛选,所以删除这两行代码可行。