Board logo

標題: 請問如何將多工作表的表格資料匯總在一張工作表 [打印本頁]

作者: gaishutsusuru    時間: 2019-6-1 12:35     標題: 請問如何將多工作表的表格資料匯總在一張工作表

本帖最後由 gaishutsusuru 於 2019-6-1 12:40 編輯

圖1
[attach]30751[/attach]


圖2
[attach]30752[/attach]


請問如何將所有工作表內圖1的資料,匯總在同一張工作表(圖2)?
1. 圖1的資料會有31日,但因為簡化,所以只放6日
2. 在圖2的線別,會依照工作表名稱(例:1-1,1-2…)來填寫
3. 工作表名稱代表線別:1-1,1-2,…。因為簡化,所以目前只放2個。但希望能讀取所有的。

[attach]30753[/attach]
想請問大家如何達成圖2的結果呢? 一般的公式有辦法嗎? 還是有VBA的方式呢?

拜託大家協助,感謝。
作者: 准提部林    時間: 2019-6-2 11:26

Sub TEST()
Dim Sht As Worksheet, UR As Range, xR As Range, i%, c&, r&, N&, ARR
ReDim ARR(1 To 30000, 1 To 6)
Sheets("工作表2").UsedRange.Offset(1, 0).EntireRow.Delete
For Each Sht In Sheets
    If Sht.Name Like "#-#" = False Then GoTo 101
    Set UR = Sht.UsedRange
    For r = 1 To UR.Rows.Count Step 5
    For c = 1 To UR.Columns.Count Step 3
        Set xR = UR(r + 1, c)
        If Application.Sum(xR(2, 3).Resize(3)) = 0 Then GoTo 99
        N = N + 1
        ARR(N, 1) = "'" & Sht.Name: ARR(N, 2) = xR(2): ARR(N, 3) = xR(0)
        For i = 1 To 3
            ARR(N, 3 + i) = xR(i + 1, 3)
        Next
99: Next c
    Next r
101: Next
[工作表2!A2:F2].Resize(N) = ARR
End Sub

[attach]30757[/attach]

====================
作者: gaishutsusuru    時間: 2019-6-2 16:08

回復 2# 准提部林

非常感謝您的協助。

但有另一件事想請教您。不知道您方不方便稍微說明一下您寫的VBA是怎麼運作的。

因為如果之後表格有改動,自己想試著操作看看。

不好意思,如果您方便的話,再麻煩您了,謝謝。
作者: 准提部林    時間: 2019-6-3 13:25

回復 3# gaishutsusuru

1) 每3欄+每5行 為一個區塊
2) "標題行"在每一區塊的第2行, 以 xR 定位[型號]這一儲存格
3) xR右第3欄下的3個儲存格, 為三個尺寸的[數量], 若數量加總為0, 表示無記錄, 略過
4) 取xR上一格為[?日], xR下一格為[型號內容], 填入Arr相應位置
5) 最後以N為行數, 填入總表

=========================
作者: gaishutsusuru    時間: 2019-6-4 15:37

回復 4# 准提部林


您好,謝謝您的詳細解說,非常容易理解。

謝謝您。
作者: gaishutsusuru    時間: 2019-6-8 00:07

回復 4# 准提部林


  准提部林大大您好,

不好意思,再次打擾了。

在程式碼中,「If Sht.Name Like "#-#" = False Then GoTo 101」,表示所有的#-#名稱的工作表都會被讀取。

但我剛剛發現工作表中有的是#-#-#的名稱。所以如果要同時都可以讀取"#-#" 和"#-#-#"名稱的工作表,請問要如何更改呢?

我上網查資料: If Sht.Name Like "#-#" And Sht.Name Like "#-#-#"= False Then GoTo 101。但卻不能同時讀取這2種名稱的工作表。


再拜託您協助提供一些想法,感謝您。
作者: 准提部林    時間: 2019-6-8 09:21

回復 6# gaishutsusuru


If (Sht.Name Like "#-#") + (Sht.Name Like "#-#-#") = 0 Then GoTo 101

"#-#"  表示1位數的串接, 如:5-6,  若為5-16即為不符合,
亦即一個"#"為一個數字. "####" 就是指"0000"~"9999"的範圍,

"*#-#*" , 只要中間是1位數串接的都符合, "*"可以是任意長度的字元(數字或中英文或符號)
"??-??" , 則是"-"的前後限定只能有2個長度的任意字元
作者: gaishutsusuru    時間: 2019-6-9 11:49

回復 7# 准提部林


謝謝您再次詳細的解說,謝謝




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