相关文章推荐
怕老婆的卤蛋  ·  C# 基本语法 | ·  1 月前    · 
酒量大的洋葱  ·  Winform ...·  3 月前    · 
气宇轩昂的西红柿  ·  c++ - ...·  1 年前    · 

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 Object Set fso1 = CreateObject("scripting.filesystemobject") Set fd1 = fso1.GetFolder(ThisWorkbook.Path) For Each i In fd1.Files If i Like "*.xlsm" Then Debug.Print i.Name Debug.Print i.Path 'workbook工作簿的名字不一样 Debug.Print i.Path & "\" & i.Name '这样做重复而多余 ' Debug.Print i.FullName '会报错 End If Debug.Print "" For Each j In Workbooks Debug.Print j.Name Debug.Print j.Path Debug.Print j.FullName 'wb有fullname属性 Debug.Print j.Path & "\" & j.Name 'wb工作簿的fullname=path+ "" + name 是有意义的 End 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 3
    Workbooks.Add
End Sub
  • workbooks.add  会新建一个新工作薄
  • 但是需要用   workbook.saveas   fullname  保存才行
  • 因为每次新建的工作簿刚好是激活的,所以用 activeworkbook.saveas  fullname
Public Sub test_wb1()
Debug.Print ThisWorkbook.Path
Debug.Print ThisWorkbook.FullName
Debug.Print ThisWorkbook.Name
Application.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.Save
Workbooks.Add
ActiveCell = 11
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "t2.xls"
Workbooks.Add
ActiveCell = 111
ActiveWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & "t3.xls"
End Sub
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.Close
Workbooks.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.Close
Workbooks.Open (path1 & "\" & "t3.xlsx")
Workbooks("t3.xlsx").Close
Workbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a1") = "aaa"
Workbooks("t2.xlsx").Save
Workbooks("t2.xlsx").Close
End Sub

6.3 前台打开和后台打开

  • 工作簿的打开:工作簿如果没打开,操作其中内容,会提示  下标越界
  • 前台打开
  • 后台打开

6.4 如果想修改 未打开的工作簿里的内容--会报错:下标越界

6.5 新建工作簿,先打开工作簿,写内容,保存,再关闭工作簿

"修改---保存---关闭" 就会尽量少出现弹窗

  • 读取和修改工作簿内容前,必须先打开工作簿
  • 可以每打开一个工作簿就关闭这个,避免蹦出很多工作簿
Public Sub test_wb3()
path1 = ThisWorkbook.Path
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t2.xls"
ActiveWorkbook.Close
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t3.xls"
ActiveWorkbook.Close
Workbooks("test1.xlsm").ActiveSheet.Range("a1") = "abc"
Workbooks.Open path1 & "\" & "t2.xls"
Workbooks("t2.xls").ActiveSheet.Range("a1") = "abc123111"
Workbooks("t2.xls").Close
Workbooks.Open path1 & "\" & "t3.xls"
Workbooks("t3.xls").ActiveSheet.Range("a1") = "abcde12345111"
Workbooks("t3.xls").Close
End 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.Path
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t2.xls", Password:=123
ActiveWorkbook.Close
Workbooks.Add
ActiveWorkbook.SaveAs path1 & "\" & "t3.xls", Password:=123
ActiveWorkbook.Close
Workbooks("test1.xlsm").ActiveSheet.Range("a1") = "abc"
Workbooks.Open path1 & "\" & "t2.xls", Password:=123
Workbooks("t2.xls").ActiveSheet.Range("a1") = "abc123111"
Workbooks("t2.xls").Close
Workbooks.Open path1 & "\" & "t3.xls", Password:=123
Workbooks("t3.xls").ActiveSheet.Range("a1") = "abcde12345111"
Workbooks("t3.xls").Close
End 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").Save
Workbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a2") = "bbb"
Workbooks("t2.xlsx").Save
Workbooks.Open path1 & "\" & "t2.xlsx", Password:=123
Workbooks("t2.xlsx").ActiveSheet.Range("a3") = "cccc"
Workbooks("t2.xlsx").Save
End Sub

9  先判断一个工作簿是否打开? (打开了一定常驻在内存里了)

  • 因为工作簿如何已经打开了

  • 取内存中的工作簿,然后比较工作簿名字即可,找一个工作簿是否打开

  • 现在版本的EXCEL已经不要求,文件不可重复打开了,所以这种检查不是很有必要。

Sub test_wb5()
'这样是取内存中的工作簿,已经打开的工作簿才能统计到
For Each i In Application.Workbooks
    Debug.Print i.Name
    If i.Name = "" Then
       Debug.Print "xx工作簿已经打开"
    End If
For j = 1 To Application.Workbooks.Count
    Debug.Print Workbooks(j).Name
End Sub

10  取某个文件夹下的工作簿数量

10.1 方法1:用fso方法,取folder和files ,其实还只是类 "xlsm" 之类的文件数量

不支持 file.open 打开

Sub test_wb6()
'取某个文件夹下的工作簿数量
Dim fso1 As Object
Dim fd1 As Object
Set fso1 = CreateObject("scripting.filesystemobject")
Set fd1 = fso1.GetFolder(ThisWorkbook.Path)
For Each i In fd1.Files
    If i Like "*.xlsm" Then
         Debug.Print i.Name
'         i.Open   '不支持这么打开
    End If
End Sub

但是可以用这种方法打开, workbooks.open

Sub test_wb6()
'取某个文件夹下的工作簿数量
Dim fso1 As Object
Dim fd1 As Object
Set fso1 = CreateObject("scripting.filesystemobject")
Set fd1 = fso1.GetFolder(ThisWorkbook.Path)
For Each i In fd1.Files
    If i Like "*.xlsm" Then
         Workbooks.Open i.Path
         Workbooks(i.Path).ActiveSheet.Range("c1") = 666
    End If
End Sub

10.2 方法,用dir的方法遍历文件

Sub test_wb7()
'dir不返回对象,返回字符串
fd1_name = Dir(ThisWorkbook.Path, vbDirectory)
Debug.Print fd1_name
f1_name = Dir(ThisWorkbook.Path & "\" & "*.xlsm")   '通配符查某类型文件
Debug.Print f1_name  '只查找一个文件
'每次继续执行一次dir 指针会往下移动一次
'没有条件变化的do loop ,是无限死循环
'Do While Not f1_name = ""
'   Debug.Print f1_name
'Loop
Do While Not f1_name = ""
   Debug.Print f1_name
   f1_name = Dir
End 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").Close
Workbooks.Open ThisWorkbook.Path & "\" & "t2.xlsx"
Workbooks("t2.xlsx").ActiveSheet.Range("c6") = 100000
Workbooks("t2.xlsx").Close savechanges:=True
End 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").Close
Workbooks.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
0 我觉得VBA和VB,VBS最大的区别就在A(application)上了 所以application里的 workbook , worksheet range ,cell等应该是VBA语言的核心,最复杂内容了 本身VBA里的VB语言部分,其实和很多语言语法结构也差不多 每种语言的差别 一在语法差别上。但差异应该不会太大 另外一个就在每种语言的对象系统上,包括各种对象,数...
如果你要在VB中要想调用Excel,需要打开VB编程环境“工程”菜单中的“引用”项目,并选取项目中的“Microsoft Excel 11.0 object library”项。由于你的Excel版本不同,所以这个选项的版本号也是不同的。 因为EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素。 第一层:Application对象,即Excel本身; 第二层:workbooks对象集,指Excel的工作簿文件; 第三层:worksheets对象集,表示的是E...
每一个使用过Excel的用户都了解工作簿工作表这两个概念。工作簿,简单地说就是与一个excel文件对应,一个打开的excel文件就是一个工作簿。而工作表是工作簿的一部分,是一个独立的数据区域。一个工作簿中可以有很多工作表,在较老的office版本中,一个工作簿最多可允许建立255个工作表,但是目前最新的Office,理论上支持在一个工作簿中建立无限个工作表,只受电脑的硬件资源的限制。 Excel VBA开发中,工作簿集合WorkBooks ,工作簿Workbook,图与表集合Sheets
要用VBA来关闭工作簿,用Workbook.Close 方法即可,而要退出Excel,则用Application.Quit 方法。下面是一些代码示例:     关闭活动工作簿,如果工作簿有更改,提示是否保存:     Sub CloseWorkbook()     ActiveWorkbook.Close     End Sub     如果要避免出现提示,可添加“SaveChanges
Workbooks是所有工作簿对象组成的集合,而Wrokbook对象是Workbooks集合的一个成员。 1.引用集合中的工作簿 利用工作簿名引用工作簿,如已经打开了"Book1.xlsm"工作簿,那么Workbooks("Book1.xlsm")就代表这个工作簿对象。 2.访问对象的属性,获得工作簿文件的信息 通过代码获得指定工作簿的名称、保存的路径等文件信息,示例代码如下。 Sub WbMsg...
如果文件是带用户名和密码时,可以使用如下函数。 Set originalWb = Workbooks.Open(originalFileStr, 0, True, "用户名", "密码") 保存 Excel 文件 targetWb.Save 关闭 Excel 文件 targetWb.Close 如果关闭前没有报错,Excel 会提示要不要保存。如果你的流程 ' Workbooks 代表工作簿集合,所有的工作簿,Workbooks(N),表示已打开的第N个工作簿 ' Workbooks ("工作簿名称") ' ActiveWorkbook 正在操作的工作簿 ' ThisWorkBook '代码所在的工作簿 '2、工作表 ' 'Sheets("工作表名称")
创建新的 Workbooks 。创建的 workbook 名称为Book1,Book2,Book3依次递增 '若要在 Visual Basic 中创建新的工作簿,请使用 Add 方法。下述过程创建了新的工作簿。 'Microsoft Excel 自动将该工作簿命名为“BookN”,其中“N”是下一个可用的数字。新工作簿将成为活动工作簿。 Sub AddOne() Workbooks.Add End Sub 创建新的 Workbooks 。创建的 workbook 名称为Allsales.xl.
private bool ExceltoPDF(string sourcePath, string targetPath, Excel.XlFixedFormatType targetType) bool result; object missing = Type.Missing;