7.2 工作簿对象
一个Excel 2007文件就是一个工作簿对象,工作簿是工作表和图表的容器。用户对Excel的操作都会涉及到工作簿,本节主要讲述了工作簿的引用方法和对工作簿的基本操作。
7.2.1 工作簿的引用方式
工作簿对象Workbook是Workbooks集合中的一员,Workbooks集合表示当前正在运行的多个Excel文件。在VBA代码中可以用多种方式来表示工作簿。
● 以工作簿的名称来引用,表示方式为Workbooks(工作簿名称)。
● 以工作簿索引号来引用,表示方式为Workbooks(索引号)。
● 以非特定引用方式来引用。
1. 以名称方式引用
所谓工作簿的名称就是Excel文件的文件名,例如“test.xls”就是一个文件名,也是一个工作簿的名称。如果将工作簿看做一个对象,那么工作簿的名称实际上就相当于工作簿对象的Name属性值。以名称方式引用工作簿通常用于同时打开多个Excel文件的情况。
例如用户打开了book1.xlsx和book2.xlsx,在模块中用下述代码可以使得book1.xlsx成为当前活动工作簿。
Workbooks("book1.xlsx").Activate
Workbooks("book1.xlsx")就表示引用了名为“book1.xlsx”的工作簿,Activate表示激活该工作簿,使得其成为当前活动工作簿,也就是用户可以编辑的工作簿。只有已经打开的工作簿才能被激活。
说明
虽然工作簿的名称就是其Name属性值,但这是一个只读属性,不能用代码直接更改工作簿的Name属性值,要更改工作簿的名称需要使用SaveAs方法(也就是“另存为”的方法)。
2. 以索引号方式引用
当同时打开多个工作簿的时候,在工作簿集合中就按照创建或者打开工作簿的顺序来表示这些工作簿。索引号是从1开始计数的。例如Workbooks(1)表示最先创建或者打开的工作簿,Workbooks(2)表示第2个创建或者打开的工作簿,以此类推。以索引号的方式引用工作簿通常用于同时打开多个Excel文件的情况。
例如用户首先打开了book1.xlsx,然后打开了book2.xlsx,在模块中用下述代码可以使得book1.xlsx成为当前活动工作簿。
Workbooks(1).Activate
如果用户同时打开了很多的工作簿,那么他是很难知道那个工作簿先打开,哪个工作簿后打开,每个打开的工作簿的索引号为多少。需要使用代码来测试索引号和工作簿名称。
例7-02:用户为了要从“北岸中学.xls”和“潭渡中学.xls”两张工作簿中提取数据,先后打开了这两张工作簿。利用以下代码了解各个工作簿的索引号和对应工作簿名称,并将内容放置在工作表内。
#001: Sub工作簿名称和索引号演示() #002: Dim i As Integer #003: Dim wb As Workbook #004: i = 1 #005: For Each wb In Workbooks #006: Cells(i, 1) = i #007: Cells(i, 2) = wb.Name #008: i = i + 1 #009: Next #010: End Sub
第2行代码声明了一个变量i,该变量的作用可以记录索引号和表示行号。第3行代码声明了一个名为wb的工作簿对象变量。第4行代码为变量i赋初值。第5行到第9行代码使用了For each……Next循环,这种循环方式特别适合于遍历集合中成员。在代码中wb是Workbooks集合中的一员,第7行代码用Name属性值表示了工作簿的名称。
上述代码运行的结果如图7-5所示。
图7-5 工作簿的索引号和名称
从打开的顺序可以看出先打开的是Excel 2007,所产生的工作簿为Book1,由于工作簿尚未保存,因此还没有扩展名。索引号为2的“北岸中学.xls”表示其是第二张被打开的工作簿,“潭渡中学.xls”其最后被打开,索引号为3。
说明
工作簿的索引号只和创建或打开的顺序有关,工作簿激活不会影响到工作簿的索引号。
3. 非特定引用方式
非特定引用方式包括了使用Thisworkbook和Activebook。
● Thisworkbook:表示的是VBA代码所在的工作簿。
● Activebook:表示的当前活动工作簿。
使用非特定引用方式的好处就在于可以不管工作簿的具体名称和索引号,即使工作簿的名称发生改变或者索引号发生变化也不需要更改代码。
7.2.2 新建和打开工作簿
要对工作簿进行操作首先要新建一个工作簿或者是打开已有的工作簿。
1. 新建工作簿
为集合中添加一个新成员都是采用Add方法。作为工作簿集合来说也不例外,可以使用工作簿集合的Add方法,其语法结构为:
Workbooks.Add
不过通过上述方式添加所得的工作簿只是一个尚未保存,没有具体名称的工作簿。通常在创建工作簿的时候还需要为工作簿创建名称,设置其他属性。
例7-03:利用VBA代码新建一个工作簿,并将工作簿的名称设置为“销售记录.xls”,工作簿保存在C盘根目录下,为该工作簿设置访问密码1234。
#001: Sub工作簿名称和索引号演示() #002: Dim wb As Workbook #003: Set wb = Workbooks.Add #004: wb.SaveAs "c:\销售记录.xls" #005: wb.Password = "1234" #006: End Sub
第2行代码设置了一个名为wb的工作簿对象变量名,第3行代码利用Workbooks.Add创建了一个新的工作簿,并将该工作簿赋值给对象变量wb。由于工作簿的Name属性是只读的,用户无法通过更改Name属性值的方法来更改工作簿的名称,因此第4行代码利用工作簿的SaveAs方法来更改工作簿名称和Excel文件的保存位置。第5行代码为工作簿设置了一个访问密码。
2. 打开工作簿
打开工作簿使用的是工作簿集合的Open方法。其语法结构为:
表 达 式 .Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
Open方法一个非常复杂的方法,它包含有15个参数。Open方法所涉及的所有参数都是可选参数,各参数的含义如表7-1所示。
表7-1 Open方法各参数含义
不过实际应用中很少会有用户同时用到如此多的参数,大多数时候用户打开文件使用到的只有FileName、Readonly和Password等参数。
例7-04:以只读的方式打开上例所创建的工作簿“销售记录.xls”。
#001: Sub打开工作簿演示() #002: Workbooks.Open Filename:="c:\销售记录.xls", ReadOnly:=True, Password:="1234" #003: End Sub
第2行代码使用了Workbooks的Open方法来打开工作簿。FileName参数表示要打开的工作簿的位置。Readonly参数的值为True表示以只读的方式打开。Password参数表示打开工作簿时所需要的访问口令。
7.2.3 保存工作簿
在Excel 2007中保存工作簿通常有如下3种可能的操作方式。
● 第一种是初次保存文件,此时会打开“另存为”对话框,设置文件名和保存文件类型来保存工作簿。
● 第二种是对于已经保存过的文件需要以其他的文件名或者文件类型保存,此时需要通过单击工作簿中的Office按钮,执行“另存为”命令,打开“另存为”对话框来保存工作簿。
● 第三种是对已经保存的工作簿用户通过按键盘上的CTRL+S组合键来或者单击选项卡内的“保存”按钮来保存数据。
1. 使用SaveAs保存工作簿
在VBA中描述保存工作簿使用的是SaveAs方法和Save方法。在第一和第二种方式中需要打开“另存为”对话框,就用“工作簿.SaveAs”的方法来保存。第三种方式,仅仅是保存已经被保存过的工作簿则直接使用“工作簿.Save”方法即可。
SaveAs也是一个相当复杂的方法,其语法结构如下所示:
表 达 式 .SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
SaveAs方法的所有参数都是可选参数,各参数的含义如表7-2所示。
表7-2 SaveAs方法各参数含义
用户的保存代码也很少包括全部的参数,一般需要设置的参数包括了FileName参数来保存文件名和文件路径。如果仅仅设置了工作簿的名称,而没有设置工作簿的具体保存路径,那么系统会自动将工作簿保存在当前文件夹中。设置FileFormat参数来表示文件保存的格式,设置PassWord参数表示设置打开工作簿的密码。
例7-05:将当前工作簿另存为C盘下的“库存记录.xlsm”文件,并设置打开工作簿的密码是“123456”。
#001: Sub保存工作簿() #002: ThisWorkbook.SaveAs Filename:="c:\库存记录.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, Password:="123456" #003: End Sub
第2行代码中,Thisworkbook表示VBA代码所在的工作簿,对该工作簿使用了SaveAs方法来完成“另存为”操作。FileName参数设置了工作簿的名称和保存位置;FileFormat规定了工作簿的保存文件类型;Password参数定义了今后要打开该文件时所需要的密码。
说明
如果仅仅是要保存工作簿,而不使用“另存为”对话框,那么可以讲第2行代码更改为“ThisWorkbook.Save”即可。
2. 使用“另存为”对话框
在SaveAs方法中直接书写保存文件路径和文件名的方法并不常用,因为用户更多的是希望使用“另存为”对话框来完成这样的任务。
例7-06:另存为当前工作簿,要求使用“另存为”对话框来保存文档。
#001: Sub使用另存为对话框() #002: Do #003: fname = Application.GetSaveAsFilename #004: Loop Until fname <> False #005: ThisWorkbook.SaveAs Filename:=fname,FileFormat:= xlOpenXMLWorkbookMacroEnabled, Password:="123456" #006: End Sub
第2行代码到第4行代码使用了一个循环来判断用户是否单击了“另存为”对话框中的“取消”按钮。如果用户单击了“另存为”对话框中的取消按钮,那么“另存为”对话框会一直显示,直到用户选择了保存位置和文件名并单击“确定”按钮为止。
第3行代码就是打开了“另存为”对话框,如果用户在另存为对话框中输入内容,那么fname变量将会保存对话框中的路径和文件名,如果用户单击了“另存为”对话框中的取消按钮,那么fname变量的值为False。
第5行代码用SaveAs来另存文档,保存的文件路径就是变量fname的值。该值是“另存为”对话框所确定的。
7.2.4 保护工作簿
在前述例子中,用户在保存文件的时候为工作簿设置了密码,这个密码就是打开文件的密码,当用户打开这些包含密码的工作簿时,Excel 2007会要求用户提供密码,这样使得只有特定的用户才能看到工作簿的内容,而那些无关用户将无法看到任何的内容。
保护工作簿要完成的功能则不同。保护工作簿要完成的任务是保护工作簿的结构和内容不被更改。普通用户可以打开工作簿,但是只能浏览工作簿的内容却无法更改工作簿。保护工作簿使用的是Workbook对象的Protect方法,其语法结构为:
表达式.Protect(Password, Structure, Windows)
Protect方法的参数含义如表7-3所示。
表7-3 Protect方法各参数含义
例7-07:对代码所在的工作簿提供保护,使得用户无法移动工作簿中各个工作表的位置。
#001: Sub保护工作簿演示() #002: ThisWorkbook.Protect Password:="1234", structure:=True #003: End Sub
第2行代码设置了保护密码,并将structure参数的值设置为True,使得用户无法更改当前工作簿中各个工作表的位置。
解除对工作簿的保护使用的是UnProtect方法,其语法结构为:
表达式.Unprotect(Password)
Unprotect中所包含的Password参数就是在Protect方法中所设置的Password参数值。
例7-08:使用代码,解除对代码所在工作簿所提供的保护。
#001: Sub接触保护工作簿演示() #002: ThisWorkbook.Unprotect Password:="1234" #003: End Sub
第2行代码就使用了Unprotect方法来接触对工作簿的保护。此时用户就可以更改工作簿中各个工作表的位置。
7.2.5 关闭工作簿
关闭工作簿使用的是Close方法。其语法结构是:
表达式.Close(SaveChanges, Filename, RouteWorkbook)
Close方法比较简单,涉及到3个参数,这3个参数都是可选参数,其含义如表7-4所示。
表7-4 Close方法参数含义
如果要关闭的工作簿是VBA代码是所在的工作簿就可以使用“ThisWorkbook.Close”来表示。
例7-09:使用代码来关闭工作簿并在关闭的同时保存工作簿。
#001: Sub关闭工作簿() #002: ThisWorkbook.Close savechanges:=True #003: End Sub
第2行代码通过了Close方法关闭了工作簿,并关闭时保存文档。
通过上述方式关闭的仅仅是工作簿,而并没有退出Excel程序。用户同时按下键盘上的Ctrl+Alt+Delete组合键,打开如图7-6所示的“Windows任务管理器”窗口,切换到“进程”选项卡,在进程中依然可以看到“Excel.EXE”项,表示虽然关闭了工作簿,但是Excel程序仍然在运行,不过此时没有加载任何工作簿而已。
图7-6 退出程序前后的进程比较
如果要退出应用程序可以使用程序Application对象的Quit方法。
例7-10:使用代码彻底退出Excel程序。
#001: Sub退出Excel程序() #002: Application.Quit #003: End Sub
第2行代码使用了Application对象的Quit方法退出Excel程序,使用该行代码后,在图7-6所示的进程中不再存在“Excel.EXE”项。