Q:為什么要導出一個sheet為txt ?
A:很多時候,很多程序只能讀txt,能直接讀excel的偏少
我思考這個問題的幾個步驟,我打算從簡單到復(fù)雜,分步驟實現(xiàn)
下面代碼是我逐漸嘗試的過程,一個問題一個問題的排查解決,一個小白新手的痛苦經(jīng)歷,哈哈
EXCEL的導入導出,我想最簡單的應(yīng)該是,單獨導一個sheet為txt,所以我從這開始入手
可運行的代碼:
- Sub daochu1()
- '先做將1個sheet導出為txt
- Sheets("sheet1").SaveAs ("test1.txt")
- MsgBox "導出完畢"
- End Sub
Q1:可運行,但是為什么找不到txt文件?
A1:saveas 和 savecopyas 都需要指定文件名,路徑,擴展名
如果不寫文件路徑,甚至寫死的路徑,文件也不會自動保存在當前的 工作文件夾,(也就是worksheet所在的)
而且用saveas,你會發(fā)現(xiàn),新生成了一個以你這個名字為新名字的EXCEL表
- Sub daochu101()
- ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\test1.txt"
- MsgBox Sheets("sheet1").Name & "保存完成"
- End Sub
Q1: 用了下savecopyas,為了保存一個副本(另存為)
A1: 實際上,我發(fā)現(xiàn)saveas savecopyas 好像都是新建了一個EXCEL
差別是 saveas 直接打開這個新的EXCEL
savecopyas不打開copy的這個excel
Q2: 語法問題
A2:thisworkbook等可以用 saveas 或 savecopyas
但是 sheet層次的,只能用saveas,暫時也不知道原因?
Q3: 確實另存了一個txt,但是這樣保存的txt是個亂碼文件
應(yīng)該是直接保存只能是EXCEL相同格式,比如 xlsx,xls,xlsm
如果這么寫是沒錯的 ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\daochu1.xlsm"
不指定文件格式就會是亂碼
文件保存格式影響較大,即使是.xls和原表格式不同,Windows打開也會有提示
現(xiàn)在就查下如何能保存為一個txt,我先保證測試的Excel里其他sheet 保證只有一個sheet,一個個排除問題
這種方法是可以的
- Sub daochu1txt()
- ActiveSheet.SaveAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".txt", FileFormat:=xlUnicodeText, CreateBackup:=False
- End Sub
第2種寫法也可以
但是保存的都是當前激活的這個sheet的內(nèi)容,并不是把整個excel 都保存了
事實下,也不好吧,一個excel的多個sheet都保存到1個txt里吧?
- Sub daochu1txt()
- ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\222.txt", FileFormat:=xlText, CreateBackup:=False
- End Sub
上面的代碼循環(huán)起來,就是可以把多個sheet存為多個txt了吧?于是我嘗試了下
- Sub daochu1txt()
- Dim sh As Worksheet
- For Each sh In ThisWorkbook.Worksheets
- '錯誤寫法 for each worksheet in thisworkbook 錯誤有2處
- '變量不能用保留詞
- '從屬關(guān)系之前學習過,worksheet屬于worksheets,而不屬于workbook
- sh.SaveAs Filename:=ThisWorkbook.Path & "\" & sh.Name & ".txt", FileFormat:=xlUnicodeText, CreateBackup:=False
- 'worksheet saveas時必須是 FileFormat:=xlUnicodeText
- 'workbook saveas時必須是 FileFormat:=xlText
- Next
- End Sub
問題3:怎么用VBA打開一個txt文件?沒試好,先注釋掉了
' VBA.openfile ("test1.txt")
你用 saveas會新生成一個 這個名字的excel文件
你看看你現(xiàn)在操作的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.excelhome.net/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.excelpx.com/thread-245531-1-1.html
http://club.excelhome.net/thread-1167661-1-1.html
https://jingyan.baidu.com/article/f25ef254a4bfba482c1b82b6.html
http://club.excelhome.net/thread-996804-1-1.html
FileFormat:=xlOpenXMLWorkbook
如果使用后綴,則使用帶有open的那種格式 |
我有幾個xls格式的文件,用saveas 成xlsx的格式,如下
saveas name.xlsx
結(jié)果當我點開新保存的文件時,提示我格式錯誤,或者后綴名錯誤,或者文件損壞。
然后這個提示跟我直接把后綴名xls改成xlsx是一樣的,我在想saveas這個功能是不是就只是改了個后綴名啊,那我用宏的話,如何實現(xiàn)和菜單另存為一樣的功能呢?是我saveas少什么參數(shù)?
http://www.excelpx.com/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.excelhome.net/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 ' 初次執(zhí)行完此句代碼會產(chǎn)生一個"工作簿1"并打開,下次產(chǎn)生'工作簿2',wb看不到可能只是過渡作用
wb.Sheets("sheet1").Range("a1") = "abcd"
wb.SaveAs "D:\B.xls" ' SaveAs另存為即把當前正在使用的文件關(guān)閉掉,另存到其它地方,原來的文件關(guān)閉不保存。保存后代碼所在工作簿和"D:\B.xls"都是打開狀態(tài),不受任何影響,還有若要保存的地方已經(jīng)有同名文件會提示已有是否替換,而SaveCopyAs不會提示會直接替換同名文件
End Sub
'5 excel文件保存和備份
Sub w5()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Save
wb.SaveCopyAs "D:\ABC.xls" ' ThisWorkbook不受影響仍是打開狀態(tài),但 "D:\ABC.xls"是關(guān)閉狀態(tài),這點和SaveAs不同
End Sub
Sub 復(fù)制保存關(guān)閉()
Sheets("sheet2").Copy
ActiveSheet.Name = "復(fù)制"
ActiveWorkbook.Save ‘默認路徑下保存工作簿,自動重命名
End Sub
在該方法中使用的SAVE保存,save后面不能接參數(shù),是將新建的工作簿直接保存在電腦默認的路徑下,并且自動重命名,但是不會關(guān)閉保存的工作簿。如果前兩句注釋掉,第三句僅僅是對該工作簿保存處理,相當于點擊保存按鈕!
Sub 復(fù)制保存關(guān)閉2()
Sheets("sheet2").Copy
ActiveSheet.Name = "復(fù)制"
ActiveWorkbook.SaveAs ‘默認路徑下保存工作簿,自動重命名
ActiveWorkbook.SaveAs "新建" ‘默認路徑下保存工作簿,并命名為“新建”
ActiveWorkbook.SaveAs "D:\新建.xlsx" ‘在D盤下保存工作簿,并命名為“新建”
End Sub
該方法中使用的是saveas,在saveas后面可以接參數(shù),比如“工作簿名稱”或者“在某個地址路徑下及工作簿名稱”,如果存在同名工作簿,則會提示是否覆蓋原有工作簿?也可以不接參數(shù),則是保存在默認路徑下并自動重命名。保存的工作簿會關(guān)閉!上面的代碼中會產(chǎn)生一個保存的未關(guān)閉的excel文件,應(yīng)該是前兩句代碼導致。
如果前兩句注釋掉,第3句直接正常運行(相當于復(fù)制原工作簿);第4句也是相當于復(fù)制原工作簿,只是改一下工作簿名字;第5句因為保存的是xlsx格式而出錯,改為xlsm就沒事,也相當于復(fù)制原工作簿并修改工作簿名。此三句均是直接在對應(yīng)路徑下保存并關(guān)閉工作簿。
Sub 復(fù)制保存關(guān)閉3()
Sheets("sheet2").Copy
ActiveSheet.Name = "復(fù)制"
'ActiveWorkbook.SaveCopyAs '后面必須接參數(shù),否則不能運行
ActiveWorkbook.SaveCopyAs "新建" '不指定文件格式,自動保存在默認路徑下,并且是不識別格式文件
ActiveWorkbook.SaveCopyAs "新建.xlsx" '指定文件格式,自動保存在默認路徑下
ActiveWorkbook.SaveCopyAs "D:\新建.xlsx" '在指定路徑下保存為指定格式的文件
End Sub
在使用savecopyas時,首先后面必須接參數(shù),其次必須制定文件的保存格式,再者該方法保存的文件是直接在默認路徑下或者指定的地址里保存并關(guān)閉該文件(上面代碼會產(chǎn)生一個未保存的excel文件,應(yīng)該是前兩句導致!),所以前兩句注釋掉依然可以正常運行,并且毫無提示!自動覆蓋同名工作簿。