虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做。绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理。而后面这一部分(操作工作表)在前面已经讲过了,所以本章只讲如何在VBA中打开、关闭工作薄,以及介绍两个常用的工作薄对象。在VBA中打开工作薄有两种方法:显式打开及隐式打开。

1. 显式打开

显式打开即跟我们手动双击打开一个Excel文件一样,可以看到工作薄的内容,可以在里面进行各种操作。代码及示例如下:

Sub workbook_operate()

    ' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String fname = "E:/temp/test.xlsx"
' 根据工作薄文件路径打开工作薄
Set wbk = Application.Workbooks.Open(Filename:=fname)
MsgBox fname & "已打开"
' 关闭工作薄
wbk.Close
End Sub

结果如下:

然后就可以根据这个workbook对象(示例中的wbk变量)来获取到其中的工作表:

Set parameter_sht = wbk.Worksheets("Parameter")

或者取得这个工作薄的一些属性:

wbk.Name

最后可以使用Close方法来关闭这个工作薄:

wbk.Close

2. 隐式打开

使用隐式打开的时候,这个工作薄在前端是看不到的,只有在VBE环境中(的工程窗口)可以看到它。示例代码及结果如下:

Sub workbook_operate()

    ' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String fname = "E:/temp/test.xlsx"
' 根据工作薄文件路径获取工作薄对象
Set wbk = GetObject(fname)
Debug.Print wbk.Name End Sub

与显式打开不同的是,这是使用了GetObject方法。结果如下:

可以在VBE的工程窗口(上图左侧)中看到有一个新的工项目被加载了。但此时是并不能看到有一个Excel文件被打开的,这个已经被VBA隐式打开的文件,只能使用VBA进行操作,在使用上与显式打开后得到的workbook对象没什么区别,如获取其中的工作表对象、获取它的名字、关闭它等,都是一样的。这里就不举例了。

3. 关闭

无论是显式打开还是隐式打开,如果在新打开的工作薄中有更改,在使用workbook.Close方法时,会有个弹窗提示是否要保存更改,就跟我们平时使用时一样:

又或者被打开的工作薄里面有些公式,在打开这个工作薄时公式结果变了(其实也等于是有更新了),在关闭时都会出现这个提示。如果可以确定是否需要更改,可以在保存时加入相应的参数SaveChanges

wbk.Close SaveChanges:=False

SaveChanges等于False时即为不保存,等于True时即为保存

4. ThisWorkbook与ActiveWorkbook

ThisWorkbook对象是VBA顶级对象Application下的一个特殊对象,代表当前(VBA代码所在的)工作薄对象。

ActiveWorkbook对象也是VBA顶级对象Application下的一个特殊对象,代表当前激活的工作薄对象。

就跟我们在使用QQ聊天时一样,我们不可能同时单独地发信息给两个不同的QQ好友,只能有一个聊天窗口是被激活的。Excel也一样,当前被激活的工作薄就是ActiveWorkbook对象(同样类似地,也有ActiveWorksheet对象)。

有些情况下,ThisWorkbook等同于ActiveWorkbook,但有些情况下并不是的。如以下代码:

Sub workbook_operate()

    ' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String fname = "E:/temp/ActiveMe.xlsx"
' 根据工作薄文件路径获取工作薄对象
Set wbk = Workbooks.Open(fname) Debug.Print ThisWorkbook.Name
Debug.Print ActiveWorkbook.Name
End Sub

运行结果:

因为新打开的工作薄会被处于激活状态(就跟手工打开另一个Excel文件一样),所以这时新打开的ActiveMe.xlsx才是ActiveWorkbook,而当前代码所在的工作薄(test.xlsm)则是ThisWorkbook。而如果只有一个工作薄被打开或者是当前代码所在工作薄处于激活状态时,则ThisWorkbook和ActiveWorkbook是同一个对象。


本系列教程其它文章

Excel VBA 入门(零)

Excel VBA 入门(一)数据类型

Excel VBA 入门(二)数组和字典

Excel VBA 入门(三) 流程控制1-条件选择

Excel VBA 入门(四)流程控制2-循环控制

Excel VBA 入门(五)Excel对象操作

Excel VBA 入门(六)过程和函数

Excel VBA 入门(七)注释、宏按钮及错误处理

Excel VBA 入门(八)单元格边框

Excel VBA 入门(九)操作工作薄

Excel VBA 入门(十)用户窗体开发

Excel VBA入门(九)操作工作薄的更多相关文章

  1. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  2. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  3. Excel VBA入门(七)注释、宏按钮及错误处理

    系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...

  4. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  5. Excel VBA入门(四)流程控制2-循环控制

    所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...

  6. Excel VBA入门(三) 流程控制1-条件选择

    VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...

  7. Excel VBA入门(一)数据类型

    与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...

  8. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  9. Excel VBA 入门(零)

    本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...

随机推荐

  1. 关于React setState的实现原理(一)

    前言 首先在学习react的时候就对setSate的实现有比较浓厚的兴趣,那么对于下边的代码,可以快速回答吗? class Root extends React.Component { constru ...

  2. 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

    本篇博客比较了常见的5种开源协议的异同,大家在为自己的代码选择协议的时候可以参考.现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http ...

  3. ios 加密解密工具类字符判断等

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface Helpers : NSObject ...

  4. linux磁盘分区格式化-fdisk命令工具

    本文主要讲述使用fdisk工具对磁盘进行分区和格式化的方法 首先要明确分区是针对磁盘进行的操做,磁盘分区会创建分区表,类似vda,sda的是磁盘,vda1,sda1的是分区 1.查看磁盘分区状态 1. ...

  5. python的pip源在windows和linux修改

    windows和linux修改python的pip源 https://www.cnblogs.com/cwp-bg/p/8497075.html windows和linux修改python的pip源 ...

  6. ajax请求返回Json字符串运用highcharts数据图表展现数据

    [1].[图片] Json字符串和highcharts数据图表展现.jpg 跳至 [1] code=26754#44745" rel="nofollow"> [2] ...

  7. vs2013突然没有代码提示功能了。

    工具->选项->文本编辑器->C++ ->高级->禁用IntelliSense设置 false 然后选确定.

  8. String的不变性到final在java中用法

    final在Java语言里面啥意思 final修饰一个类,那么这个类就是不可继承.string就是一个非常有名的被final修饰的类,不过他的更加有名的是“不可被修改”. 究竟什么是不可改变?stri ...

  9. C#操作 iis启用父目录

    iis6实现: DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer&quo ...

  10. CentOS 添加新硬件硬盘,扩展空间而无需重启虚拟机

    运行如下命令,通过重新扫描 SCSI (注:Small Computer System Interface 小型计算机系统接口)总线并添加 SCSI 设备,系统就可以扩展操作系统的物理卷磁盘空间,而且 ...