关于对象

第八篇、Excel VBA对象类型之:Workbook(工作簿)对象

  接上一篇:如何操控工作表对象?①引用工作表、②操作工作表、③改变工作表的状态、④工作表事件(操作触发程序)、⑤工作表和单元格的组合应用,这5项是我们通篇介绍的概括。到这里,关于Excel_VBA对象所需要了解的知识点,已经完成了70%。

  本篇沿着“对象层级结构图”往上,来认识Workbook工作簿对象。

如果说工作表对象+单元格对象组合在一起,能解决办公自动化需求里的66%的问题,在融进一个工作簿,个人理解能解决需求问题的程度达到90%吧。

这里仅仅是关于办公自动化中数据的处理,要是需要用到图表(Chart和Shape),就稍微复杂些。至于窗体及控件的运用,它旨在“构建和用户的交互,提升页面布局的美观和规范数据录入”,除非是为了开发相当专业的系统和程序,否则这部分浅浅了解即可,它不是我们“用VBA满足个性、自动化需求”的必要知识。

  最后我们用Workbook+Worksheet+Range,继续解决上一篇的尾部里“跨工作簿合并”的问题!

对象层级结构

  通过Excel对象的层级结构图,看到Excel对象模型是一个树状结构,从顶层的 Application 开始,逐级向下延伸:

复制成功!
1

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、完整路径,工作簿未打开时也可以被引用,通过引用打开后执行其他操作,注意路径需完整且正确,否则会报错。
示例:
  • 工作簿的引用
复制成功!
1

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 工作簿对象的操作(方法和属性)

  工作簿同样有一系列的操作方法和反映它特征的属性,比如我们创建新工作簿、打开一个已存在的工作簿、保存工作簿和关闭工作簿等等。

常用方法:
点击放大的图片
常用属性:
点击放大的图片

  知道了工作表对象的方法和属性,对工作簿对象的也不会陌生。用法皆是:对象.方法(属性)

  工作表用来存放单元格,单元格用来存储数据和格式,工作簿呢?它用来存储工作表!对工作和单元格用代码操控,对工作簿对象当然也可以。想想我们常对工作薄的操作:新建、打开、关闭、改名、保存、另存为等等,皆可用代码批量操作!

示例
  • 工作簿的方法和属性
复制成功!
1

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对象”中在做介绍!

示例
  • 合并工作簿和工作表
复制成功!
1

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对象类型)的一些核心功能!

请开发者喝杯咖啡 请开发者喝杯咖啡!