Board logo

標題: 工作表另存新檔和以儲存格內容命名 [打印本頁]

作者: missbb    時間: 2023-12-5 00:07     標題: 工作表另存新檔和以儲存格內容命名

想請教有一個活頁部, 要將第2張, 第3張和第4張WORKSHEET要另存為3個獨立WORKBOOK,  當中VLOOKUP資料轉為值, 格式不變.

檔案儲存路徑參照WORKSHEET內RANGE("G1")

活頁部名稱參照WORKSHEET內內RANGE("G2")

請多多幫忙:) [attach]37107[/attach][attach]37107[/attach]
作者: Andy2483    時間: 2023-12-5 08:46

本帖最後由 Andy2483 於 2023-12-13 08:23 編輯

回復 1# missbb


    謝謝論壇,謝謝前輩發表此主題與範例檔
後學藉此帖練習字典(檢查檔名重複),學習方案如下,請前輩參考
Option Explicit
Sub TEST()
Application.ScreenUpdating = False
'Application.DisplayAlerts = False
Dim A, Z, i&, T$, T1$, T2$, F1 As Range, F2 As Range
Set Z = CreateObject("Scripting.Dictionary")
T1 = "另存檔案路徑": T2 = "另存檔案名稱"
For i = 1 To Worksheets.Count
   Set F1 = Sheets(i).[1:1].Find(T1, Lookat:=xlWhole)
   Set F2 = Sheets(i).[2:2].Find(T2, Lookat:=xlWhole)
   If F1 Is Nothing Or F2 Is Nothing Then GoTo i01 Else T = F2(1, 2) & "/S"
   If Z(T) <> "" Then MsgBox F2(1, 2) & " 檔名重複,請檢查": Exit Sub
   Z(T) = F1(1, 2) & "": Set Z(F2(1, 2) & "") = Sheets(i)
i01: Next
For Each A In Z.KEYS
   If Not IsObject(Z(A)) Then GoTo A01 Else T = Z(A & "/S")
   Z(A).Copy: If Dir(T, vbDirectory) = "" Then MkDir T
   With ActiveSheet.UsedRange: .Value = .Value: End With
   With ActiveWorkbook: .SaveAs Filename:=T & "\" & A: .Close: End With
   ThisWorkbook.Activate
A01: Next
End Sub
作者: missbb    時間: 2023-12-5 13:48

回復 2# Andy2483

多謝指道, :'(
作者: missbb    時間: 2023-12-5 13:53

回復 3# missbb


  想再多問, 如果在工作表設定了列印範圍(工作表1和2或有不同) , 另存新檔時不想顯示欄F 的路徑和檔案名字, 應在VBA CODE內那裡修改?

拜託指導
作者: Andy2483    時間: 2023-12-5 14:16

本帖最後由 Andy2483 於 2023-12-5 14:37 編輯

回復 4# missbb


    謝謝前輩回復,修改如下,請前輩參考
列印範圍(工作表1和2或有不同):經測試 原工作表列印範圍會帶到新複製的設定

Option Explicit
Sub TEST()
Application.ScreenUpdating = False
'Application.DisplayAlerts = False
Dim A, Z, i&, T$, T1$, T2$, F1 As Range, F2 As Range
Set Z = CreateObject("Scripting.Dictionary")
T1 = "另存檔案路徑": T2 = "另存檔案名稱"
For i = 1 To Worksheets.Count
   Set F1 = Sheets(i).[1:1].Find(T1, Lookat:=xlWhole)
   Set F2 = Sheets(i).[2:2].Find(T2, Lookat:=xlWhole)
   If F1 Is Nothing Or F2 Is Nothing Then GoTo i01 Else T = F2(1, 2) & "/S"
   If Z(T) <> "" Then MsgBox F2(1, 2) & " 檔名重複,請檢查": Exit Sub
   Z(T) = F1(1, 2) & "": Set Z(F2(1, 2) & "") = Sheets(i): Z(F2(1, 2) & "/a") = F1.Address
i01: Next
For Each A In Z.KEYS
   If Not IsObject(Z(A)) Then GoTo A01 Else T = Z(A & "/S")
   Z(A).Copy: If Dir(T, vbDirectory) = "" Then MkDir T
   With ActiveSheet.UsedRange: .Value = .Value: End With
   Range(Z(A & "/a")).Resize(2, 2) = ""
   With ActiveWorkbook: .SaveAs Filename:=T & "\" & A: .Close: End With
   ThisWorkbook.Activate
A01: Next
End Sub
作者: missbb    時間: 2023-12-5 22:44

回復 5# Andy2483


    非常感謝!
作者: missbb    時間: 2023-12-6 00:03

本帖最後由 missbb 於 2023-12-6 00:04 編輯
回復  missbb


    謝謝前輩回復,修改如下,請前輩參考
列印範圍(工作表1和2或有不同):經測試 原工作表 ...
Andy2483 發表於 2023-12-5 14:16


你好 , 一直在試用 , 現時可是將全部工作表2,工作表3和工作表4另存為新的WORKBOOK.  但如果只要工作表2和工作表4另存WORKSBOOK (又或是只另存工作表4等不同情況), 可否用INPUT BOX輸入來制作?  :(
作者: Andy2483    時間: 2023-12-6 07:00

回復 7# missbb


    謝謝前輩再指教
1.部分另存的意義為何?
另存的目標資料夾位置都一樣,即使是部分另存,這些另存檔還是混同一資料夾裡,取用一樣需要在檔案總管挑選,所以部分另存會變得意義不大,這是會有此疑問的原因

2.或說明這些另存的用途.另存頻率....等

3.如果只是列印後另存,可參考以下鏈結帖
https://forum.twbts.com/viewthre ... mp;page=2#pid122046
作者: missbb    時間: 2023-12-6 19:30

回復 8# Andy2483


    因為工作需要,未必每次都要另存所有工作表。我會參照你提供的資料再試,非常感謝:)
作者: singo1232001    時間: 2023-12-8 03:06

本帖最後由 singo1232001 於 2023-12-8 03:07 編輯

回復 9# missbb


    Sub 同資料夾導出()

Set outSh = ActiveSheet
Set myBook = ThisWorkbook
        
Filename = outSh.[G2].Value & " " & Format(Now, "yyyyMMdd_HHnnss") & ".xlsx"
' 設定檔案保存路徑(更改為所需路徑)
filePath = myBook.Path & "\" & Filename

outSh.Copy
Set NewWorkbook = ActiveWorkbook
    ' 保存新工作簿
NewWorkbook.SaveAs Filename:=filePath
End Sub


Sub G1G2另存路徑導出()

Set outSh = ActiveSheet
Set myBook = ThisWorkbook
        
Filename = outSh.[G2].Value & " " & Format(Now, "yyyyMMdd_HHnnss") & ".xlsx"
' 設定檔案保存路徑(更改為所需路徑)
filePath = Range("G1").Value & "\" & Filename

outSh.Copy
Set NewWorkbook = ActiveWorkbook
    ' 保存新工作簿
NewWorkbook.SaveAs Filename:=filePath
End Sub



Sub 資料選擇器路徑導出()


Set fd = Excel.Application.FileDialog(msoFileDialogFolderPicker)  '設定選取檔案功能
fd.InitialFileName = Excel.ActiveWorkbook.Path  '設定預設目錄
fd.Show '顯示對話框
If fd.SelectedItems.Count = 0 Then Exit Sub
Set myBook = ThisWorkbook
Set outSh = ActiveSheet
myPath = fd.SelectedItems(1)

Filename = outSh.[G2].Value & " " & Format(Now, "yyyyMMdd_HHnnss") & ".xlsx"
' 設定檔案保存路徑(更改為所需路徑)
filePath = Range("G1").Value & "\" & Filename

outSh.Copy
Set NewWorkbook = ActiveWorkbook
    ' 保存新工作簿
NewWorkbook.SaveAs Filename:=filePath
End Sub
作者: missbb    時間: 2023-12-13 00:12

回復 2# Andy2483

您好, 再想請教如何在你這CODE內, 將另存新檔的範圍 , 指定在A1 至E30 ?? 因為你的CODE很深, 在一般網頁都難找到作編輯:Q

謝謝!
作者: Andy2483    時間: 2023-12-13 08:09

本帖最後由 Andy2483 於 2023-12-13 16:21 編輯

回復 11# missbb


    謝謝前輩再回復,一起學習
