• 跳至主要導覽
  • 跳至主要內容
  • 跳至主要資訊欄
Office 指南

Office 指南

辦公室工作實用教學

  • Excel
  • Word
  • PowerPoint
  • Windows
  • PowerShell
  • R

Excel VBA 使用 Split 函數分割字串、放入陣列教學與範例

在 Excel 中使用 VBA 的 Split 函數,將字串依照特定字元切割後,轉換為字串陣列。

問題

假設我們的原始資料包含了許多的欄位,不同的欄位之間以斜線分隔,該如何將這樣的資料切開,放在個別的儲存格中?

需要分割的資料

解法

若要依照指定的字元分割字串,有兩種方式可以使用,第一種是結合 SEARCH、LEFT、RIGHT 與 MID 這類的 Excel 函數,取出特定位置的子字串,但是這種方式的限制較多,無法處理太複雜的資料。

另外一種則是使用 VBA 的 Split 函數,將字串直接依照特定字元分割成陣列,這種作法比較可以適用於複雜的資料,在資料長度比較長的時候,處理起來也很簡單。

使用 Excel 函數分割字串

對於比較簡單的資料來說,可以結合各種 Excel 函數來處理,這種方式適合只熟悉 Excel 的公式,不會使用 VBA 的人。

如果要取出原始資料中以斜線分割的第一個欄位,可以先使用 SEARCH 函數找出第一個斜線的位置,接著再用 LEFT 函數擷取從資料開頭到第一個斜線中間的資料:

=LEFT(A2, SEARCH("/",A2,1)-1)
取出第一欄資料

若要取出第二個欄位,也是採用類似的方式,只不過我們這時候必須以 SEARCH 找出第一個斜線與第二個斜線的位置,然後使用 MID 函數將兩個斜線之間的資料取出來:

=MID(A2,SEARCH("/",A2,1)+1,SEARCH("/",A2,SEARCH("/",A2,1)+1)-SEARCH("/",A2,1))

這裡 MID 函數的第二個參數中,我們使用 SEARCH 函數找出第一個斜線的位置,從第一個線之後開啟擷取資料。而 MID 的第三個參數中,我們先使用兩個 SEARCH 找出第二個斜線的位置(先找第一個,再從第一個往後找第二個),接著再減掉第一個斜線的位置,就得到第二個欄位的資料長度。

有了第二個欄位的起始位置與長度之後,就可以用 MID 取出資料了。

取出第二欄資料

要取出第三個欄位的話,可以先用兩個 SEARCH 找出第二個斜線的位置,再用 LEN 計算出整個資料的長度,然後減去第二個斜線的位置,就可以得到第三個欄位的資料長度,最後再使用 RIGHT 函數從右方開始取出第三個欄位的資料(因為第三個欄位在這裡剛好是最後一個欄位,所以可以這樣做):

=RIGHT(A2,LEN(A2)-SEARCH("/",A2,SEARCH("/",A2,1)+1))
取出第三欄資料

雖然結合各種 Excel 的函數後,可以正確擷取出各個欄位的資料,但是如果欄位的數量很多的時候,這種作法就會變得非常複雜,這時候就建議改用 VBA 的 Split 函數來處理。

使用 VBA 的 Split 函數分割字串

VBA 的 Split 函數是專門用來分割字串用的,使用上雖然需要撰寫一些 VBA 程式碼,但是卻可以非常快速的處理大量欄位的資料,在資料複雜時相當好用。
Step 1
參考 啟用 Excel「開發人員」工具教學,啟用 Excel 內建的開發人員工具列。

Step 2
選擇 Excel 工具列的「開發人員」頁籤,點選「巨集」功能。

點選「巨集」功能

Step 3
輸入巨集的名稱(自己取一個名字),然後按下「建立」。

建立巨集

Step 4
在 VBA 程式碼編輯器中,撰寫分割欄位的 VBA 程式碼。

這裡我們使用一個 For 迴圈,逐一將每一列(row)的原始資料取出來,使用 Split 自動將所有的欄位以斜線分割成一串陣列,然後再用第二個迴圈將每個欄位的資料填回 Excel 表格中對應的位置:

Sub MySplit()

For i = 2 To 8
  ' 取得原始資料
  rawData = Cells(i, 1)

  ' 使用 Split 分割欄位
  fieldArray = Split(rawData, "/")

  ' 將各個欄位填入對應的儲存格
  For j = 0 To 2
    Cells(i, j + 2).Value = fieldArray(j)
  Next j
Next i

End Sub
撰寫 VBA 巨集程式

Step 5
執行撰寫好的 VBA 程式之後,就可以得到所有欄位的分割結果了。

巨集程式處理結果

使用 VBA 的作法雖然需要撰寫一些程式,但是只要程式寫好之後,不管資料欄位有多少,都可以一次處理掉,實務上來說會比單純使用 Excel 函數的解法更實用。

參考資料:TechOnTheNet、Exceljet、Excel Trick、Microsoft 官方網站、Office 官方網站

分類:Excel 標籤:VBA

讀者互動方式

留言

  1. 林 表示:

    2018-08-3015:49:54

    我有使用上的問題,不知道是否可以詢問^^

  2. 林 表示:

    2018-08-3110:50:55

    若每一欄不一訂有3個,可能有2個或者1個資料而已呢?

    • Office Guide 表示:

      2018-09-0111:58:41

      如果每一行資料的欄位數量不一定,建議使用 VBA Split 函數的方式,將資料切成 VBA 的陣列之後,以 UBound 判斷陣列的長度,然後再用迴圈取出每個欄位的資料。

  3. Winnie 表示:

    2018-12-2219:05:27

    請問如果儲存格有四個以上的資料
    中間的MID要怎麼寫

  4. Winnie 表示:

    2018-12-2219:10:27

    請問如果儲存格裡有四個以上的資料要抓
    中間的要怎麼抓取第三個

  5. chen 表示:

    2019-02-2317:02:47

    你好請問我如何知道分割後的個數呢謝謝

  6. Chi 表示:

    2019-05-1118:24:17

    請問
    如果我有資料是
    strA=”13:30:00″,”6,205,349″,”11,496,291″,”8,509,337″,”7,930,460″,”1,182,501″,”5,168,853″,”140,489″
    我想要用split,把”切開
    請問該怎麼寫?split(strA,???)
    謝謝

  7. 一路 表示:

    2020-06-2321:02:38

    我想問資料如果到100行的時候呢?我今天怎麼試都只有到第10行,要怎麼加入語法

  8. Jack Lin 表示:

    2021-07-2310:26:59

    =MID(A2,SEARCH(“/”,A2,1)+1,SEARCH(“/”,A2,SEARCH(“/”,A2,1)+1)-SEARCH(“/”,A2,1))
    倒出來的是錯誤的 ?

  9. xyz 表示:

    2023-05-0716:31:03

    請問Cells(i, j + 2).Value = fieldArray(j)
    j + 2請幫忙解說~~

主要資訊欄

搜尋

近期文章

  • Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤
  • Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例
  • Linux 網路設定 ip 指令用法教學與範例
  • Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例
  • Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例
  • Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例
  • Linux 以 Cryptsetup 與 LUKS 加密磁碟教學與範例
  • Linux 使用 age 簡潔的加密、解密工具使用教學與範例

推薦網站

  • Udemy 線上教學課程
  • Coursera 線上教學課程

關注本站

  • 電子郵件
  • Facebook

公益

  • 家扶基金會
  • 台灣世界展望會
  • Yahoo 奇摩公益
  • igiving 公益網
  • 兒福聯盟

Copyright © 2021 · Office Guide