文字列を区切り文字で分割する、Split関数について解説します。
結果は一次元配列(Array)として取得できます。
基本構文
Dim 配列 As Variant 配列 = Split(元の文字列, [区切り文字], [要素数上限], [比較モード])
※ 区切り文字は省略可能ですが、
省略時の区切り文字がカンマではなく半角スペースになる点にご注意ください。
サンプルコード
Dim 元の文字列 As String 元の文字列 = "みかん,りんご,いちご" ' カンマ区切りテキストを配列に分割 Dim Arr商品リスト As Variant Arr商品リスト = Split(元の文字列, ",") ' ↑[みかん][りんご][いちご]の3要素の一次元配列
' サンプル:分割した要素をループ Dim 商品 As Variant For Each 商品 In Arr商品リスト ' ここに各商品に対する処理 Next
' サンプル:分割した要素をセルに出力 Dim 要素数 As Long 要素数 = UBound(Arr商品リスト) - LBound(Arr商品リスト) + 1 Dim 出力範囲 As Range Set 出力範囲 = Range("A2").Resize(要素数) 出力範囲.Value = WorksheetFunction.Transpose(Arr商品リスト)
' 要素数上限Limitを指定するとその要素数までしかとらない Dim Arr商品リスト As Variant Arr商品リスト = Split(元の文字列, ",", 2) ' ↑[みかん][りんご,いちご]の2要素の一次元配列 ' いちごが消えるのではなくカンマの区切り効力が消える
' 比較モードCompareをテキストにすると大文字小文字の区別がなくなる Arr商品リスト = Split("AAAxBBBxCCC", "X", , vbTextCompare) ' ↑[AAA][BBB][CCC]の配列。X指定でxでも区切られるようになる
解説
Split関数を使用すると、文字列を区切り文字で分割した一次元配列を取得できます。
シート関数のTEXTSPLIT関数は二次元配列を返しますが、
Split関数は一次元配列であることに留意してください。
For Each文でループするには便利ですが、
セルに縦(行)方向に出力する場合はTranspose関数が必要になります。
出力範囲の取得には「要素数を取得して起点セル.Resize(要素数)」が便利ですので、
この書き方も覚えてしまいましょう。
この処理をよく行う場合は、
一次元配列をセルに出力する汎用関数を用意しておくと良いです。
' 汎用関数を使うとこう書けるようになる Call 一次元配列をセルに出力する(Split(元の文字列, ","), Range("A2")
詳しくはこちらの記事をご覧ください。
なお、Split関数で生成した配列の添字は0はじまりです。
よって要素数は「UBound + 1」で取ってもかまいません。
ちなみにこの「0はじまりの配列」という仕様は、
「Option Base 1」を無視しますので一応覚えておいて下さい。
各引数の仕様
メインの引数である第2に引数「区切り文字」も省略ができますが、
省略時はカンマではなく半角スペースであることに注意してましょう。
第3引数Limit(要素数上限)を指定すると、その数までしか分割を行わなくなります。
「みかん,りんご,いちご」を分割する際、Limitに2を渡したときは、
- [みかん][りんご]だけになるわけではなく
- [みかん][りんご,いちご]の2要素の配列になる
という仕様であることを認識しておいてください。
後半の要素をカットするわけではなく、以降の分割が行われなくなる仕様です。
第4引数Compare(比較モード)は滅多に使わないと思いますが、
vbTextCompareを指定すると区切り文字の大文字小文字を区別しなくなります。
区切り文字がアルファベットであること自体珍しいと思いますが、
さらに大文字小文字を区別しない場合はこの引数を使用してください。
文字列の左側/右側を取得する
Split関数の小ワザ的な使い方として、文字列の左側/右側を取得することが可能です。
Dim 元の文字列 As String 元の文字列 = "みかん(愛媛産)" カッコの左側 = Split(元の文字列, "(")(0) ' ← みかんを取得 カッコの右側 = "(" & Split(元の文字列, "(")(1) ' ← (愛媛産)を取得
取得した配列を直接(0)や(1)で指定することができ、
(0)で区切り文字の左側を、(1)で右側を取得することができます。
右側は区切り文字を「&」で繋げる必要があったり、
区切り文字が複数出てくるとうまく動かなかったりしますが、
左側の取得は便利な場面が多いので覚えておきましょう。
文字列の登場回数をカウントする
Split関数のもうひとつ小ワザ的な使い方として、
文字列の登場回数をカウントすることもできます。
Dim 元の文字列 As String 元の文字列 = "みかんぶどうみかんりんごみかんいちご" みかんの登場回数 = UBounb(Split(元の文字列, "みかん")) ' ← 3が返ります。
みかんで区切って4区間になっていれば、
区間数 - 1 がみかんの登場回数という理屈ですね。
「要素数(Ubound + 1) - 1 」という計算式となり、
+ 1 - 1が消えてUboundだけでカウントできるのがなかなか便利です。
Split関数のこの使い方も覚えておきましょう。
この使い方であれば第4引数Compareも便利な場面があります。
Appleとappleを同じくカウントしたい場合は、
第4引数にvbTextCompareを渡して使用してください。