Board logo

標題: [發問] Excel 篩選後複製。 [打印本頁]

作者: stephenlee    時間: 2022-1-28 11:02     標題: Excel 篩選後複製。

我有一個活頁簿內有多個工作表,我要將相關工作表先做篩選再複製貼上做
樞紐分析表,例如工作表QC3,QC4,QC5 這三個工作表,我是用公式 等於 "=" 另外一個工作表的內容,那就是QC3-QC5 由第二列開始,全部為公式= 另外一個活頁簿
內的資料內容,同時因為我是用公式= 另外一張工作表的內容,所以在最後的列是會有0 的問題,0的顯示是該工作表的列沒有資料,因為我不要每次都把公式向下拉再取資料,而是先=該工作表的內容,我要將QC3先 篩選K欄 "year" 為2022-1 月份,再由A2:K2 向下複製再貼上至QC Summary 的A2 儲存格,QC4 也是篩選2022-1 , 再由A2:K2 複製至QC Summary,此時複製貼上則是在QC3 剛才複製的資料下方,同時QC5 都是一樣做法,

而CLS-QC5-CLS-QC7 也是一樣做法3個工作表,這次便是A2:K2複製至CLS Summary這樣, 而Total Summary 則我以手動方式,將QC Summary 及CLS-Summary 做樞紐分析表整合資料這樣。

QC3-QC5 這樣只是3個工作表,CLS-QC5-7 也是剛好3個,如果下次有新增的話,都需要根據工作表的多少來自動複製貼上。

最好是自動認別到以QC 開頭的工作表則自動篩選複製貼上至QC Summary 表內,同時CLS-開始的也是自動篩選再複製貼上。
而2022-1 是會根據月份篩選, 到2月時,則要自動篩選2022-2。


所有QC工作表是以公式等於= 另外一張工作表的資料,所以要以實數貼上Summary 。 同時每張工作表的內容資料多少都不一樣。

請問如何以VBA 做到以上要求,謝謝
[attach]34632[/attach]
作者: samwang    時間: 2022-1-28 13:49

回復 1# stephenlee
請測試看看,謝謝
Sub test()
Dim Arr, Brr(1 To 10000, 1 To 11), Crr(1 To 10000, 1 To 11)
Dim T$, T1$, n%, n1%, i%, j%, sh
T = Year(Date) & "-" & Month(Date)
For x = 4 To Sheets.Count
    sh = UCase(Left(Sheets(x).Name, 2))
    If InStr(sh, "QC") Then
        With Sheets(x)
            Arr = .Range("a1").CurrentRegion
            For i = 2 To UBound(Arr)
                T1 = Arr(i, 11): If Arr(i, 5) = 0 Then Exit For
                If T = T1 Then n = n + 1: For j = 1 To 11: Brr(n, j) = Arr(i, j): Next
            Next
        End With
    ElseIf InStr(sh, "CL") Then
        With Sheets(x)
            Arr = .Range("a1").CurrentRegion
            For i = 145 To UBound(Arr)
                T1 = Arr(i, 11): If Arr(i, 5) = 0 Then Exit For
                If T = T1 Then n1 = n1 + 1: For j = 1 To 11: Crr(n1, j) = Arr(i, j): Next
            Next
        End With
    End If
Next
If n > 0 Then
    With Sheets("QC Summary")
        .Range("a1").CurrentRegion.Offset(1, 0) = ClearContents
        .[a2].Resize(n, 11) = Brr
    End With
End If
If n1 > 0 Then
    With Sheets("CLS Summary")
        .Range("a1").CurrentRegion.Offset(1, 0) = ClearContents
        .[a2].Resize(n1, 11) = Crr
    End With
End If
End Sub
作者: singo1232001    時間: 2022-1-28 14:01

回復 1# stephenlee
作者: 准提部林    時間: 2022-1-30 08:59

Sub TEST_A1()
Dim Arr, Brr(2), N(2), i&, j%, YM$, SS, S As Worksheet, T$, k%
YM = Format(Date, "yyyy-m")
ReDim Arr(1 To 20000, 1 To 11)
Brr(1) = Arr: Brr(2) = Arr
For Each S In Sheets
    T = UCase(S.Name)
    k = Switch(T Like "QC#*", 1, T Like "CLS-QC#*", 2, T = T, 0)
    If k = 0 Then GoTo s99
    Arr = S.Range("a1").CurrentRegion
    For i = 2 To UBound(Arr)
        If Arr(i, 5) = 0 Then Exit For
        If Arr(i, 11) = YM Then
           N(k) = N(k) + 1
           For j = 1 To UBound(Arr, 2)
               Brr(k)(N(k), j) = Arr(i, j)
           Next j
        End If
    Next i
s99: Next
Set SS = Sheets(Array("QC Summary", "CLS Summary"))
For k = 1 To 2
    SS(k).UsedRange.Offset(1, 0).EntireRow.Delete
    If N(k) > 0 Then SS(k).[a2].Resize(N(k), 11) = Brr(k)
Next k
End Sub
作者: stephenlee    時間: 2022-2-4 10:30

