一些废话:对命题的思考和解题步骤
Q:为什么要导出一个sheet为txt ?
A:很多时候,很多程序只能读txt,能直接读excel的偏少
我思考这个问题的几个步骤,我打算从简单到复杂,分步骤实现
- 先试着把一个sheet导出为txt
- 接下来,我打算试试导出成其他格式
- 把多个sheet导出为多个其他文件?
- 然后考虑试试从txt等文件格式里导入
- 从多个文件导入到多张表
- 多个文件导入到一个EXCEL?
二 代码过程
下面代码是我逐渐尝试的过程,一个问题一个问题的排查解决,一个小白新手的痛苦经历,哈哈
第1版:将excel的一个sheet导出为txt
EXCEL的导入导出,我想最简单的应该是,单独导一个sheet为txt,所以我从这开始入手
可运行的代码:
Sheets("sheet1").SaveAs ("test1.txt")
Q1:可运行,但是为什么找不到txt文件?
A1:saveas 和 savecopyas 都需要指定文件名,路径,扩展名
如果不写文件路径,甚至写死的路径,文件也不会自动保存在当前的 工作文件夹,(也就是worksheet所在的)
而且用saveas,你会发现,新生成了一个以你这个名字为新名字的EXCEL表
第2版:改进:加上文件保存路径
ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\test1.txt"
MsgBox Sheets("sheet1").Name & "保存完成"
Q1: 用了下savecopyas,为了保存一个副本(另存为)
A1: 实际上,我发现saveas savecopyas 好像都是新建了一个EXCEL
差别是 saveas 直接打开这个新的EXCEL
savecopyas不打开copy的这个excel
Q2: 语法问题
A2:thisworkbook等可以用 saveas 或 savecopyas
但是 sheet层次的,只能用saveas,暂时也不知道原因?
Q3: 确实另存了一个txt,但是这样保存的txt是个乱码文件
应该是直接保存只能是EXCEL相同格式,比如 xlsx,xls,xlsm
如果这么写是没错的 ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\daochu1.xlsm"
不指定文件格式就会是乱码
文件保存格式影响较大,即使是.xls和原表格式不同,Windows打开也会有提示
本文件路径的写法
- 方法1:不写,就是默认在当前工作目录下----在这里好像行不通?
- 方法2:写引号括起来绝对路径,不推荐
- 方法3:指代的绝对路径,是文件级别的,thisworkbook.path
- 组合路径写法 thisworkbook.path & "\test.txt"
第3版: 解决保存的txt是乱码的问题,需要用 fileformat
现在就查下如何能保存为一个txt,我先保证测试的Excel里其他sheet 保证只有一个sheet,一个个排除问题
这种方法是可以的
ActiveSheet.SaveAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".txt", FileFormat:=xlUnicodeText, CreateBackup:=False
第2种写法也可以
但是保存的都是当前激活的这个sheet的内容,并不是把整个excel 都保存了
事实下,也不好吧,一个excel的多个sheet都保存到1个txt里吧?
ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\222.txt", FileFormat:=xlText, CreateBackup:=False
- 从这试验看出来,无论 workbook 还是worksheet 的saveas ,虽然语法都OK,但saveas好像都是针对的一个sheet
- , CreateBackup:=False 可以省略,我现在并不知道什么意思
- ActiveSheet 可替换为 sheets("sheet2")
第4版: 单个txt可以保存为txt,循环起来就可以保存多个sheet为txt了吧
上面的代码循环起来,就是可以把多个sheet存为多个txt了吧?于是我尝试了下
For Each sh In ThisWorkbook.Worksheets
'错误写法 for each worksheet in thisworkbook 错误有2处
'从属关系之前学习过,worksheet属于worksheets,而不属于workbook
sh.SaveAs Filename:=ThisWorkbook.Path & "\" & sh.Name & ".txt", FileFormat:=xlUnicodeText, CreateBackup:=False
'worksheet saveas时必须是 FileFormat:=xlUnicodeText
'workbook saveas时必须是 FileFormat:=xlText
三 总结
saveas和 savecopyas 的语法
- 对象.方法
- sheet.saveas 或 sheet.savecopyas
- saveas 和 savecopyas 都需要指定文件名,路径,扩展名,必须含扩展名!.xls .txt等等
- SaveAs 语法
- SaveAs 可以支持 FileFormat,详情如下:
- 表达式.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
- MSDN上有详细解释
- https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.saveas?redirectedfrom=MSDN
- 语法:
- 必须把路径写清楚
- 有两种格式,括号或空格
- saveas (路径.文件类型) 或 saveas 路径.文件类型
- savecopyas (路径.文件类型) 或 savecopyas 路径.文件类型
- 如果saveas 路径.文件类型 保存的类型和源文件类型不同,也会新生成一个文件出来
- saveas 是 把本文件直接 改名保存,但原来的EXCEL并没被改变,只是新打开了一个excel文件
- saveas会直接打开这个新的EXCEL
- savecopyas是另存为一个新文件,并且savecopyas不打开copy的这个另存为的文件。
- 实际上,我发现saveas savecopyas 好像都是新建了一个EXCEL,都不影响老的EXCEL
- saveas 针对的一定是一个sheet
- 无论 workbook.saveas 还是worksheet .saveas ,虽然语法都OK,但saveas好像都是针对的一个sheet
- savecopy可以把一次把整个EXCEL文件(多个SHEET),另存为一个新的EXCEL,或其他文件?
- 看起来 sheet 可以saveas 不能savecopyas,并且 FileFormat:=xlUnicodeText
- 而 workbook 可以用saveas 或 savecopyas,并且FileFormat:=xlText
四 其他未整理,一些学习资料还没学习---
问题3:怎么用VBA打开一个txt文件?没试好,先注释掉了
' VBA.openfile ("test1.txt")
你用 saveas会新生成一个 这个名字的excel文件
你看看你现在操作的EXCEL名字变了没:个人文件test1.txt 这样一个奇怪名字的exce
事实下,也不好吧,一个excel的多个sheet都保存到1个txt里吧?
https://blog.csdn.net/chenqiai0/article/details/52203423
https://blog.csdn.net/chenqiai0/article/details/52203472
http://club./thread-1002093-1-24.html?jdfwkey=emn3s1
https://blog.csdn.net/lidawu7322/article/details/90411325
https://blog.csdn.net/xuming1209/article/details/53998982
https://wenku.baidu.com/view/acc1ea0de45c3b3567ec8bf0.html
https://blog.csdn.net/qq_35106907/article/details/88551114
http://www./thread-245531-1-1.html
http://club./thread-1167661-1-1.html
https://jingyan.baidu.com/article/f25ef254a4bfba482c1b82b6.html
http://club./thread-996804-1-1.html
FileFormat:=xlOpenXMLWorkbook
我有几个xls格式的文件,用saveas 成xlsx的格式,如下
saveas name.xlsx
结果当我点开新保存的文件时,提示我格式错误,或者后缀名错误,或者文件损坏。
然后这个提示跟我直接把后缀名xls改成xlsx是一样的,我在想saveas这个功能是不是就只是改了个后缀名啊,那我用宏的话,如何实现和菜单另存为一样的功能呢?是我saveas少什么参数?
http://www./thread-340936-1-1.html
https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.saveas?redirectedfrom=MSDN
https://zhidao.baidu.com/question/609007680.html
http://club./thread-1134264-1-1.html
https://zhidao.baidu.com/question/2144186557598425708.html
https://bbs.csdn.net/topics/370028429
Sub W3()
Dim wb As Workbook
Set wb = Workbooks.Add ' 初次执行完此句代码会产生一个"工作簿1"并打开,下次产生'工作簿2',wb看不到可能只是过渡作用
wb.Sheets("sheet1").Range("a1") = "abcd"
wb.SaveAs "D:\B.xls" ' SaveAs另存为即把当前正在使用的文件关闭掉,另存到其它地方,原来的文件关闭不保存。保存后代码所在工作簿和"D:\B.xls"都是打开状态,不受任何影响,还有若要保存的地方已经有同名文件会提示已有是否替换,而SaveCopyAs不会提示会直接替换同名文件
End Sub
'5 excel文件保存和备份
Sub w5()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Save
wb.SaveCopyAs "D:\ABC.xls" ' ThisWorkbook不受影响仍是打开状态,但 "D:\ABC.xls"是关闭状态,这点和SaveAs不同
End Sub
Sub 复制保存关闭()
Sheets("sheet2").Copy
ActiveSheet.Name = "复制"
ActiveWorkbook.Save ‘默认路径下保存工作簿,自动重命名
End Sub
在该方法中使用的SAVE保存,save后面不能接参数,是将新建的工作簿直接保存在电脑默认的路径下,并且自动重命名,但是不会关闭保存的工作簿。如果前两句注释掉,第三句仅仅是对该工作簿保存处理,相当于点击保存按钮!
Sub 复制保存关闭2()
Sheets("sheet2").Copy
ActiveSheet.Name = "复制"
ActiveWorkbook.SaveAs ‘默认路径下保存工作簿,自动重命名
ActiveWorkbook.SaveAs "新建" ‘默认路径下保存工作簿,并命名为“新建”
ActiveWorkbook.SaveAs "D:\新建.xlsx" ‘在D盘下保存工作簿,并命名为“新建”
End Sub
该方法中使用的是saveas,在saveas后面可以接参数,比如“工作簿名称”或者“在某个地址路径下及工作簿名称”,如果存在同名工作簿,则会提示是否覆盖原有工作簿?也可以不接参数,则是保存在默认路径下并自动重命名。保存的工作簿会关闭!上面的代码中会产生一个保存的未关闭的excel文件,应该是前两句代码导致。
如果前两句注释掉,第3句直接正常运行(相当于复制原工作簿);第4句也是相当于复制原工作簿,只是改一下工作簿名字;第5句因为保存的是xlsx格式而出错,改为xlsm就没事,也相当于复制原工作簿并修改工作簿名。此三句均是直接在对应路径下保存并关闭工作簿。
Sub 复制保存关闭3()
Sheets("sheet2").Copy
ActiveSheet.Name = "复制"
'ActiveWorkbook.SaveCopyAs '后面必须接参数,否则不能运行
ActiveWorkbook.SaveCopyAs "新建" '不指定文件格式,自动保存在默认路径下,并且是不识别格式文件
ActiveWorkbook.SaveCopyAs "新建.xlsx" '指定文件格式,自动保存在默认路径下
ActiveWorkbook.SaveCopyAs "D:\新建.xlsx" '在指定路径下保存为指定格式的文件
End Sub
在使用savecopyas时,首先后面必须接参数,其次必须制定文件的保存格式,再者该方法保存的文件是直接在默认路径下或者指定的地址里保存并关闭该文件(上面代码会产生一个未保存的excel文件,应该是前两句导致!),所以前两句注释掉依然可以正常运行,并且毫无提示!自动覆盖同名工作簿。