Excel VBA入门(九)操作工作薄
虽然我前面讲过,在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入门(九)操作工作薄的更多相关文章
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
- Excel VBA入门(七)注释、宏按钮及错误处理
系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...
- Excel VBA入门(六)过程和函数
前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...
- Excel VBA入门(四)流程控制2-循环控制
所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...
- Excel VBA入门(三) 流程控制1-条件选择
VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...
- Excel VBA入门(一)数据类型
与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...
- Excel VBA入门(二)数组和字典
数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...
- Excel VBA 入门(零)
本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...
随机推荐
- LINUX 设置交换分区的大小
创建交换分区目录 mkdir /data1/mnt/ 卸载当前交换分区 swapoff /data1/mnt/10GB.swap 设置交换分区为 5Gdd if=/dev/zero of=/data1 ...
- 替换国内yum源以及pip源
因为一些原因,不论是网络还是啥啥啥的原因,国外的源访问时不时的很慢,这时候我们就可以将国外的源替换为国内源,提高下载速度. yum源替换 环境:centos7(如果你的发行版本不是这个,此方法不保证能 ...
- 【liunx】telnet命令
telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...
- 使用rollup 开发专业js library
rollup 是一个不错的javascript 模块打包器,一般我们用来构建library 安装 npm install -g rollup 参考集成jquey && shortid ...
- ballerina 学习十八 事务编程
事务在分布式开发,以及微服务开发中是比较重要的 ballerina 支持 本地事务.xa 事务.分布式事务 ,但是具体的服务实现起来需要按照ballerian 的事务模型 infection agre ...
- Dictionary字典类介绍
说明 必须包含名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而值不 ...
- UDP的connect
UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...
- .NET委托解析(异步委托)
上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...
- log4net 极简配置
log4net的配置详解 分类: C#2013-10-01 22:45 5335人阅读 评论(4) 收藏 举报 log4net日志框架 前言:没买到1号回家的票,所以在祖国64岁生日之 ...
- bzoj 3159: 决战
Description 树上链翻转,链加,查询链上的和/max/min 树链剖分套treap,修改查询可以用类似线段树的写法,翻转可以利用分裂合并和翻转标记实现,时间复杂度O(nlog2n) 实测除了 ...