【Excel VBA】- 合併相同屬性區域
日期2017年03月28日,坐標魔都。QQ群里一位小夥伴諮詢了這樣一個問題,需要把相同屬性的數據進行合併,這樣描述大家可能不太理解,直接上圖。
通過上圖,大家可以很明確的看到要求,就是把A1:B10區域的相同產品合併到一行,合併的數據使用間隔符隔開即可。
看到此類問題,我的第一反應是能否通過函數解決,如果給定了所有產品的信息,也就是D1:E4區域的信息,那通過自定義函數給定兩個參數,一個是單個產品信息,另一個是產品信息區域,既定這兩個參數即可完成相同屬性產品的合併。
今天我就不介紹自定義函數如何解決該類問題,感興趣的小夥伴可以加入SUT學習交流群(QQ群:615356012)完成該作業哦,我也會定期提交作業答案,敬請關注!
如果給定了有哪些產品信息,可以通過群里小夥伴Ryan的方法來達到合併的目的,具體代碼如下:
Sub t()
Dim i, j, l As Integer
Dim str As String
For j = 2 To 4
str = ""
For i = 2 To 10
If Range("a" & i) = Range("d" & j) Then
str = str & Range("b" & i) & "/"
End If
Next
str = Left(str, Len(str) - 1) 刪除最後多出來的分隔符/
Range("e" & j).Value = str
Next
End Sub
接下來我們一起來演示一下該代碼是如何運作的,如果需要知道代碼運作,可以通過F8逐語句執行。我這裡配合使用F5和F8進行調試,著重查看監視窗口裡面str值的變化。
該段代碼已經能夠快速的解決該問題,但如果沒有給定產品信息,也就是D1:E4區域的產品列,那該如何合併呢?具體演示,請見如下動態圖:
雖然代碼有點長,其實還是很好理解的,我使用兩個Do While…Loop循環,找到相同產品的信息就合併到str字元串中。我使用了一個二維數組保存所有的產品和合併信息,在代碼的最後通過代碼[D2].Resize(j - 1, 2) = arrayProduct把二維數組賦值到指定單元格區域。
這個方法的好處是可以不用事先指定合併那些產品,可以自動匯總所有產品。還可以把匯總的結果指定放入希望放置的單元格區域。但缺點也非常明顯,該段代碼無法匯總不連續的產品信息,如果把兩段數據合併,如下圖所示:
如果要匯總的數據區域變為A1:B19,使用如上的代碼,會出現如下的問題,詳情如下動態圖:
通過如上動態圖演示,可以看到,最終的效果並非把所有的產品信息進行了合併,如果產品沒有連在一起,則無法合併,那該如何解決呢?
通過一番思索,我發現只需要使用一個循環即可完成對所有產品的合併,我也拋棄繼續使用二維數組,因為二維數組事先定義就有點浪費資源,如果定義為動態的,那隻能修改第二維度,雖然可以通過轉置解決,但相對比較繁瑣,所以直接拋棄使用。這裡,我使用了字典來保存合併的信息,如果想對字典有更加深入的學習,可以點擊閱讀原文查看哦。啰嗦完了,直接上動態圖:
怎麼樣?是不是發現代碼更好理解了呢?如果不理解可以加入QQ群(群號:615356012)進行交流哦,也可以下載此演示素材文件哦。
今天的介紹就到這裡了,不要忘記加群完成自定義函數作業哦。Written by Steven in 20170329^_^
微信公眾號:SaveUTime
SUT學習交流群:615356012,入群審核人:Steven
關注公眾號,提高效率,節約您的時間!
推薦閱讀: