標題:
[發問]
請教不同活頁簿間的工作表複製
[打印本頁]
作者:
oao
時間:
2013-11-15 17:14
標題:
請教不同活頁簿間的工作表複製
Sub 報表()
Dim Wb As Workbook
Dim Thesou As String
Application.ScreenUpdating = False
Thesou = ThisWorkbook.Path & "\報表範本.xlsx"
Set Wb = GetObject(Thesou)
Dim X As Integer
X = 2
Do
Wb.Sheets(1).Copy after:=ThisWorkbook.Sheets(Sheets.Count)
ActiveSheet.Name = Sheets("Shall").Cells(X, 1) & Sheets("Shall").Cells(X, 2)
X = X + 1
Loop Until Sheets("Shall").Cells(X, 1) = "" Or Sheets("Shall").Cells(X, 2) = ""
Wb.Close False
Set Wb = Nothing
Application.ScreenUpdating = True
End Sub
複製代碼
在活頁簿
總報表.xlsx
的
Shall工作表
,欄A和欄B分別是商品編號和商品名稱,
要把同資料夾活頁簿
報表範本.xlsx
的
Sheets(1)
複製回活頁簿
總報表.xlsx
,
並分別建立名稱為商品編號+商品名稱的n個工作表
因我是大菜鳥,所以程式碼又臭又長,目前只能反覆複製
報表範本.xlsx
的
Sheets(1)工作表
貼回
總報表.xlsx
懇請高手們賜教更有效率的寫法,感激不盡!謝謝!
作者:
luhpro
時間:
2013-11-15 22:27
本帖最後由 luhpro 於 2013-11-15 22:30 編輯
回復
1#
oao
以下程式不可重複執行(會發生 SheetName 重複的錯誤), 這裡沒有設定按鈕或觸發此程序的機制, 建議以單部執行來觀察運作情形.
Sub CrtSheet()
Dim lRow&
Dim sStr$
Dim rSou As Range, rTar As Range
With Workbooks.Open(ThisWorkbook.Path & "\報表範本.xls")
Set rSou = .Sheets("Sheet1").[A1] ' 來源
End With
Set rTar = ThisWorkbook.Sheets("Sheet1").[A1] ' 目的
With rTar.Parent ' 只 Copy 1 個 Sheet, 之後改以此 Sheet 做母版
lRow = 2
sStr = .Cells(lRow, 1) & "-" & .Cells(lRow, 2)
rSou.Parent.Cells.Copy
.Activate
With ActiveWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count))
With .[A1]
.PasteSpecial
.Select ' 避免整個 Sheet 被 Select 的情形
End With
.Name = sStr ' 改名
End With
Application.DisplayAlerts = False ' 關掉系統確認是否放棄大量複製資料的詢問訊息
rSou.Parent.Parent.Close False ' 關閉範例檔案
Application.DisplayAlerts = True
Set rSou = Sheets(sStr).[A1] ' 產生其他 Sheet
lRow = 3
Do While .Cells(lRow, 1) <> ""
sStr = .Cells(lRow, 1) & "-" & .Cells(lRow, 2)
rSou.Parent.Cells.Copy
.Activate
With ActiveWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count))
With .[A1]
.PasteSpecial
.Select
End With
.Name = sStr
End With
lRow = lRow + 1
Loop
End With
End Sub
複製代碼
[attach]16714[/attach]
' 以下是我的使用 Excel VBA 幾年後的觀點 : (只使用過 Excel 2000 與 Excel 2003)
' Excel VBA 中只能 Dim Range 不能 Dim Sheet (對應單一 Sheet, 且適用任一 Sheet), 只能 Dim WorkSheet
' 這裡不採用 WorkSheet, 因為Worksheet 只能對應到目前的 Sheet(Active 的), 不論你括弧內放什麼SheetName, 甚至事先 Set 過的, 用時都是指向同一個 Sheet
' 也不採用 Sheetx , 因為不論是 Sheet1, Sheet2, Sheet3... 都很難用, Sheet1 只能用在 Sheets(1), 用在其他 Sheet 就會發生錯誤
' 所以我改用 Range.Parent 來指向特定的 Sheet (好處是只要不是用 Work相關指令<WorkSheet...> 或是 Select 就不用事先 Activate, 照樣對應到事先定義好的 Sheet)
作者:
oao
時間:
2013-11-15 23:00
回復
2#
sunnyso
[attach]16717[/attach]
附上附件,還請賜教,謝謝!
作者:
oao
時間:
2013-11-15 23:09
回復
3#
luhpro
感謝指導,我先下載大大的附件參考,非常謝謝!
作者:
stillfish00
時間:
2013-11-15 23:48
本帖最後由 stillfish00 於 2013-11-16 00:00 編輯
回復
1#
oao
試試有沒有比較快
Sub 報表()
Dim x As Long
Dim Thesou As String
Thesou = ThisWorkbook.Path & "\報表範本.xlsx" '範本只含一個工作表
Application.ScreenUpdating = False
With Sheets("Shall")
For x = .[A1].End(xlDown).Row To 2 Step -1
Sheets.Add(After:=Sheets(1), Type:=Thesou).Name = .Cells(x, 1) & .Cells(x, 2)
Next
End With
Application.ScreenUpdating = True
End Sub
複製代碼
作者:
luhpro
時間:
2013-11-16 07:15
回復
6#
stillfish00
在 Type:=Thesou 處會發生錯誤.
參照 6# 又改出兩種方式 :
Sub 報表()
Dim x As Long
Dim wsSou As Worksheet
Dim Thesou As String
Set wsSou = Workbooks.Open(ThisWorkbook.Path & "\報表範本.xls").Sheets(1) '範本只含一個工作表
Application.ScreenUpdating = False
With ThisWorkbook.Sheets("Sheet1")
For x = .[A1].End(xlDown).Row To 2 Step -1
wsSou.Copy After:=.[A1].Parent
ActiveSheet.Name = .Cells(x, 1) & .Cells(x, 2)
Next
End With
Application.ScreenUpdating = True
End Sub
複製代碼
Sub 報表2()
Dim x As Long
Dim rSou As Range, rTar As Range
Dim Thesou As String
Set rTar = ThisWorkbook.Sheets("Sheet1").[A1]
Set rSou = Workbooks.Open(ThisWorkbook.Path & "\報表範本.xls").Sheets("Sheet1").[A1] '範本只含一個工作表
Application.ScreenUpdating = False
With rTar.Parent
For x = .[A1].End(xlDown).Row To 2 Step -1
rSou.Parent.Copy After:=.Parent.Sheets(1)
ActiveSheet.Name = .Cells(x, 1) & .Cells(x, 2)
Next
End With
Application.ScreenUpdating = True
End Sub
複製代碼
作者:
stillfish00
時間:
2013-11-16 10:37
在 Type:=Thesou 處會發生錯誤.
luhpro 發表於 2013-11-16 07:15
Excel2003 範本另存新檔為 "報表範本.xlt" 看看
作者:
oao
時間:
2013-11-16 18:26
回復
8#
stillfish00
很感謝,測試後速度快多了,謝謝stillfish00大教了在下寶貴的一課,感恩!
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)