Excel VBAで文字列を分割する方法をお探しですね。
広告
Excel VBAでカンマ区切りデータを扱うSplit関数とJoin関数の使い方
Excel VBAでCSVのようなカンマ区切りデータを扱うとき、文字列を1項目ずつ取り出したり、逆に配列の中身を1つの文字列に戻したりする場面ってよくありますよね。
そんなときに便利なのが、Split関数とJoin関数です。
Splitは文字列を配列に分割して、Joinは配列を区切り文字付きの文字列に結合してくれます。
この記事では、Excel VBAのSplit関数とJoin関数を使って、カンマ区切りの文字列を配列に分割・結合する基本から、実務でつまずきやすい注意点まで、わかりやすく解説していきます。
Split関数って何?カンマ区切りの文字列を配列に分割する基本
Split関数は、指定した区切り文字を基準に文字列をバラバラに分けて、配列として返してくれるVBAの関数です。
たとえば「A,B,C」という文字列をカンマで分割すると、「A」「B」「C」という3つの要素を持つ配列になります。
CSVデータの1行を項目ごとに分けたいときや、セルに入力された複数の値を分解したいとき、メールアドレスやファイルパスを特定の記号で分けたいときなど、実務でもよく使う関数です。
基本の書き方は `Split(文字列, 区切り文字, 分割数, 比較方法)` です。
1つ目の引数には分割したい文字列、2つ目の引数にはカンマやハイフンなどの区切り文字を指定します。
2つ目の引数を省略すると半角スペースで分割されちゃうので、カンマ区切りを扱う場合は必ず `”,”` を指定するようにしましょう。
戻ってくる値は配列で、添字は通常0から始まります。
Excelの行番号や列番号は1から始まるので、VBA初心者の方はここで混乱しやすいんですよね。
注意してください。
“`vb
Sub SplitSample()
Dim text As String
Dim arr() As String
Dim i As Long
text = “りんご,バナナ,オレンジ”
arr = Split(text, “,”)
For i = LBound(arr) To UBound(arr)
Debug.Print i & ” : ” & arr(i)
Next i
End Sub
“`
このコードを実行すると、イミディエイトウィンドウに「0 : りんご」「1 : バナナ」「2 : オレンジ」と表示されます。
`LBound` は配列の最小添字、`UBound` は最大添字を取得する関数です。
Split関数で作った配列をループ処理するときは、固定で `0 To 2` みたいに書くよりも、`LBound` と `UBound` を使ったほうがデータ数の変化に強いコードになります。
CSVみたいに項目数が変わる可能性があるデータでは、この書き方を基本にしておくと実務で扱いやすくなりますよ。
Join関数って何?配列をカンマ区切りの文字列に結合する基本
Join関数は、Split関数とは逆の働きをする関数です。
配列の各要素を、指定した区切り文字でつなげて1つの文字列にしてくれます。
たとえば「A」「B」「C」という配列をカンマで結合すると、「A,B,C」という文字列になります。
Excel VBAで複数の値をまとめて出力したい場合や、加工した配列をCSV形式の文字列に戻したい場合に便利です。
基本の書き方は `Join(配列, 区切り文字)` です。
1つ目の引数には結合したい配列を指定して、2つ目の引数には要素間に入れる区切り文字を指定します。
区切り文字を省略した場合はカンマじゃなくて半角スペースで結合されちゃいます。
だから、カンマ区切りの文字列を作りたい場合は `Join(arr, “,”)` みたいにちゃんと書くことが大事です。
あと、区切り文字に空文字 `””` を指定すると、要素同士を区切りなしで連結できます。
“`vb
Sub JoinSample()
Dim arr As Variant
Dim result As String
arr = Array(“東京”, “大阪”, “名古屋”)
result = Join(arr, “,”)
Debug.Print result
End Sub
“`
このコードでは、結果として「東京,大阪,名古屋」が表示されます。
Join関数で特に大切なのは、基本的に1次元配列を対象にするという点です。
Excelのセル範囲から取得した値は、1列だけ、または1行だけに見えても2次元配列として扱われることがあります。
そのままJoin関数に渡すと「型が一致しません」みたいなエラーになっちゃうことがあるので、セル範囲を結合したいときは配列の形を意識する必要があります。
たとえば、A1:A3に入力された値をカンマ区切りにしたい場合、環境によっては `WorksheetFunction.Transpose` を使って1次元配列に変換してからJoinする方法が使われます。
ただし、行方向の範囲と列方向の範囲ではTransposeの動きが変わることがあるので、汎用的な処理ではループで一度配列を作り直す方法のほうが確実です。
Join関数はシンプルですが、配列の次元を理解して使うことでエラーを減らせますよ。
Split関数とJoin関数を組み合わせてデータを加工する方法
Split関数とJoin関数は、それぞれ単体でも便利なんですが、組み合わせると文字列データの加工がめちゃくちゃ楽になります。
よくある流れは、まずSplitでカンマ区切りの文字列を配列に分割して、配列の各要素をループで加工して、最後にJoinで再び文字列へ戻すというものです。
たとえば、CSVの各項目の前後に余分な空白がある場合、Splitで分割してからTrim関数で空白を取り除いて、Joinで整形済みのカンマ区切り文字列に戻せます。
“`vb
Sub SplitJoinSample()
Dim text As String
Dim arr() As String
Dim i As Long
Dim result As String
text = ” りんご, バナナ ,オレンジ ”
arr = Split(text, “,”)
For i = LBound(arr) To UBound(arr)
arr(i) = Trim(arr(i))
Next i
result = Join(arr, “,”)
Debug.Print result
End Sub
“`
この例では、元の文字列に含まれていた余分な半角スペースを取り除いて、「りんご,バナナ,オレンジ」というきれいな文字列に変換しています。
SplitとJoinの間にループ処理を入れることで、置換、空白削除、番号付け、表記ゆれの修正など、いろんな加工ができるようになります。
Excelのセルに入力されたリストを整理したり、外部システムに渡す文字列を作成したりする場合にも、この考え方はよく使われます。
もう少し実務っぽい例として、カンマ区切りの部署名を分割して、各要素に接頭辞を付けて改行区切りで表示する処理を考えてみましょう。
カンマで受け取ったデータを人が読みやすい形式に変える場合、Joinの区切り文字に `vbCrLf` を指定すると、要素ごとに改行された文字列を作れます。
つまり、入力時はカンマ区切り、表示時は改行区切りみたいに、目的に応じて区切り文字を変換できるんです。
“`vb
Sub ConvertDelimiter()
Dim text As String
Dim arr() As String
Dim i As Long
text = “営業部,総務部,開発部”
arr = Split(text, “,”)
For i = LBound(arr) To UBound(arr)
arr(i) = “部署:” & arr(i)
Next i
MsgBox Join(arr, vbCrLf)
End Sub
“`
こんな感じで、Split関数とJoin関数は「分ける」「加工する」「戻す」という一連の流れで考えると理解しやすくなります。
単にカンマで分割するだけじゃなくて、配列にしたあと何をしたいのかを意識すると、VBAでの文字列処理の幅がぐっと広がりますよ。
実務で注意したいポイントとエラーを防ぐ書き方
Split関数を使うときにまず注意したいのは、連続する区切り文字がある場合です。
たとえば「A,,C」をカンマで分割すると、結果は「A」「」「C」となって、空文字の要素が配列に含まれちゃいます。
これは不具合じゃなくて、2つのカンマの間に空の項目があると解釈されるためです。
データによっては空欄も意味を持つので、そのまま残すべき場合もありますが、不要ならループ内で空文字を除外する処理が必要になります。
“`vb
Sub SplitEmptySample()
Dim text As String
Dim arr() As String
Dim i As Long
text = “A,,C”
arr = Split(text, “,”)
For i = LBound(arr) To UBound(arr)
If arr(i) <> “” Then
Debug.Print arr(i)
End If
Next i
End Sub
“`
あと、単純なSplit関数は「カンマが含まれたCSV」を完全に解析できるわけじゃありません。
たとえば、CSVでは `”東京,大阪”` みたいにダブルクォーテーションで囲まれた値の中にカンマが含まれることがあります。
こういう文字列を単純に `Split(text, “,”)` で処理すると、本来1項目として扱うべき値まで分割されちゃいます。
社内で作った単純なカンマ区切りデータならSplitで十分なことも多いですが、正式なCSVファイルをきちんと読む場合は、引用符や改行を考慮したCSVパーサーを使うか、専用の読み込み処理を作る必要があります。
Join関数では、配列の中に数値や真偽値が含まれていても文字列として結合されることがありますが、意図しない表記になる可能性があります。
日付や数値の表示形式をそろえたい場合は、Joinする前に `Format` 関数なんかで文字列に変換しておくと安全です。
たとえば日付を「yyyy/mm/dd」形式に統一したい場合、配列へ入れる段階で表示形式を整えておくと、結合後の文字列も扱いやすくなりますよ。
Split関数とJoin関数を安定して使うためのポイントは、次の3つです。
– Split後の配列は0始まりとして扱って、`LBound` と `UBound` を使ってループする
– カンマ区切りでは区切り文字 `”,”` をちゃんと書いて、省略時の半角スペース結合・分割と混同しない
– Joinに渡す配列は1次元を基本として、セル範囲から取得した2次元配列には注意する
まとめ
Excel VBAのSplit関数とJoin関数は、カンマ区切りの文字列を配列に分割・結合するうえで欠かせない基本機能です。
Splitで文字列を配列に変換すれば、項目ごとのチェックや加工がしやすくなって、Joinで再結合すれば、整形済みのデータをCSV風の文字列や改行区切りの表示に戻せます。
文字列処理に慣れていないうちは、配列の添字や空文字、セル範囲の次元でつまずきやすいですが、基本の動きを押さえれば多くの業務マクロに応用できます。
CSV処理、入力値の整形、一覧データの作成など、日常的なExcel作業を効率化したい場合は、まずSplitとJoinをセットで使えるようにしておくといいですよ。
広告
