各位好,一段時間不見了,前陣子非常感謝各位神人的幫忙,真的讓我工作非常的順利,尤其是特地花時間教我VBA的misser大和snare大。
今天來是想請教一個EXCEL的VBA問題
我有一個檔案是每天都會以EXCEL內的分頁來更新的
而帶有所有分頁的總檔更新後是用來回報給其他人的
但分別回報給廠商的則需要依照分頁的名字一個一個找到對應的檔案將更新的內容貼上去,再回報給個別對象
過去每天大概只有10~20個對象需要更新,但最近更新的數量有點瘋狂
幾乎是每天都要更新約20~35個檔案
所以我就想能不能在我更新總檔之後
「用VBA把分頁獨立複製出來到新的EXCEL上」
「然後根據分頁的名稱自己以該命名存檔」
我目前當然是可以錄製,錄製結果大概如下:
……
Sub 另存分頁()
'
Sheets("0").Select
Sheets("0").Copy
ChDir "C:\Users\abc\Desktop\test"
ActiveWorkbook.SaveAs Filename:="C:\Users\abc\Desktop\test\0.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Windows("基礎預設格式.xlsx").Activate
Sheets("1").Select
Sheets("1").Copy
ActiveWorkbook.SaveAs Filename:="C:\Users\abc\Desktop\test\1.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Windows("0.xlsx").Activate
End Sub
……
因為分頁名稱確實是固定的,所以我可以一個一個全部打好,每天跑一次就行,這是沒錯
但我也想知道應該有語法可以根據頁籤有的數量、根據頁籤的名字另存檔案,所以上來請教
懇請不吝指教,感謝~
稻草人到處草人 wrote:
可以根據頁籤有的數量、根據頁籤的名字另存檔案
提供一下簡單作法,迴圈跑一下就可以(程式放在有要被複製出去工作表的檔案....就是那個總表?):
........程式碼
'準備把分頁的工作表另存
For Each w In Worksheets
If w.Name<>"xxx" Then 'xxx是不想被複製的工作表。如果每個表都要複製,可以不需要 If ...
'底下加入你的存檔程式碼.....
Sheets(w.Name).Select
Sheets(w.Name).Copy
ChDir "C:\Users\abc\Desktop\test"
ActiveWorkbook.SaveAs Filename:="C:\Users\abc\Desktop\test\" & w.Name & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Windows("基礎預設格式.xlsx").Activate
End if
Next w
您試試看?
Der,misser1
misser wrote:
提供一下簡單作法,迴(恕刪)
感謝M大,我晚點有空試試看
其實我最不了解的是怎麼用宣告
感覺看完範例好像懂了
不過下次要自己寫一個的時候感覺就好像什麼都不懂似的

像是「Sheets(w.Name).Select」裡的 w.Name 如果沒有任何範例我就會不知道可以這樣用
有時候看到別人似乎用了別的方式寫,我就會疑惑w和Name這兩個碼都是原本就有固定意義的,所以一定要這樣寫,還是說是前面要先宣告什麼,才可以這樣用(當然像現在我是可以明白因為前面有一句「For Each w In Worksheets」)
這方面的邏輯我目前還在了解中(有空的話啦,因為思考到完全了解真的需要練習不少次才能理解)
感謝M大的範例~~



………………
Sub 另存分頁()
'
For Each w In Worksheets '宣告
'If w.Name <> "test1" Then 'xxx是不想被複製的工作表。如果每個表都要複製,可以不需要 If ...
'底下加入你的存檔程式碼.....
'If w.Name <> "test2" Then
'If w.Name <> "test3" Then
Windows("庫存2020.xlsx").Activate '回主要表格視窗
Sheets(w.Name).Select
Sheets(w.Name).Copy
ChDir "C:\Users\abc\Desktop\每日9項\08-庫存\VBA"
ActiveWorkbook.SaveAs Filename:="C:\Users\abc\Desktop\每日9項\08-庫存\VBA\" & w.Name & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close '關閉該視窗
Windows("庫存2020.xlsx").Activate '回主要表格視窗
'End If
Next w
End Sub
………………
剛剛測試了一下,功能的結果跟一個一個打上名字的一樣好,是很理想的結果,感謝M大
不過在用那個IF的時候我應該是沒有弄懂,我不知道後面是否還要打什麼,
if 條件1 Then 敘述1
Elseif 條件2 Then
這是我大概能拿來參考的教學,但說真的我還是看不太懂敘述要補什麼

目前大概就是這樣吧,功能也很完善,只要全轉了之後把不需要的檔案刪掉即可,影響也並不大

稻草人到處草人 wrote:
全轉了之後把不需要的檔案刪掉
那個If 的判斷,就是要省去全轉了之後,還得去把不需要的刪掉的步驟。
比如說,如果你不想把所有test開頭的工作表也另存,可以這樣:
If Left(w.Name,4)<>"test" then
'執行另存的步驟區塊[A區塊]
......................
Else
'如果是test開頭,要做的步驟區塊[B區塊]
End if
1.那麼假如迴圈當下執行的工作表名稱是 test1,就不會去執行[A區塊]的程式(另存新檔),而是改執行[B區塊]。
2.假如test開頭的工作表沒要做任何處理,那上面的 Else...[B區塊]可以省略不打。
程式變成:
If Left(w.Name,4)<>"test" then
'執行另存的步驟區塊[A區塊]
......................
End if
如果有問題,歡迎再提出交流喔。
另外 Elseif 則是要做第2重的條件判斷(篩了再篩....),有機會的話,再用實例來探討會比較清楚。
Der,misser1
內文搜尋

X