0 总结
- VBA里参数 filename:= 很灵活的一个参数
- 可能是带路径和后缀名的
- 也可以是纯文件名,甚至后缀名都不带。格式由fileformat指定
1 Workbooks.Add 方法
1.1 语法
- 新建一个工作表。新工作表将成为活动工作表。
- 语法
- 表达式.Add(Template)
- 表达式 一个代表 Workbooks 对象的变量。
- 参数
- 名称 必选/可选 数据类型 说明
- Template 可选 Variant 确定如何创建新工作簿。如果此参数为指定现有 Microsoft Excel 文件名的字符串,那么创建新工作簿将以该指定的文件作为模板。如果此参数为常量,新工作簿将包含一个指定类型的工作表。可为以下 XlWBATemplate 常量之一:xlWBATChart、xlWBATExcel4IntlMacroSheet、xlWBATExcel4MacroSheet 或 xlWBATWorksheet。如果省略此参数,Microsoft Excel 将创建包含一定数目空白工作表的新工作簿(该数目由 SheetsInNewWorkbook 属性设置)。
- 返回值
- 一个代表新工作簿的 Workbook 对象。
- 说明
- 如果 Template 参数指定的是文件,则该文件名可包含路径。
1.2 workbooks.add 会自动打开一个“工作簿1”这类的wb文件,并activate之
- workbooks.add 会自动生成一个 " 工作簿N" 的WB文件,且active
- workbooks.add 在add后,会打开一个“工作簿1”这类的wb文件
- 并且最后add的 wb文件 成为新的 activeworkbook
Sub test98()
Workbooks.Add
End Sub
1.3 workbooks.add(template)
template Variant 类型,可选
1.3.1 template如果指定为 EXCEL内置的常量
- 可为以下 XlWBATemplate 常量之一
- xlWBATChart
- xlWBATExcel4IntlMacroSheet
- xlWBATExcel4MacroSheet
- xlWBATWorksheet
Sub test91()
Workbooks.Add (xlWBATChart)
Workbooks.Add (xlWBATWorksheet)
Workbooks.Add (xlWBATExcel4MacroSheet)
Workbooks.Add (xlWBATExcel4IntlMacroSheet)
End Sub
1.3.2 若 template指定为文本,文本是一个文件路径,文件必须先存在
(暂时没发现有什么用处)
template 如果本参数为指定一现有 Microsoft Excel 文件名的字符串,那么创建新工作簿将以该指定的文件作为模板
- 如果template指定为文件,文件必须先存在,否则报错。
- 那么template为一个路径
- 如果是完整的绝对路径,则需要带path
- 如果只是相对路径,那么 excel 2010版本会去这儿找这个文件:D\用户目录/我的文档下面 ,默认目录?
- 好像指定过后会把新的路径当默认路径
Sub test96()
Workbooks.Add (ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx")
End Sub
Sub test97()
Workbooks.Add (ActiveSheet.Name & ".xlsx")
End Sub
2 Workbooks.save 方法
2.1 语法
- Workbook.Save 方法
- 保存对指定工作簿所做的更改。
- 语法
- 表达式.Save
- 表达式 一个代表 Workbook 对象的变量。
- 说明
- 要打开工作簿文件,请使用 Open 方法。
- 要将工作簿标记为已保存,但不将其写入磁盘,请将它的 Saved 属性设置为 True。
- 首次保存工作簿时,请使用 SaveAs 方法指定文件名。
2.2 常规保存
Sub test101()
ActiveWorkbook.Save
ThisWorkbook.Save
End Sub
2.3 新建文件的保存
- workbooks.add 会自动生成一个 " 工作簿N" 的WB文件,且active
- 如果只save 仍然只是保存在内存中
Sub test100()
Workbooks.Add
ActiveWorkbook.Save
ActiveWorkbook.Save
End Sub
- 新建wb文件,第一次保存在硬盘里需要saveas
- saveas filename:= 完整的绝对路径
Sub test111()
Workbooks.Add
' ActiveWorkbook.Save
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx"
ActiveWorkbook.Close
End Sub
2.3 保存所有打开的wb文件,然后退出EXCEL
- 本示例保存所有打开的工作簿,然后关闭 Microsoft Excel。
- Application.Workbooks 只包括在内存中的wb文件
Sub test110()
'Visual Basic for Applications 官方例子
'官方例子不加 Dim w As Object 居然也能运行,原因不明白
For Each w In Application.Workbooks
w.Save
Next w
Application.Quit
End Sub
- 这样的没有官方的简洁,而且没退出EXCEL
Sub test112()
Dim wb As Object '没这句也可以
For Each wb In Application.Workbooks
wb.Save
wb.Close
Next wb
End Sub
2.3.1 疑问?
- for each w in application.workbooks
- w确实不需要设置为对象,或workbook也没问题
3 workbooks().saveas
3.1 语法
- Excel 开发人员参考
- Workbook.SaveAs 方法
- 在另一不同文件中保存对工作簿所做的更改。
- 语法
- 表达式.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
- 表达式 一个代表 Workbook 对象的变量。
- 说明
- 请使用同时包含大小写字母、数字和符号的强密码。弱密码不混合使用这些元素。强密码:Y6dh!et5。弱密码:House27。请使用您可以记住的强密码,这样就不必将它写下来。
参数
称 | 必选/可选 | 数据类型 | 说明 | ||
---|---|---|---|---|---|
Filename | 可选 | Variant | 一个表示要保存文件的文件名的字符串。可包含完整路径,如果不指定路径,Microsoft Excel 将文件保存到当前文件夹中。 | ||
FileFormat | 可选 | Variant | 保存文件时使用的文件格式。要查看有效的选项列表,请参阅 XlFileFormat 枚举。对于现有文件,默认采用上一次指定的文件格式;对于新文件,默认采用当前所用 Excel 版本的格式。 | ||
Password | 可选 | Variant | 它是一个区分大小写的字符串(最长不超过 15 个字符),用于指定文件的保护密码。 | ||
WriteResPassword | 可选 | Variant | 一个表示文件写保护密码的字符串。如果文件保存时带有密码,但打开文件时不输入密码,则该文件以只读方式打开。 | ||
ReadOnlyRecommended | 可选 | Variant | 如果为 True,则在打开文件时显示一条消息,提示该文件以只读方式打开。 | ||
CreateBackup | 可选 | Variant | 如果为 True,则创建备份文件。 | ||
AccessMode | 可选 | XlSaveAsAccessMode | 工作簿的访问模式。 | ||
ConflictResolution | 可选 | XlSaveConflictResolution | 一个 XlSaveConflictResolution 值,它确定该方法在保存工作簿时如何解决冲突。如果设为 xlUserResolution,则显示冲突解决对话框。如果设为 xlLocalSessionChanges,则自动接受本地用户的更改。如果设为 xlOtherSessionChanges,则自动接受来自其他会话的更改(而不是本地用户的更改)。如果省略此参数,则显示冲突处理对话框。 | ||
AddToMru | 可选 | Variant | 如果为 True,则将该工作簿添加到最近使用的文件列表中。默认值为 False。 | ||
TextCodepage | 可选 | Variant | Microsoft Excel 中对于所有语言都忽略此参数。
| ||
TextVisualLayout | 可选 | Variant | Microsoft Excel 中对于所有语言都忽略此参数。
| ||
Local | 可选 | Variant | 如果为 True,则以 Microsoft Excel(包括控制面板设置)的语言保存文件。如果为 False(默认值),则以 Visual Basic for Applications (VBA) 的语言保存文件。VBA 通常为美国英语版本,除非从中运行 Workbooks.Open 的 VBA 项目是旧的国际化 XL5/95 |
filename:= 可以带完整路径 或 是简单文件名不带后缀配合fileformat都可以
Sub test111()
Workbooks.Add
' ActiveWorkbook.Save
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx"
ActiveWorkbook.Close
End Sub
创建后保存,且要求用户输入文件名后在 saveas
- 官方例子
- 本示例新建一个工作簿,提示用户输入文件名,然后保存该工作簿。
- 这里注意,输入的文件得是EXCEL类型的后缀名
Sub test113()
'Visual Basic for Applications 官方例子
Set NewBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
NewBook.SaveAs Filename:=fName
End Sub
创建后保存,且要求用户输入文件名为.xlsx
- 我拿官方的例子改的
- 因为官方的例子在2010EXCEL里,直接保存,很可能会保存为一个后缀名不对的文件导致无法打开。
- EXCEL的 workbook 文件
Sub test114()
Workbooks.Add
Do
MsgBox "请输入完整的excel文件名,以.xlsx结尾"
fname = Application.GetSaveAsFilename
Loop Until fname Like "*.xlsx"
ActiveWorkbook.SaveAs Filename:=fname
ActiveWorkbook.Close
End Sub
保存为EXCEL
- fileformat:=xlExcel5 (xlExcel7 或 xlExcel8 ) 都保存的xls类型的,其他的很多不太好用
文件保存在哪儿?
- 可以保存为绝对路径,且带后缀名
- 也可以只保存为 文件名,会被认为是相对路径,保存在 thisworkbook.path 当前的路径下
文件的格式( filename 一次指定简洁,但应该 fileformat更准确)
- 可以保存为绝对路径,且带后缀名
- 也可以纯文件名,带后缀名
- 也可以不带后缀名,由 fileformat 指定
- 但是如果双重指定,要注意不要冲突
- 比如文件名也带了后缀,fileformat 又指定了一次,应该以fileformat 为主,两者如果不一致会导致文件打不开。
密码
- password 打开密码
- writeprespassword 写的密码
Sub test116()
Set wb1 = Workbooks.Add
wb1.SaveAs Filename:="123.xlsx", Password:=123, writerespassword:=456
wb1.Close
End Sub
文件名只写名字,格式后缀由fileformat指定的例子
Sub test117()
Set wb1 = Workbooks.Add
wb1.SaveAs Filename:="111222333", FileFormat:=xlExcel8, Password:=123, writerespassword:=456
wb1.Close
End Sub
保存路径为绝对路径的例子
Sub test118()
Set wb1 = Workbooks.Add
wb1.SaveAs "c:\abc", FileFormat:=xlExcel5, Password:=123, writerespassword:=456
wb1.Close
End Sub
保存为csv
- 保存为不同文件时,文件名和文件格式,需要一致
- 另外,WB的属性,对于能保存的一些格式,可能不生下来,比如密码
- csv就不能带密码
Sub test115()
Application.displayalert = False
Set wb1 = Workbooks.Add
'保存的文件名需要和 fileformat一致,或者只来1个
'csv本身是文本文件,不能加密
'直接保存为csv 只会有1个sheet
wb1.SaveAs Filename:="123.csv", FileFormat:=xlCSV, Password:=123
wb1.Close
Application.displayalert = True
End Sub
保存为TXT
- 可见 .txt 对应的文件类型就是 效率 xlunicodeText
- fileformat 设置格式更准确,比如保存为txt,最好还是把 fileformat指定为 xlunicodeText
Sub test122()
Set wb1 = Workbooks.Add
wb1.SaveAs Filename:="123.txt" '这样虽然保存为了txt,但打开会乱码
wb1.Close
End Sub
这样设置TXT的显示格式没问题
Sub test119()
Set wb1 = Workbooks.Add
wb1.SaveAs Filename:="123", FileFormat:=xlUnicodeText
wb1.Close
End Sub
Sub test121()
Application.DisplayAlerts = flase
Set wb1 = Workbooks.Add
wb1.SaveAs Filename:="123.txt", FileFormat:=xlUnicodeText
wb1.Close
Application.DisplayAlerts = True
End Sub
4 workbooks().savecopyas(filename) 就1个参数
4.1 语法
- Workbook.SaveCopyAs 方法
- 将指定工作簿的副本保存到文件,但不修改内存中的打开工作簿。
- 语法
- 表达式.SaveCopyAs(Filename)
- 表达式 一个代表 Workbook 对象的变量。
- 参数
- 名称 必选/可选 数据类型 说明
- Filename 可选 Variant 指定副本的文件名。
Sub test131()
'这样保存的后缀名会可以打开文件... .xls
ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xls"
End Sub
Sub test132()
'这样保存的后缀名会打不开文件... .xlsx,得改成xlsm
'估计都是和EXCEL版本有关 xls保险一些,因为xls是老格式,可以包含xlsm里的 VBA
ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsm"
End Sub
Sub test133()
'这样保存的后缀名会打不开文件...
'ThisWorkbook.SaveCopyAs (ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx")
ThisWorkbook.SaveCopyAs (ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsm")
end sub
5 保存后的文件打不开的问题
workbooks.saveas
- 要么filename , 或fileformat 其中之一指定即可
- 如果两者都指定了,要注意filename:= fileformat:= 两者格式需要保持一致
- 一般如果保存为 excel相关的,可以指定saveas 时加上文件类型 FileFormat:=xlOpenXMLWorkbook
workbooks.savecopyas
- 如果是savecopyas ,必须是现在文件相同的格式(savecopyas 参数很少)
Sub test112()
'必须保存为和当前thisworkbook.xlsm相同的文件类型,否则打不开
'如果保存为了xlsx,使用时新文件就会提示打不开
ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & "newWB2.xlsm"
End Sub