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,依然找到"文件"->"选项"->"自 ...
随机推荐
- 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- MarkDown格式作业模板
发布的随笔可复制下面的MarkDowm模板 注意事项 标题第XX次作业替换成相应的第一次作业.第二次作业...... 代码托管的链接一定要换成自己的项目 码云提交历史截图必须是自己每周的提交截图 #& ...
- mt7601u: probe of xxxx failed with error -2
/************************************************************************ * mt7601u: probe of xxxx f ...
- [QT_FFMPEG]学习问题: 刚开始移植ffmpeg,测试时出现 undefined reference to `avcodec_configuration()'
使用环境: window: win7 x64 QT: qt5.8.0 MinGW530 移植的教程: 流若浅 Qt ffmpeg环境搭建 : http://www.cnblogs.com/liuru ...
- python functiontools 模块
一个内置的模块. 作用是实现了更多的功能, 同时形式上显得很简洁. 虽然在使用很方便, 但其中的原理还是很难复杂的. ------------------------------------- ...
- Linux中epoll+线程池实现高并发
服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...
- socket编程---UDP
头文件 #include <sys/types.h> #include <sys/socket.h> 函数原型 int sendto (int s, const void *b ...
- FastAdmin 的前端环境怎么安装?
FastAdmin 的前端环境怎么安装? 安装 Git 安装 Node.js 安装 cnpm 安装 bower 开始安装 FastAdmin 的前端组件 bower install bower upd ...
- ffmpeg 从内存中读取数据(或将数据输出到内存)(转)
更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...