這兩天幫後台夥伴解決了一個excel的問題,感覺普遍性比較大,和各位分享一下。

問題需求

這位夥伴應該是在公司里干採購的,經常要在excel表裡記錄非常多的採購信息,包括採購產品、型號、時間、價格等等,如下圖:

她的需求:1、輸入產品的採購編碼,一點擊按鈕,採購的記錄就全部篩選出來;2、篩選出來的記錄中,再選出價格最小的記錄。

這個需求,其實直接通過「數據」-「篩選」-選中需要的編碼即可。

但是數據量大、經常要操作的的時候,如果每個產品採購編碼都要去這樣操作一遍,然後再篩選,複製,粘貼,確實很佔用時間。

所以才會考慮用VBA來解決這個問題。

需求分析

假設存放數據記錄的表格稱sheet1,篩選出來的記錄放在sheet2,思路其實也簡單:1、在sheet1中每一行都檢查一遍,符合條件的編碼就把這條記錄複製到sheet2中;2、sheet1全部檢查完之後,開始在sheet2中檢查價格一欄,選出最小价格,將改行的記錄再篩選出來即可。

說起來簡單,需要攢代碼的時候,就要格外的細心和仔細。

這裡把其中主要涉及到的問題細節詳細說一下:

1、如何檢查每一行?

這個簡單,標記好開頭和結束位置,然後設置循環。例如,有多少行就循環幾次。

a = Sheet1.[A65536].End(xlUp).Row 結束行
First = 2 開始行
Last = a
For i = Last To First Step -1 設置每一行檢查一次
......
Next

2、如何判斷編碼是否相同,然後複製?

If Sheet1.Cells(i, 1) = Sheet2.Cells(1, 12) Then
判斷Sheet1的編碼是否和sheet2中需要找的一樣
Sheet1.Range(Sheet1.Cells(i, 1), Sheet1.Cells(i, 9)).Copy Sheet2.Cells(count, 1)
如果一樣,則整條記錄複製過去
count = count + 1
sheet1中每找到一條記錄,就在Sheet2里添加一條
End If

3、如何選出價格一欄中最小价格?

IF...
Set rng = Range(Sheet2.Cells(First1, 7), Sheet2.Cells(Last1, 7))
選定價格區域
min = rng.Find(Application.min(rng))價格最小值
min_row = rng.Find(Application.min(rng)).Row價格最小值所在行

主要是上面三個問題,組合起來用即可。

演示一下:

怎麼樣,是否感覺非常快捷省事?

完整代碼有點多了,就不貼了。有需要的話wx公號後台回復「實例15」即可

不少人對VBA代碼有抵觸心理,其實沒有那麼複雜,把他看成一個稍微複雜點的函數即可。

當然如果並不打算深入學習VBA,只是臨時使用下,那隻要會複製黏貼就好了!

至於怎麼用VBA代碼,可以參考之前的文章:

Excel vba 實例(1) - 批量製作工資表頭

Excel vba 實例(2) - 批量將工作表拆分為單獨文件

Excel vba 實例(3) - 多個工作簿批量合併

Excel vba 實例(4) - 根據已有名稱,批量新建表格

Excel vba 實例(5) - 快速合併n多個相同值的單元格

Excel vba 實例(6) - 一鍵匯總多個sheet數據到總表

Excel vba 實例(7)-一鍵批量列印工作簿

Excel vba 實例(8)- 利用正則表達式進行定向提取

Excel vba 實例(9)- 批量插入、刪除表格中的空行

Excel vba 實例(10)- 統計同一列中出現次數並標註

Excel vba 實例(11)- 拆分單元格並自動填充

Excel vba實例(12)-如何合併多個單元格而不丟失單元格的數據?

Excel vba實例(13) - 自動生成序號、一鍵排版(列寬、行高自適應等)

Excel VBA 實例(14) - 依據指定單元格的值,複製並插入相同數量的行

歡迎交流!


推薦閱讀:
相关文章