批量對單元格區域內每個單元格中的數據按照一定的規則進行拆分是職場工作中經常碰到的操作。Excel數據選項卡中「分列」提供了基礎的功能。能幫助用戶通過滑鼠快速分列數據。
本篇《神奇的VBA》將介紹幾種通過Excel VBA編程來拆解分列單元格中的數據的思路。
將下圖中B列中的生產編號按照"-"號進行拆分,並將拆分後的非空數據逐一放入右邊的列中。
註:表中B列,有約3萬1千行數據。
思路1:也是所有初學者的思路, 逐一遍歷單元格區域中的所有單元格, 將單元格中的文本進行分裂,並再次遍歷分裂後的數組元素放置在右邊的單元格中。
Sub 思路1()Dim str As StringDim x As IntegerDim rng As RangeSet rng = Range("B3:B" & Range("B1048576").End(xlUp).Row)For Each cell In rng str = Replace(Replace(Replace(cell.Text, "---", "-"), "--", "-"), " ", "") c = 3 r = cell.Row For Each e In Split(str, "-") Cells(r, c) = e c = c + 1 NextNextSet rng = NothingEnd Sub代碼中使用多層嵌套的Replace函數對單元格數據進行了集中清洗,過濾掉了多餘的「-」符號和多餘的空格。
經過運行驗證,思路1代碼完全符合要求,代碼也簡短但是卻遇到最大的問題,「速度太慢」。在思路1代碼中加入Timer計時器,
Sub 思路1()t1 = Timet2 = TimeMsgBox "用時" & DateDiff("s", t1, t2) & "秒"End Sub重新運行,3萬1千行數據,整體耗時約30秒左右,太慢了。慢的原因是思路1代碼在大量地操作單元格區域。數據量少還可以,一旦量大就會遇到該瓶頸。
思路2:將單元格區域一次性放入動態數組中, 在數組中遍歷,增加程序的運行效率,增強體驗!
Sub 思路2()Dim str As StringDim x As IntegerDim arrDim brrarr = Range("B3:B" & Range("B1048576").End(xlUp).Row)n = UBound(arr) - LBound(arr) + 1ReDim brr(1 To n, 1 To 20)
For r = 1 To UBound(arr, 1) For c = 1 To UBound(arr, 2) str = Replace(Replace(Replace(arr(r, c), "---", "-"), "--", "-"), " ", "") x = 1 For Each e In Split(str, "-") brr(r, x) = e x = x + 1 Next NextNextRange("C3").Resize(UBound(brr, 1), UBound(brr, 2)) = brrEnd Sub上面的代碼對VBA使用者有一定的要求,要求對數組有一定的認知,可以參閱《神奇的VBA》插件學習數組的相關知識。數組是很多程式語言中的必備的結構。數組的操作在內存中進行, 所以運行速度和效率上遠比在單元格區域上操作要高的多。經過運行驗證, 思路2的代碼運行總速度由30秒轉為1秒。
拆分文本的思路有很多。本篇神奇的VBA最後再提供另一個取巧的思路。
思路3:巧妙運用Excel自帶的分列功能。通過錄製宏,獲取宏碼, 稍作修改就可以重複使用。
Sub 思路3()Dim TargetRange As RangeSet TargetRange = Range("B3:B" & ActiveSheet.Rows.Count)TargetRange.TextToColumns Destination:=TargetRange.Cells(1).Offset(0, 1), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _ "-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), _ Array(6, 1), Array(7, 1), Array(8, 1)), TrailingMinusNumbers:=TrueSet TargetRange = NothingEnd Sub錄製的宏碼,看著囉嗦。使用者可以靈活裁剪可選參數,精簡代碼。經過運行,速度也非常的快!1秒鐘也搞定了。
本篇內容《神奇的VBA》就分享就到這裡。如果您有更好的方法,歡迎留言告知。文末最後留一個問題。
在思路1和思路2中,嵌套運用了多個Replace函數替換多個字符。有沒有更好的思路更高效更精簡的替換方法嗎?
本篇的分享就到這裡!上面三種思路的VBA代碼實現方法具有一定的通用性,職場人可以直接拿來稍微修改即可為你所用。