後學藉此帖做複習心得與添加新需求,學習方案如下,請前輩參考
表格1:
[attach]37120[/attach]

Option Explicit
Sub TEST()
Application.ScreenUpdating = False
'↑令螢幕暫不隨程序變化結果
'Application.DisplayAlerts = False
'↑令程序不跳出 檔案要不要覆蓋 的詢問窗,直接覆蓋儲存

Dim A, Z, i&, T$, T1$, T2$, F1 As Range, F2 As Range
'↑宣告變數
Set Z = CreateObject("Scripting.Dictionary")
'↑令Z變數是 字典
T1 = "另存檔案路徑": T2 = "另存檔案名稱"
'↑令T1,T2變數是GJ; 雙引號之間的字串
For i = 1 To Worksheets.Count
'↑設順迴圈!令i從1到 此活頁簿工作表數量
   Set F1 = Sheets(i).[1:1].Find(T1, Lookat:=xlWhole)
   '↑令F1變數是 從第1列尋找 其內容與 "另存檔案路徑" 完全一樣的儲存格
   Set F2 = Sheets(i).[2:2].Find(T2, Lookat:=xlWhole)
   '↑令F2變數是 從第2列尋找 其內容與 "另存檔案名稱" 完全一樣的儲存格
   If F1 Is Nothing Or F2 Is Nothing Then GoTo i01 Else T = F2(1, 2) & "/S"
   '↑如果F1變數或 F2變數其中一個找不到!就跳到標示 i01的位置繼續執行,
   '否則就令T變數是F2變數同一列右邊格的內容連接 "/S"所組成的新字串

   If Z(T) <> "" Then MsgBox F2(1, 2) & " 檔名重複,請檢查": Exit Sub
   '↑如果以T變數查Z字典 回傳item值不是空的!代表檔案名稱重複了,跳出提示,結束程式執行
   Z(T) = F1(1, 2) & "": Set Z(F2(1, 2) & "") = Sheets(i): Z(F2(1, 2) & "/a") = F1.Address
   '↑令T變數為key,item是 F1變數同一列右邊格的字串內容,納入Z字典中
   '令F2變數同一列右邊格的字串內容為key,item是迴圈數所引號工作表
   '令F2變數同一列右邊格的內容連接 "/a"所組成的字串為key,item是 F1變數的儲存格位址

i01: Next
For Each A In Z.KEYS
'↑設逐項迴圈!令A變數是Z字典的key之一
   If Not IsObject(Z(A)) Then GoTo A01 Else T = Z(A & "/S")
   '↑如果以A變數查Z字典回傳item不是物件!就跳到標示 A01位置繼續執行,
   '否則就令T變數是 以A變數連接 "/S"所組成的字串查Z字典回傳值

   Z(A).Copy: If Dir(T, vbDirectory) = "" Then MkDir T
   '↑令A變數查Z字典回傳值(物件:工作表) 複製一份到新活頁簿
   '如果T變數的資料夾不存在!就建立T(字串)變數的資料夾

   With ActiveSheet.UsedRange: .Value = .Value: End With
   '↑令此新活頁簿裡的該新工作表都計算成值(公式變成值)
   Range(Z(A & "/a")).Resize(2, 2) = ""
   '↑令檔案路徑與檔案名稱4格變成空格
   
   '將另存新檔的範圍 , 指定在A1 至E30 ??
   '因為需求是要保留原來格式,所以以複製工作表到新活頁簿,再刪除不要的範圍即可
   ActiveSheet.UsedRange.Offset([A1:E30].Rows.Count, 0).EntireRow.Delete
   '↑令指定保留的範圍以下的列 刪除
   ActiveSheet.UsedRange.Offset(0, [A1:E30].Columns.Count).EntireColumn.Delete
   '↑令指定保留的範圍右側欄 刪除
   
   With ActiveWorkbook: .SaveAs Filename:=T & "\" & A: .Close: End With
   '↑令此新活頁簿儲存到指定路徑的檔名,之後關閉此新活頁簿
   ThisWorkbook.Activate
   '↑令程序回到本檔
A01: Next
End Sub
作者: missbb    時間: 2023-12-13 22:53

回復 12# Andy2483

非常感謝加入解釋, 無私指導:'(
作者: missbb    時間: 2023-12-13 22:54

回復 10# singo1232001
多謝指導!:D




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)