《神奇的VBA》編程:批量拆分單元格數據

2021-02-20 神奇的VBA

批量對單元格區域內每個單元格中的數據按照一定的規則進行拆分是職場工作中經常碰到的操作。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代碼實現方法具有一定的通用性,職場人可以直接拿來稍微修改即可為你所用。 

相關焦點

  • Excel表格中帶公式合併單元格、單元格拆分帶相同內容
    1,在Excel表格中,我們先來進行普通單元格的合併和拆分操作。
  • Excel單元格拆分分行分列技巧,小操作解決大問題超簡單
    今天跟大家分享一下Excel單元格拆分分行分列技巧,小操作解決大問題,簡單實用不操心。如果覺得幫幫真的幫到了您,分享分享朋友圈呀,親們^^<——非常重要!!!メ大家請看範例圖片,Excel單元格拆分分行分列技巧,單元格多個數據內容,我們轉行為單列或者單行。メ
  • 【VBA】一秒拆分工作表
    4-8行:循環遍歷工作表,表名不等於匯總,則刪除表第9行:打開警告信息框顯示,與關閉顯示警告信息框成對出現Sub CrtTable() Dim rng As Range '定義單元格變量
  • 一鍵批量合併Excel工作表相同內容單元格
    今天我們分享的技巧是批量合併Excel工作表某列中相同內容的單元格。使用WPS的用戶對這個功能可能會比較熟悉,不得不說WPS在某些操作細節上更加人性化。不過Excel用戶也不用羨慕,今天我們分享的技巧能夠讓大家分分鐘擁有相同的一鍵批量合併相同單元格的功能。
  • VBA代碼大全029:用vba修改excel單元格區域range對象的行高和列寬
    在excel中單個單元格的行高和列寬是與單元格所在的行的行高和單元格所在列的列寬一致的。我們無法單獨修改某個單元格的行高或列寬,只能通過修改單元格所在行的行高和所在列的列寬來實現單個單元格的行高和列寬的修改。
  • Excel 批量合併相同內容的單元格
    Excel批量合併相同內容的單元格如圖1所示的A、B兩列分別為各產品每次的銷售收入,要求把相同的產品記錄合併到一起,用逗號隔開
  • Excel自動智能數據填充神器
    本文介紹一個非常實用的Excel快捷鍵:『Ctrl+E』,它的快速智能填充功能可以有效、快捷地處理好你想要的數據,神奇的是還不用寫任何公式。一、數據提取類在B2單元格輸入A2中身份證號碼對應的出生日期,光標移動到B3單元格,按快捷鍵Ctrl+E,B3:B12自動填充身份證號碼對應的出生日期如下:在K2單元格輸入J2中對應的QQ號689756,光標移動到K3單元格,按快捷鍵Ctrl+E,K3:K12自動填充QQ號如下:
  • 【 Excel 】批量合併相同內容的單元格
    【微信黑板報】200集全屏高清Excel技巧動畫教程 → 點擊頁面底部的閱讀原文(一)疑難55  如何批量合併相同內容的單元格?如圖 3‑53所示,左側的匯總表需要作進一步整理,即將「地區」列中具有相同內容的單元格合併,做成圖 3‑53中右側的報告形式。圖 3‑53   分類合併單元格→ 解決方案使用分類匯總,然後定位輔助列的空值位置再合併單元格,最後格式刷「地區」列。
  • 如何將Excel數據表單元格保存為數組,VBA數組進階應用
    如何把數據表作為數組進行處理,是編程過程中的一個重要技能。學會之後,將大大提高編程技術,也將使數據處理的過程變得更加流暢。
  • 用好數據透視表,輕輕鬆鬆拆分表格
    有沒有啥批量操作可以快速以員工姓名建立工作表呢?第二步:選中該列的任一單元格,點擊【插入】選項卡下的最後的結果就是批量生成了一系列工作表,以每個人名作為工作表名例如:下面這張1000多行的表格,記錄了銷售的日期、國家和人員等信息如果需要按照銷售人員的姓名分別拆分為多張格,也可以採用數據透視表來實現。
  • Excel VBA 實例(22) - 一鍵篩選其他工作表或工作簿的數據
    今天說的這個vba實例還是和學校有關。
  • 快速將Excel匯總數據拆分到各工作表,包含VBA方法喲
    我們需要按每個【城市】新建一個工作表,並把該城市對應的數據內容,拆分到工作表中。怎麼做呢?今天給大家分享的是使用Excel的【數據透視表】來實現,【數據透視表】用過的人應該都知道數據透視表真的非常非常好用,建議大家都好好學習下。1、選中數據區域或者數據區域內的任意單元格,點擊菜單欄【插入】-【數據透視表】,選擇【現有工作表】,位置隨意選,這裡選擇的是F2,點擊確定。
  • 8個神奇的Excel功能,你會幾個?
    很多小夥伴認為Excel非常簡單的,就是數據的簡單處理,其實很大部分的原因是沒有了解過Excel的神奇功能,本期技巧妹與大家分享8個神奇Excel
  • 軟體應用|在Excel表格中怎樣批量刪除空格?
    怎樣快速整理表格中的數據呢?這些都是職場必備技能,了解更多的Excel知識可以讓你在數據管理,表格管理中遊刃有餘。下面為大家分享一些經常使用的Excel技巧,希望可以給你帶來幫助。一、批量刪除Excel表格中的空格對於表格中的一個空格你會選擇右鍵進行刪除,若是有大量的空格需要短時間內刪除你會怎樣操作呢?
  • 批量刪除空白單元格,只會Ctrl+G定位就out了,全部三種方法都在這
    方法一:Ctrl+G批量定位並刪除空白行操作步驟:1、首先滑鼠選擇所有的數據區域,然後按快捷鍵Ctrl+G,定位條件選擇空值,這樣就能單獨選擇數據區域中的空白單元格;2、單獨選擇空白單元格後按滑鼠右鍵,點擊刪除,向上移動單元格。
  • 含冰第五十七講:在Excel表格中如何批量合併相同內容的單元格
    能不能批量的一次性將相同地區名稱的單元格「合併」呢?接下來,敬請和含冰一起走進:第五十七講:在Excel表格中如何批量合併相同內容的單元格第一步:選中需要「合併」的區域,在工具菜單中點擊:數據——分類匯總,(如圖-04)
  • 如何用Excel批量查找數據?
    它到底有沒有像各位大佬說的那麼神奇,我一直很好奇。至於原因,說來慚愧,我在準備寫這篇推文之前其實一直沒用過這個函數。首先,我們先了解一下vlookup函數的用法,通過Excel的幫助菜單可以查到vlookup函數4個參數的詳細說明。
  • Excel中批量合併相同內容單元格!
    如下圖所示:如何批量將D列所有重複內容全部合併到J列一個單元格中去呢?最終效果:選中需要合併的D列,依次點擊「數據」-「分級顯示」-「分類匯總」-「確定」即可。第2步:選中D列數據,使用快捷鍵Ctrl+G調出定位功能,點擊「空值」確定。再依次點擊「開始」-「對齊方式」-「合併後居中」。
  • Excel單元格合併 技巧大全(共7個)
    合併單元格被封為EXCEL十大陋習之一,華麗的外表下隱藏很多難以處理的「毒瘤」,如果不會批量處理會累死人的。今天就給大家匯總一下常用的合併單元格處理技巧。1、填充序號   操作步驟:選擇區域(從上往下選),編輯欄輸入公式=MAX(A$1:A1)+1,然後CTRL+ENTER批量填充完成。注意公式區域單元格鎖首不鎖尾。
  • Excel單元格內容「換行」你會幾種方法?
    點擊上方藍字關注,每天學點ExcelExcel單元格的內容想要換行有三種方法。