close

一、目的:透多進階篩選方式篩選出資料,自動彙整各"系列名稱"與"尺寸"數量與金額

題外話:在別間公司都是以料貨號管理的,可能女友服務的公司,同一系列名稱的產品有太多不同的尺寸了,但偏偏早期導入ERP時,料貨號管理沒把尺寸編進去,導致"人工作業無止境",變成人在維護電腦,再請網友們看到"系列名稱"與"尺寸"時別覺得怪。

二、系統分析:

2.1 輸入資料:ERP匯出之各"系列名稱"之銷售數量與金額資料。

2.2 預期輸出:各"系列名稱"與各"尺寸"的金額。

2.3 半自動批次處理:

2.3.1 流程想法:

進階篩選應用 process flow  

2.3.2 新增表單與相關欄位設計:

1.工作表2:建立公司內各系列與尺寸的列表,並額外增加加總數量與加總金額等欄位,準備給處理完後寫入資料用。

2.sheet1:輸入資料的工作表"sheet1",預留1到8提供作進階篩選用,故輸入資料含標題從A9貼上,識別輸入資料所需行數:確定4行就夠。

3.工作表1:個彙整篩選結果金額與數量的"工作表1",作為加總金額與數量使用。

2.3.3 各功能別vba 建置:

1.建立進階篩選(VBA): 使用 RANGE 的AdvancedFilter 方法。

a.建立一個ACTIVEX 命令按鈕,並使用Click作物件觸發。

b.物件:CommandButton,建立在工作表表名sheet1

   c.VBA 程式碼:

Private Sub CommandButton1_Click()

Dim data_range As Range, condition_range As Range '宣告資料與條件別RANGE物件
Set data_range = ActiveSheet.Range("A9").CurrentRegion '透過SET與CurrentRegion ,從a9儲存格開始抓使用的資料區域
Set condition_range = ActiveSheet.Range("A1:B2") '條件區域2個即可滿足"系列名稱"與各"尺寸"。要有標題與篩選內容。如果要增加篩選條件可以改成c2、d2以此類推

data_range.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=condition_range 'action 參數設定為xlFilterInPlace 表將資料留在原

Set data_range = Nothing '使用nothing 作物件釋放
Set condition_range = Nothing  '使用nothing 作物件釋放

End Sub

d.進階篩選 測試:於A2與B2輸入玉石A7與10/10(儲存格要設定為文字),點選進階篩選按鈕,當左邊欄數出現藍色字體即表示完成進階篩選。(參圖1)

進階篩選應用01  

圖1

2.恢復篩選:.ShowAllData

a.使用在建立一個ACTIVEX 命令按鈕,並使用Click作物件觸發,並撰寫 sheets("Sheet1").ShowAllData 即可取消進階查詢的結果。

b.物件:CommandButton,建立在工作表表名sheet1

c.VBA 程式碼:

Private Sub CommandButton2_Click() '復原篩選結果

Sheets("Sheet1").ShowAllData

End Sub

 

      3.篩選結果複製:range.copy

a.建立一個ACTIVEX 命令按鈕,並使用Click作物件觸發,增加如c 的程式碼。

b.物件:CommandButton,建立在工作表表名sheet1

c.VBA 程式碼:

Private Sub CommandButton3_Click() 'copy

'複製前,先清除複製目的端工作表的資料,在此設定複製目的端工作表表名為"工作表1"

xx = Application.CountA(Sheets("工作表1").Range("a:a")) + 1 '取得工作表1的資料總數,怕XX=0出現錯誤,故最後再+1

Sheets("工作表1").Range("a1:k" & xx).Clear '清除"A1:K" XX的資料

'取得來源工作表最後一筆資料所在儲存格位置。

n = Sheets("Sheet1").Range("a" & 65536).End(xlUp).Row 

Worksheets("Sheet1").Range("A9:k" & n).Copy _
    Destination:=Worksheets("工作表1").Range("a1")  '複製篩選結果到工作表1的A1
End Sub

    4.彙整金額與數量:

a.建立一個ACTIVEX 命令按鈕,並使用Click作物件觸發,增加如c 的程式碼。

b.物件:CommandButton,建立在工作表表名工作表1

c.VBA 程式碼:

Sub CommandButton1_Click() 'run '注意需要把private拿掉歐,系統預設是sub前是有private的。

備註:有private僅能在單一工作表物件內做調用,無法跨物件作使用。

Sheets("工作表1").Activate

xx = Application.CountA(ActiveSheet.Range("a:a")) '計算工作表資料筆數

ActiveSheet.Range("o3") = 0

ActiveSheet.Range("o4") = 0

Total = 0

Total_num = 0

ActiveSheet.Range("o4") = Application.Sum(ActiveSheet.Range("d2:d" & xx)) '使用sum函數加總金額
    
ActiveSheet.Range("o3") = Application.Sum(ActiveSheet.Range("c2:c" & xx))'使用sum函數加總數量

End Sub

    5.批次執行:

a.建立一個ACTIVEX 命令按鈕,並使用Click作物件觸發,增加如c 的程式碼。

b.物件:CommandButton,建立在工作表表名工作表1

c.VBA 程式碼:

Private Sub CommandButton4_Click() '批次處理

xx = Application.CountA(Sheets("工作表2").Range("a:a")) + 1 '工作表2資料筆數,+1是避免空白產生錯誤。

Sheets("工作表2").Range("C2:D" & xx).Clear '每次批次執行前,作清除"C2:D" XX的資料範圍清楚


For i = 2 To xx Step 1      '透過迴圈完成批次處理 i 步進值用來控制篩選條件與回寫位置。

    Sheets("Sheet1").Range("a2") = ""
    
    Sheets("Sheet1").Range("b2") = ""
    
    Sheets("Sheet1").Range("a2") = Sheets("工作表2").Range("a" & i) '寫入篩選條件一
    
    Sheets("Sheet1").Range("b2") = Sheets("工作表2").Range("b" & i) '寫入篩選條件二
    
    Call CommandButton1_Click  '執行篩選

    Call CommandButton3_Click  '執行複製
    
    Call Sheets("工作表1").CommandButton1_Click '此部分要注意,因為要執行工作表1的CommandButton1_Click ,故CommandButton1_Click的Private字眼刪除。
         
    Sheets("工作表2").Range("C" & i) = Sheets("工作表1").Range("o4") '回寫彙整數量
          
    Sheets("工作表2").Range("D" & i) = Sheets("工作表1").Range("o3") '回寫彙整金額
          
    Sheets("SHEET1").Activate
    
Next i

MsgBox "已完成批次處理"

    
End Sub

範例檔案有需要,再請留言。

進階篩選設定可參考筆者另外一篇:Excel 進階篩選 條件設定教學

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 a200271071 的頭像
    a200271071

    a200271071的部落格

    a200271071 發表在 痞客邦 留言(7) 人氣()