关于对象
第八篇、Excel VBA对象类型之:Workbook(工作簿)对象
接上一篇:如何操控工作表对象?①引用工作表、②操作工作表、③改变工作表的状态、④工作表事件(操作触发程序)、⑤工作表和单元格的组合应用,这5项是我们通篇介绍的概括。到这里,关于Excel_VBA对象所需要了解的知识点,已经完成了70%。
本篇沿着“对象层级结构图”往上,来认识Workbook工作簿对象。
如果说工作表对象+单元格对象组合在一起,能解决办公自动化需求里的66%的问题,在融进一个工作簿,个人理解能解决需求问题的程度达到90%吧。
这里仅仅是关于办公自动化中数据的处理,要是需要用到图表(Chart和Shape),就稍微复杂些。至于窗体及控件的运用,它旨在“构建和用户的交互,提升页面布局的美观和规范数据录入”,除非是为了开发相当专业的系统和程序,否则这部分浅浅了解即可,它不是我们“用VBA满足个性、自动化需求”的必要知识。
最后我们用Workbook+Worksheet+Range,继续解决上一篇的尾部里“跨工作簿合并”的问题!
对象层级结构
通过Excel对象的层级结构图,看到Excel对象模型是一个树状结构,从顶层的 Application 开始,逐级向下延伸:
Application
│
├─ Workbooks (所有打开的工作簿集合)'Workbook父对象
│ │
│ └─ Workbook (单个工作簿)'Worksheets父对象
│ │
│ ├─ Worksheets (所有工作表集合) 'Worksheet父对象
│ │ │
│ │ └─ Worksheet (单个工作表) 'Range的父对象
│ │ │
│ │ ├─ Range (单元格及区域)'Worksheet子对象
│ │ │
│ │ ├─ ChartObjects (嵌入的图表集合)
│ │ │ └─ ChartObject → Chart (嵌入的图表)
│ │ │
│ │ └─ Shapes (形状/图形集合,如文本框、图片等)
│ │ └─ Shape (单个形状)
│ │
│ └─ Charts (独立的图表工作表集合)
│ └─ Chart (独立的图表工作表)
│
└─ Windows (所有窗口集合)
上一篇了解🔗Sheet(工作表)对象,这篇来看它的父对象Workbook是如何工作的。
本篇视频:
|01 WorkBook工作簿对象
和WorkSheeets、WorkSheet一样,我们把Workbooks和Workbookt放到一起来了解。Workbooks是Workbook的集合,Workbook是Workbooks中的一个元素。
它俩一个是表示当前Excel程序中所有打开的工作簿,一个是代表具体的工作簿实例。
1-1 工作簿对象的引用:
工作簿对象的引用特别简单,了解过工作表引用和单元格引用后,对工作簿对象的引用就容易理的多。
五个方法:名称引用、索引号引用、活动工作簿、包含代码的工作簿、完整路径。
- 1、工作簿对象的“名称引用”,和工作表对象的“名称引用”是一样的;
- 2、“索引号”引用,工作簿对象是按照工作薄的打开顺序排列,注意当关闭中间某个工作簿后,索引会动态调整;
- 3、活动工作簿ActiveWorkbook,它和活动工作表ActiveSheet行为类似;
- 4、ThisWorkbook,代码运行所在的工作簿;
- 5、完整路径,工作簿未打开时也可以被引用,通过引用打开后执行其他操作,注意路径需完整且正确,否则会报错。
示例:
- 工作簿的引用
Sub 工作簿的引用()
Workbooks("工作簿1.xlsx").Sheets(1).Range("A1").Value = "工作簿引用-名称" '名称引用
Workbooks(3).Sheets(1).Range("A1").Value = "工作簿引用-索引" '索引引用
Dim wb As Workbook
Set wb = ActiveWorkbook
wb.Sheets(1).Range("A1").Value = "工作簿引用-活动工作簿" '引用活动工作薄
ThisWorkbook.Sheets(1).Range("A1").Value = "工作簿引用-当前代码运行所在的工作薄" '引用含代码的工作薄
Workbooks.Open ("C:\Users\MagicBook\Desktop\kk\工作薄对象\工作簿4.xlsx") '完整路径引用
End Sub
1-2 工作簿对象的操作(方法和属性)
工作簿同样有一系列的操作方法和反映它特征的属性,比如我们创建新工作簿、打开一个已存在的工作簿、保存工作簿和关闭工作簿等等。
常用方法:
常用属性:
知道了工作表对象的方法和属性,对工作簿对象的也不会陌生。用法皆是:对象.方法(属性)。
工作表用来存放单元格,单元格用来存储数据和格式,工作簿呢?它用来存储工作表!对工作和单元格用代码操控,对工作簿对象当然也可以。想想我们常对工作薄的操作:新建、打开、关闭、改名、保存、另存为等等,皆可用代码批量操作!
示例
- 工作簿的方法和属性
Sub 工作簿对象的方法和属性()
Dim new_wb As Workbook '一个工作簿对象的变量
Set new_wb = Workbooks.Add '新建工作薄
MsgBox new_wb.Saved '查看是否已经保存
new_wb.SaveAs "C:\Users\MagicBook\Desktop\kk\工作薄对象\第一个用代码新建的工作簿.xlsx" '保存新建的工作簿到指定路径
new_wb.Sheets(1).Range("A1").Value = new_wb.Name '在工作簿中写入名字
MsgBox new_wb.Saved '查看是否已经保存
new_wb.Save '保存工作薄
MsgBox new_wb.Saved '重新查看保存状态
new_wb.Close '在查看保存状态、关闭工作簿
Set new_wb = Workbooks.Open("C:\Users\MagicBook\Desktop\kk\工作薄对象\第一个用代码新建的工作簿.xlsx") '保存新建的工作簿到指定路径
new_wb.Sheets.Add After:=new_wb.Sheets(new_wb.Sheets.Count) '在新建工作薄增加一个工作表,位置在最后
ActiveSheet.Name = "表1" '新建的工作表,就是当前的工作表,次重命名
new_wb.Sheets.Add After:=new_wb.Sheets(new_wb.Sheets.Count)
ActiveSheet.Name = "表2"
new_wb.Protect Password:="123" '对工作簿添加保护,密码是“123”
new_wb.Sheets.Add After:=new_wb.Sheets(new_wb.Sheets.Count) '尝试新增一个工作表
ActiveSheet.Name = "表3"
new_wb.Unprotect Password:="123" '取消工作簿保护
new_wb.Sheets.Add After:=new_wb.Sheets(new_wb.Sheets.Count) '尝试增加一个工作表
ActiveSheet.Name = "表3"
Dim sht As Worksheet
For Each sht In new_wb.Worksheets '遍历工作表,在立即窗口输入名名称
Debug.Print sht.Name
Next sht
MsgBox "工作簿的完整路径是: " & new_wb.FullName '工作簿的完整路径
MsgBox "工作薄保存在: " & new_wb.Path & "文件中" '工作簿的不完整路径(不含工作簿名称,只是存放位置)
ThisWorkbook.Activate
MsgBox "当前活动工作的工作簿名称是: " & ActiveWorkbook.Name
End Sub
以上示例代码完整演示了工作簿对象一些方法和属性,按步(step)执行看到每一步方法对工作簿的操控,这些方法和属性并不是工作簿对象的全部,知晓用法即可。
|02 合并跨工作簿的工作表
在上一篇🔗我的经历:合并工作表里,有我手搓第一个VB程序的前后的心路历程。往上延伸一下:
如果是多个工作簿呢?一个工作簿代表一个分公司,里面的每个工作表都是代表分公司里的某一个加盟店,如果我要把每个公司的每个加盟店的订货信息汇总出来再分析呢?上个篇幅的示例还只是在一个工作簿内,我们也只了解到了工作表对象,这一篇已经对工作簿对象有了更直观的认识,怎么办?在循环工作表的外边再增加一个循环,遍历每个工作簿就OK了~~~。
这里先引用一个Application对象的.GetOpenFilename方法,Application是整个Excel应用程序对象的最顶层,代表整个Excel应用程序,也就是Workbooks工作簿集合对象的父级,这个在介绍“对象”的几个章节里的开头—“序:对象的层级结构图”中都能看到。.GetOpenFilename方法是:“显示标准的“打开”对话框,并获取用户文件名及完整路径”,我们暂时知晓这个即可,详细的我们在下一节“Excel_VBA对象类型之:Application对象”中在做介绍!
示例
- 合并工作簿和工作表
Sub VBA代码合并工作表()
Dim sht As Worksheet
Dim end_row As Long, step_row As Long
'合并工作表的核心代码,即:遍历、复制、粘贴、添加来源表名
For Each sht In Worksheets
end_row = Sheets("汇总").UsedRange.Rows.Count + 1
sht.UsedRange.Copy Destination:=Sheets("汇总").Range("B" & end_row)
step_row = sht.UsedRange.Rows.Count
Sheets("汇总").Range("A" & end_row & ":A" & end_row + step_row).Value = sht.Name
Next
End Sub
Sub VBA代码合并工作簿和工作表()
Dim sht As Worksheet
Dim end_row As Long, step_row As Long
Dim FileToOpen As Variant '声明一个可以存储任何数据类型的Variant变量
Dim i As Long
'显示标准的“打开”对话框,并获取选择的文件名,包含完整的路径
FileToOpen = Application.GetOpenFilename("Excel文件,*.xl*", , "请选择要合并的多个工作簿/表", , True)
'原核心代码的外层,包裹一层循环,用来遍历所有需要操作工作簿
For i = 1 To UBound(FileToOpen)
Workbooks.Open Filename:=FileToOpen(i) '只是对每个遍历的工作簿执行一个打开(激活为当前工作簿),执行合并的核心代码,最后关闭即可
'合并工作表的核心代码,即:遍历、复制、粘贴、添加来源工作簿名 + 表名
For Each sht In Worksheets
end_row = ThisWorkbook.Sheets("汇总").UsedRange.Rows.Count + 1 '注意汇总的位置,要显示制定是在代码所在的工作簿的“汇总”工作表
sht.UsedRange.Copy Destination:=ThisWorkbook.Sheets("汇总").Range("B" & end_row)
step_row = sht.UsedRange.Rows.Count
ThisWorkbook.Sheets("汇总").Range("A" & end_row & ":A" & end_row + step_row).Value = ActiveWorkbook.Name & "-" & sht.Name
Next
ActiveWorkbook.Close '最后关闭工作簿
Next i
End Sub
在核心代码区域,只是在源代码的基础上增加一个外层循环、内部修改一个汇总指定位置,就实现了跨工作簿的工作表合并。Nice!!
下一篇:Excel_VBA对象类型之:Application对象
终于到了核心对象的最后一个、也是最顶级的一个:Application对象
刚刚在合并跨工作簿工作表的小示例中,已经浅尝了Application对象的.GetOpenFilename方法。大概能知晓它能用来操控工作簿的集合。Application作为顶级对象,远不止操控控制工作簿这么简单,它代表整个Excel应用程序本身,能控制Excel的整体行为。作为顶级对象,它就不再被“引用”了,而是直接用一些方法和属性来对Excel全局控制。
下一篇了解Application对象(最后一个和最顶级的Ecxel对象类型)的一些核心功能!
请开发者喝杯咖啡!