本帖最後由 stephenlee 於 2022-2-4 10:34 編輯
Sub TEST_A1()
Dim Arr, Brr(2), N(2), i&, j%, YM$, SS, S As Worksheet, T$, k%
YM = Format(Date, "yy ...
准提部林 發表於 2022-1-30 08:59


感謝淮大,我這些資料來源是用公式= 其他工作表內的資料, 貼上指令碼後,他在13行,以下句子中出現錯誤說


第1至10欄是用公式=其他工作表的資料,而11欄是我用公式將第1欄的日期轉為年份及月份,方便統計整合。

"Type mismatch"
if Arr(i, 11) = YM Then

能不能勞煩幫我看一下,謝謝。
作者: 准提部林    時間: 2022-2-5 16:12

回復 5# stephenlee


如果測試檔都沒問題, 是否可能實際資料有公式產生的錯誤值???
自行先找到錯誤所在, 即錯誤在資料, 而不是程式, 這要自己修改公式去除錯誤
作者: Andy2483    時間: 2023-1-5 07:54

本帖最後由 Andy2483 於 2023-1-5 08:00 編輯

回復 4# 准提部林


    謝謝前輩,不勝感激

Option Explicit
Sub TEST_A1()
Dim Brr(2), N(2), i&, Arr, SS, S As Worksheet, T$, YM$, k%, j%
'↑宣告變數:Brr是一維陣列Brr(0)~Brr(2),N是一維陣列N(0)~N(2),
'(Arr,SS)是通用型變數,i是長整數,S是工作表變數,(T,YM)是字串變數,
'(k,j)是短整數

YM = Format("2022/1/22", "yyyy-m")
'↑令YM這字串變數是 (日期轉為4碼年分連接"-",再連接月份)的字串
ReDim Arr(1 To 20000, 1 To 11)
'↑宣告Arr這二維陣列範圍:縱向從1到20000列號,橫向從1到11欄號
Brr(1) = Arr
'↑令索引號1的Brr陣列值是 Arr二維陣列
Brr(2) = Arr
'↑令索引號2的Brr陣列值是 Arr二維陣列
For Each S In Sheets
'↑設Each迴圈,令S是迴圈工作表
    T = UCase(S.Name)
    '↑令T這字串變數是 S迴圈工作表名經字元轉大寫的新字串
    k = Switch(T Like "QC#*", 1, T Like "CLS-QC#*", 2, T = T, 0)
    '↑令k這短整數是 Switch 函數回傳的值,規則如下:
    '如果 T字串變數是 "QC"開頭,連接至少帶有1碼數字的規則,就回傳數字 1 給k變數
    '如果 T字串變數是 "CLS-QC"開頭,連接至少帶有1碼數字的規則,就回傳數字 2 給k變數
    '如果 T字串變數是 自身等式,就回傳數字 0 給k變數
    'https://learn.microsoft.com/zh-tw/office/vba/language/reference/user-interface-help/switch-function

    If k = 0 Then GoTo s99
    '↑如果k變數是 0,就跳到 s99位置繼續執行
    Arr = S.Range("a1").CurrentRegion
    '↑令Arr這二維陣列! 倒入 S迴圈工作表[A1]相鄰儲存格串並後擴展成的最小方正範圍儲存格集值
    For i = 2 To UBound(Arr)
    '↑設順迴圈!i從2到Arr陣列縱向最大索引列號數
        If Arr(i, 5) = 0 Then Exit For
        '↑如果i迴圈列5欄Arr陣列值是 0,就跳出i層For圈繼續執行
        If Arr(i, 11) = YM Then
        '↑如果i迴圈列11欄Arr陣列值是 YM字串變數?
           N(k) = N(k) + 1
           '↑令k變數索引號的N陣列值是 自身累加 1
           For j = 1 To UBound(Arr, 2)
           '↑設順迴圈!j從1到Arr陣列橫向最大索引欄號數
               Brr(k)(N(k), j) = Arr(i, j)
               '↑令k變數索引號Brr陣列值(二維陣列)中 ,
               '(k變數索引號的N陣列值 列號,j迴圈欄號),
               '第一次認識這樣的陣列,這不知道是不是所謂的三維陣列??謝謝
               '這三維陣列值是 i迴圈列j迴圈欄Arr陣列值

           Next j
        End If
    Next i
s99: Next
Set SS = Sheets(Array("QC Summary", "CLS Summary"))
'↑令SS這通用型變數是工作表集
For k = 1 To 2
'↑設順迴圈!k從1到2
    SS(k).UsedRange.Offset(1, 0).EntireRow.Delete
    '↑令SS變數工作表集k索引號工作表,使用的儲存格擴展最小方正儲存格集,
    '向下偏移一列的儲存格集範圍列刪除

    If N(k) > 0 Then SS(k).[a2].Resize(N(k), 11) = Brr(k)
    '↑如果k變數索引號的N陣列值 >0 ,就令SS變數工作表集k索引號工作表,
    '[a2]擴展向下 k變數索引號的N陣列值列,向右擴展11欄,這範圍儲存格,
    '以Brr三維陣列的第k索引號層陣列帶入,謝謝

Next k
End Sub




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