VBA基础,工作簿workbook相关的方法和属性

article/2025/9/8 21:31:51

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

 


http://chatgpt.dhexx.cn/article/cLf1GvIp.shtml

相关文章

Python操作excel文件创建workbook和批量创建Sheet

第一步,创建workbook和sheet from openpyxl import WorkbookwbWorkbook() wb.create_sheet(index1,title"sheet2")wb.save(test1.xlsx)创建成功,workbook 名称test1,有sheet 和sheet2两张表 第二步,批量创建多个sheet …

SpringBoot使用Workbook读取excel中内容

SpringBoot使用Workbook读取excel中内容 maven文件中导入依赖 获取excel文件 FileInputStream fileInputStream new FileInputStream("文件路径");获取Workbook对象 Workbook workbook new XSSFWorkbook(fileInputStream);获取Sheet对象 Sheet sheet workbook.…

已解决ModuleNotFoundError: No module named ‘Workbook‘

已解决(python xlwt库写入Excel表格报错)ModuleNotFoundError: No module named ‘Workbook‘ 文章目录 报错代码报错翻译报错原因解决方法千人全栈VIP答疑群联系博主帮忙解决报错 报错代码 粉丝群里的一个小伙伴,想用xlwt库写入Excel表格的…

【干货】Python:load_workbook用法(持续更新)

【干货】Python中load_workbook用法(持续更新) 功能方法示例文件模块读取导入excel表格获取Sheet查看行与列查看单元格批量访问数据 功能 读取excel文件,并进行操作 方法 示例文件 本文用到的示例文件为一个excel表格,含有名为…

【Python_笔记】openpyxl中Workbook()和.load_workbook()区别

记录学习旅程~ 欢迎各位道友指教与交流~ 准备开始实操时发现一个问题,即Workbook()是创建一个类对象,而load_workbook()是一个方法加载存在的excel。 由于在学习openpyxl时吸取了不同教程,按照读取→编辑→再编辑→保存的逻辑列举了常用的基…

POI(excel)中WorkBook和Sheet应用实践总结

WorkBook定义 工作簿的高级表现形式,是sheet的上级对象。一个excel就是一个工作簿,一个工作簿含有多个工作表(sheet)。 【1】WorkBook两种创建形式 ① 使用直接对象 // 03版本 .xls org.apache.poi.hssf.usermodel.HSSFWorkbook or //07版本 .xls…

Java多线程:Executors

Executors类位于java.util.concurrent包下,提供了一些方便构建ThreadPoolExecutor和线程管理的方法。 主要方法有以下几个: 1.创建一个固定大小的线程池 public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecu…

【Java多线程】线程池【ExecutorServicec和Executors】

➤ Java多线程编程【一文全解】 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大; 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放…

为什么不建议用Executors创建线程池???

来源 | www.cnblogs.com/zjfjava/p/11227456.html 01、通过Executors创建线程池的弊端02、通过ThreadPoolExecutor创建线程池03、ThreadPoolExecutor参数解释04、corePoolSize & maximumPoolSize05、keepAliveTime & unit06、等待队列07、拒绝策略08、ThreadPoolExecut…

Executors和ThreadPoolExecutor详解

概述 在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资…

4.Executor执行器

1.Executor 主体结构 Executor是MyBatis执行者接口,执行器的功能包括: 基本功能:改、查,没有增删的原因是,所有的增删操作都可以归结到改。缓存维护:这里的缓存主要是为一级缓存服务,功能包括…

ExecutorService

本文翻译自http://tutorials.jenkov.com/java-util-concurrent/executorservice.html,人工翻译,仅供学习交流。 ExecutorService java.util.concurrent.ExecutorService接口是一种能够在后台并发执行任务的异步执行机制。本文中,我将会介绍…

Executor概述

在Java类库中,任务执行的主要抽象不是Thread,而是Executor。 public interface Executor {void execute(Runnable command); }它为灵活且强大的异步任务执行框架提供了基础,该框架能支持多种不同类型的任务执行策略。它提供了一种标准的方法…

Executor框架简介

Executor系统中,将线程任务提交和任务执行进行了解耦的设计; 线程被一对一映射为服务所在操作系统线程,启动时会创建一个操作系统线程;当该线程终止时,这个操作系统线程也会被回收 Executor框架包含的核心接口和主要的实现类 具体…

Executors 源码解析(JDK8)

前言 本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定Java并发 正文 类注释 /*** Factory and util…

Executor框架

转载请以链接形式标明出处: 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战Java并发机制的底层实现原理Java内存模型Java并发编程基础Java中的锁的使用和实现介绍Java并发容器和框架Java中的12个原子操作类介绍Java中的并发工具类Java中的线程池E…

Executor执行器

分为四个模块: 1.动态代理MapperProxy 2.SQL会话SqlSesson 3.执行器Executor 4.JDBC处理器StatementHandler 现讲述为SQL会话与执行器 一、SQL会话SqlSesson 该门面模式提供一个统一的门面接口API 该模式提供的一个基本API为增删改查,还会提供提…

Java并发多线程编程——Executors类

目录 一、Executors的理解二、Executors类图结构二、Executors常用的方法三、线程池的创建分为两种方式(主要介绍通过Executors类创建的方式)1、newFixedThreadPool方法示例2、newSingleThreadExecutor方法示例3、newCachedThreadPool方法4、newSchedule…

Executors一篇就够

Executors框架包含的内容十分的多:看图: 一、各个接口的作用 按照图示关系进行介绍: Executor 该接口作为顶层接口只有一个execute()方法 execute(Runnable r) 该接口接受一个Runnable实例,即要执行的任务ExecutorService 该…

Executors工具类的相关方法

前言:大家好,我是小威,24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法,方便加深知识印象和复习使用。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬&a…