VBA基础,工作簿workbook相关的方法和属性
0 我觉得VBA和VB,VBS最大的区别就在A(application)上了
所以application里的 workbook , worksheet range ,cell等应该是VBA语言的核心,最复杂内容了
- 本身VBA里的VB语言部分,其实和很多语言语法结构也差不多
- 每种语言的差别
- 一在语法差别上。但差异应该不会太大
- 另外一个就在每种语言的对象系统上,包括各种对象,数据结构等等
1 工作簿相关方法---易报错总结
1.1 保存时的报错
- 保存save时,不能和已有文件名同名
- workbooks.saveas fullname (不能和同目录下已有的工作簿同名)
- workbooks.savecopyas fullname (不能和同目录下已有的工作簿同名)
1.2 创建时的报错
- 不允许直接 创建 .xlsm类的文件
1.3 打开文件时的报错
- 如果打开的文件不存在,会报错
- workbooks.open fullname 如果文件不存在会报错
- EXCEL如果save的格式和实际excel版本的格式不同,会警告文件格式不同,暂时可无视之
1.4 修改文件时的报错
- 如果读取和修改工作簿内容,但是工作簿没有打开,会报错 下标越界
2 VBA 和 Application--Excel下的命名系统
2.1 workbooks 工作簿有fullname属性
fullname= path+ "\" + name
- ThisWorkbook.FullName 文件全名
- ThisWorkbook.Path 文件路径
- ThisWorkbook.Name 文件名
- ThisWorkbook.FullName = ThisWorkbook.Path + "\" + ThisWorkbook.Name
2.2 但是 fso下的file 没有fullname 属性,因为 file.path 就是完整名字了
- file.FullName 错误,没这个fullname属性
- file.Path 文件路径,就是文件全名
- file.Name 文件名
Sub test_wb11()
'比较wb的名字 和 一般file的名字Dim fso1 As Object
Dim fd1 As ObjectSet fso1 = CreateObject("scripting.filesystemobject")
Set fd1 = fso1.GetFolder(ThisWorkbook.Path)For Each i In fd1.FilesIf i Like "*.xlsm" ThenDebug.Print i.NameDebug.Print i.Path 'workbook工作簿的名字不一样Debug.Print i.Path & "\" & i.Name '这样做重复而多余
' Debug.Print i.FullName '会报错End If
Next
Debug.Print ""For Each j In WorkbooksDebug.Print j.NameDebug.Print j.PathDebug.Print j.FullName 'wb有fullname属性Debug.Print j.Path & "\" & j.Name 'wb工作簿的fullname=path+ "" + name 是有意义的NextEnd Sub
3 workbook 和 workbooks,对象和对象的集合
3.1 workbook是对象
- 工作簿是EXCEL的对象之一
- workbook 只能指代 每个单独的workbook
- 特殊workbook的用法
- thisworkbook
- activeworkbook
3.2 workbooks是EXCEL的属性,也表示excel下所有workbook的集合
- 工作簿的集合,其实是Application的属性 application.workbooks
- workbooks (即代表 application.workbooks)
- 比如Workbooks.Add 等于 Application.Workbooks.Add
3.3 对象只属于对象集合,而不属于上级对象
- 正确 for each wb1 in application.workbooks
- 错误 for each wb1 in application
- 错误 for each wb1 in application.workbook
4 workbooks.add 方法 (Application.Workbooks.Add)
- 表达式.Add(Template)
Workbooks.Add 方法 新建一个工作表。新工作表将成为活动工作表。
语法
表达式.Add(Template)
表达式 一个代表 Workbooks 对象的变量。
- 确定如何创建新工作簿。如果此参数为指定现有 Microsoft Excel 文件名的字符串,那么创建新工作簿将以该指定的文件作为模板。如果此参数为常量,新工作簿将包含一个指定类型的工作表。
- 模板类型为整数 int 比如1 就是工作簿,2是chart 表格
- 如果想创建多个表格,workbooks.add 本身好像不带数量参数
- 和循环嵌套使用,多次 workbooks.add
Sub test1_wb()'表达式.Add(Template)
'确定如何创建新工作簿。如果此参数为指定现有 Microsoft Excel 文件名的字符串,那么创建新工作簿将以该指定的文件作为模板。如果此参数为常量,新工作簿将包含一个指定类型的工作表。Workbooks.Add 1
Workbooks.Add (2)For i = 1 To 3Workbooks.Add
NextEnd Sub
- workbooks.add 会新建一个新工作薄
- 但是需要用 workbook.saveas fullname 保存才行
- 因为每次新建的工作簿刚好是激活的,所以用 activeworkbook.saveas fullname
Public Sub test_wb1()Debug.Print ThisWorkbook.Path
Debug.Print ThisWorkbook.FullName
Debug.Print ThisWorkbook.NameApplication.Workbooks.Add
ActiveWorkbook.SaveAs "C:\Users\Administrator\Desktop\t2.xls"Workbooks.Add
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t3.xls"End Sub
5 workbook的保存 save saveas savecopyas
5.1 语法
5.1.1 文件保存
FN+F1帮助系统
Workbook.Save 方法
- 保存对指定工作簿所做的更改。
- 语法
- 表达式.Save
- 表达式 一个代表 Workbook 对象的变量。
5.1.2 文件另存为 (这种方法另存为的文件不会关闭)
在另一不同文件中保存对工作簿所做的更改。(对新建的wb文件,是第一次保存)
workbook.saveas
表达式 一个代表 Workbook 对象的变量。
表达式.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
5.1.3 文件另存为 savecopyas (另外为的文件会自动关闭)
- Workbook.SaveCopyAs 方法
- 将指定工作簿的副本保存到文件,但不修改内存中的打开工作簿。
- 语法
- 表达式.SaveCopyAs(Filename)
- 表达式 一个代表 Workbook 对象的变量。
5.2 文件保存的3种方式,新建文件要用saveas
- save
- 只是保存文件内容,文件如果是新建的,未保存文件本身。已经保存路径的文件自动保存。
- saveas fullname
- savecopyas fullname
- 将文件的副本另外为一个新文件,文件本身如果是新建的,仍然没保存本身。
Public Sub test_wb2()Application.Workbooks.Add
ActiveCell = 1
ActiveWorkbook.SaveWorkbooks.Add
ActiveCell = 11
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t2.xls"Workbooks.Add
ActiveCell = 111
ActiveWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & "t3.xls"End Sub
5.3 文件保存时的报错
- 如果保存的文件名重复,会报错
5.4 文件保存时,文件类型的报错
- 如果选择保存的是 .xlsm 会报错
- 可能是因为安全等级的原因,不让直接创建xlsm这种后缀名文件
5.5 文件保存的格式如果和实际EXCEL的版本不一致,会在打开时被警告
但实际上无所谓,比如保存为 .xls 文件,而实际EXCEL最新格式是 .xlsx,两者不一致所以警告
5.6 保存时, 参数可以写在括号内,或者是跟在 方法 后面写
Sub test_wb4()Workbooks.Add
ActiveWorkbook.ActiveSheet.Range("a2") = a2 '错误例子,因为a2是变量,值为""
ActiveWorkbook.ActiveSheet.Range("a3") = "a3"
ActiveWorkbook.Save
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t4.xlsx"
ActiveWorkbook.SaveCopyAs (ThisWorkbook.Path & "\" & "t5.xlsx")End Sub
6 workbooks.open 工作簿必须先打开才可以操作内容
6.1 打开工作簿
- Workbooks.Open 方法,打开一个工作簿。
- 语法
- 表达式.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
- 表达式 一个代表 Workbooks 对象的变量。
6.2 workbooks.open ()
- workbooks.open 参数
- workbooks.open (参数) '现在发现参数大于1个就不行
Public Sub test_wb3()path1 = ThisWorkbook.Path'Application.DisplayAlerts = False '这个声明的生命周期也应该在sub内,有啥必要非在sub结尾前关闭掉?多此一举把Workbooks.Add
'参数只有1个时,括号写法和非括号写法都可以
ActiveWorkbook.SaveAs path1 & "\" & "t3.xlsx"
ActiveWorkbook.SaveAs (path1 & "\" & "t3.xlsx")
ActiveWorkbook.CloseWorkbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t2.xlsx", Password:=123
ActiveWorkbook.SaveAs Filename:=path1 & "\" & "t2.xlsx", Password:=123
'参数超过1个时,不能用括号写法,会报错
'ActiveWorkbook.SaveAs (path1 & "\" & "t2.xlsx", Password:=123)
'ActiveWorkbook.SaveAs (Filename:=path1 & "\" & "t2.xlsx", Password:=123)
ActiveWorkbook.CloseWorkbooks.Open (path1 & "\" & "t3.xlsx")
Workbooks("t3.xlsx").CloseWorkbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a1") = "aaa"
Workbooks("t2.xlsx").Save
Workbooks("t2.xlsx").CloseEnd Sub
6.3 前台打开和后台打开
- 工作簿的打开:工作簿如果没打开,操作其中内容,会提示 下标越界
- 前台打开
- 后台打开
6.4 如果想修改 未打开的工作簿里的内容--会报错:下标越界
6.5 新建工作簿,先打开工作簿,写内容,保存,再关闭工作簿
"修改---保存---关闭" 就会尽量少出现弹窗
- 读取和修改工作簿内容前,必须先打开工作簿
- 可以每打开一个工作簿就关闭这个,避免蹦出很多工作簿
Public Sub test_wb3()path1 = ThisWorkbook.PathWorkbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t2.xls"
ActiveWorkbook.Close
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t3.xls"
ActiveWorkbook.CloseWorkbooks("test1.xlsm").ActiveSheet.Range("a1") = "abc"Workbooks.Open path1 & "\" & "t2.xls"
Workbooks("t2.xls").ActiveSheet.Range("a1") = "abc123111"
Workbooks("t2.xls").CloseWorkbooks.Open path1 & "\" & "t3.xls"
Workbooks("t3.xls").ActiveSheet.Range("a1") = "abcde12345111"
Workbooks("t3.xls").CloseEnd Sub
7 workbooks.open 打开文件和输入密码
- 文件新建保持时可以加密码
- 文件打开时需要输入密码才可以打开
- workbooks.saveas (finename:=)path & "\" & "t1.xls" ,password:="123"
- workbooks.open finename:=path & "\" & "t1.xls" ,password:="123"
Public Sub test_wb3()path1 = ThisWorkbook.PathWorkbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t2.xls", Password:=123
ActiveWorkbook.Close
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t3.xls", Password:=123
ActiveWorkbook.CloseWorkbooks("test1.xlsm").ActiveSheet.Range("a1") = "abc"Workbooks.Open path1 & "\" & "t2.xls", Password:=123
Workbooks("t2.xls").ActiveSheet.Range("a1") = "abc123111"
Workbooks("t2.xls").CloseWorkbooks.Open path1 & "\" & "t3.xls", Password:=123
Workbooks("t3.xls").ActiveSheet.Range("a1") = "abcde12345111"
Workbooks("t3.xls").CloseEnd Sub
8 重复打开工作簿----现在版本的EXCEL只要 修改内容先保存,重复打开也没事
"修改---保存---关闭" 就会尽量少出现弹窗
- 现在版本的EXCEL,可以重复打开已经打开的EXCEL文件
- 如果现在已经打开的 文件,有修改未保存的内容,会提示你,再次打开会丢失这些未保存内容---解决办法就是先save
- 如果希望自动化程度更高,去掉一些弹窗,就加上这句话
- Application.DisplayAlerts=false
Public Sub test_wb3()path1 = ThisWorkbook.Path'Application.DisplayAlerts = False '这个声明的生命周期也应该在sub内,有啥必要非在sub结尾前关闭掉?多此一举把Workbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a1") = "aaa"
Workbooks("t2.xlsx").SaveWorkbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a2") = "bbb"
Workbooks("t2.xlsx").SaveWorkbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a3") = "cccc"
Workbooks("t2.xlsx").SaveEnd Sub
9 先判断一个工作簿是否打开? (打开了一定常驻在内存里了)
因为工作簿如何已经打开了
取内存中的工作簿,然后比较工作簿名字即可,找一个工作簿是否打开
现在版本的EXCEL已经不要求,文件不可重复打开了,所以这种检查不是很有必要。
Sub test_wb5()
'这样是取内存中的工作簿,已经打开的工作簿才能统计到For Each i In Application.WorkbooksDebug.Print i.NameIf i.Name = "" ThenDebug.Print "xx工作簿已经打开"End If
NextFor j = 1 To Application.Workbooks.CountDebug.Print Workbooks(j).Name
NextEnd Sub
10 取某个文件夹下的工作簿数量
10.1 方法1:用fso方法,取folder和files ,其实还只是类 "xlsm" 之类的文件数量
不支持 file.open 打开
Sub test_wb6()
'取某个文件夹下的工作簿数量Dim fso1 As Object
Dim fd1 As ObjectSet fso1 = CreateObject("scripting.filesystemobject")
Set fd1 = fso1.GetFolder(ThisWorkbook.Path)For Each i In fd1.FilesIf i Like "*.xlsm" ThenDebug.Print i.Name
' i.Open '不支持这么打开End If
Next
End Sub
但是可以用这种方法打开, workbooks.open
Sub test_wb6()
'取某个文件夹下的工作簿数量Dim fso1 As Object
Dim fd1 As ObjectSet fso1 = CreateObject("scripting.filesystemobject")
Set fd1 = fso1.GetFolder(ThisWorkbook.Path)For Each i In fd1.FilesIf i Like "*.xlsm" ThenWorkbooks.Open i.PathWorkbooks(i.Path).ActiveSheet.Range("c1") = 666End If
Next
End Sub
10.2 方法,用dir的方法遍历文件
Sub test_wb7()'dir不返回对象,返回字符串
fd1_name = Dir(ThisWorkbook.Path, vbDirectory)
Debug.Print fd1_namef1_name = Dir(ThisWorkbook.Path & "\" & "*.xlsm") '通配符查某类型文件
Debug.Print f1_name '只查找一个文件
'每次继续执行一次dir 指针会往下移动一次'没有条件变化的do loop ,是无限死循环
'Do While Not f1_name = ""
' Debug.Print f1_name
'LoopDo While Not f1_name = ""Debug.Print f1_namef1_name = Dir
LoopEnd Sub
11 关闭文件 workbooks().close 或 activeworkbook.close
- 基本语法
- Workbook.Close 方法,关闭对象。
- 语法
- 表达式.Close(SaveChanges, Filename, RouteWorkbook)
- 表达式 一个代表 Workbook 对象的变量。
- 具体举例
- workbooks().close
- activeworkbook.close
- thisworkbook.close
- workbooks().close savechange:=true
Sub test_wb20()Workbooks.Add
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t2.xlsx"
Workbooks("t2.xlsx").ActiveSheet.Range("c5") = 9999
Workbooks("t2.xlsx").CloseWorkbooks.Open ThisWorkbook.Path & "\" & "t2.xlsx"
Workbooks("t2.xlsx").ActiveSheet.Range("c6") = 100000
Workbooks("t2.xlsx").Close savechanges:=TrueEnd Sub
和上面代码的区别
- 是close的时候可以保存为一个新的文件--新工作簿,修改
- 原文件夹本身,不做修改
- 可见t2里只有9999,而t3里有9999和 10000
Sub test_wb21()Workbooks.Add
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t2.xlsx"
Workbooks("t2.xlsx").ActiveSheet.Range("c5") = 9999
Workbooks("t2.xlsx").CloseWorkbooks.Open ThisWorkbook.Path & "\" & "t2.xlsx"
Workbooks("t2.xlsx").ActiveSheet.Range("c6") = 100000
Workbooks("t2.xlsx").Close savechanges:=True, Filename:=ThisWorkbook.Path & "\" & "t3.xlsx"End Sub
VBA基础,工作簿workbook相关的方法和属性相关推荐
- 工作簿(Workbook)基本操作应用示例
Workbook对象代表工作簿,而Workbooks集合则包含了当前所有的工作簿.下面对Workbook对象的重要的方法和属性以及其它一些可能涉及到的方法和属性进行示例介绍,同时,后面的示例也深入介绍 ...
- 工作簿(Workbook)基本操作应用示例(一)
工作簿(Workbook)基本操作应用示例(一) Workbook对象代表工作簿,而Workbooks集合则包含了当前所有的工作簿.下面对Workbook对象的重要的方法和属性以及其它一些可能涉及 ...
- Excel取消工作簿密码【忘记工作簿密码的解决方法】
忘记密码,怎么取消Excel工作簿密码 excel可设置三种类型密码 1)文件密码 2)工作表密码 3)工作簿密码 本文给出忘记工作簿密码的解决方法. 设置了工作簿密码,如图 解决方法 1.打开要解密 ...
- 关于Excel下通过VBA实现工作簿文件下工作表的合并
对于普通使用者而言,Excel是一个比较强大的数据处理工具.一般公司的普通职员常使用它来完成数据的录入分析,但是当面对处理经由多人按统一模板统计完成的录入数据分析时,数据将分散存放在多个.xlsx文件 ...
- vba 跨工作簿运行模块
vba中,使用Call程序名,是使用当前工作簿中的程序,若要运行其他工作簿的程序,则要使用(要先打开这个工作簿) plication.Run "'b.xls'!模块1.宏1" 除此 ...
- java使用POI5.0生成简易Excel工作簿的一种方法
先贴一下poi相关jar包的链接 https://poi.apache.org/download.html#POI-5.0.0 官网地址 <!-- https://mvnrepository.c ...
- 通过VBA将一个工作簿中的多个工作表拆分为多个工作簿,以工作表名称命名工作簿
前提:电脑上装有office2007或office2013等,WPS不行. 1.如果你有现成的一个工作簿含有多个工作表的文件,想分成多个工作簿的话, 可以通过office2007或office2013 ...
- VBA将工作簿中的所有工作表的内容输出到一个工作表中
主体是对该工作簿中所有的工作表进行遍历,然后将内容依次输出到一个工作表中. 下面看代码: Rem 将多个工作表中的内容汇总到一个工作表中 Sub collect()Rem 定义要循环的工作表和拿来去循 ...
- 如何通过 vba 获取工作簿所有sheet的名称 给出代码示例
你可以使用下面这段代码来获取Excel工作簿中所有sheet的名称:Sub 获取工作簿Sheet名称() Dim i As Integer For i = 1 To Sheets.Count Debu ...
最新文章
- java------LinkedHashMap
- LVM逻辑卷管理测试——创建逻辑卷
- Binary Tree Nodes(单表多实例查询)
- abap 判断当前用户是否有某事物码权限
- C和指针之字符串实现my_strrchr(char *str, int ch)的函数
- 驱动备份工具哪个好_大庆seo排名优化推广公司工具哪个好
- Fast Paxos
- 人间清醒!哈佛女硕士相亲平台找对象,霸气回应:扩大未来伴侣“候选人”样本!...
- linux mint 设置分辨率,Vmware中装Linux Mint 15 添加 1600x900分辨率
- (C语言)猴子选大王
- 免费分享一套狂雨小说cms采集规则
- C4D插件X-Particles粒子特效(二)
- 基于ZFC公理系统的无穷小微积分学
- 流刷新函数:fflush()的介绍和用法
- gds文件 导出_GaussDB 200使用GDS服务导入导出数据
- Android中如何获取当前apn接入点并切换?
- VM+Lamp环境搭建
- ByPass UAC
- 谷粒商城-商城业务(商品上架)
- Java101班1组作业完成情况