こんにちは!VBAの海へようこそ。先輩エンジニアの私です。
マクロの記録を卒業し、「よし、自分でコードを書くぞ!」と意気込んだとき、誰もが最初に直面するのが「文字列の結合」ですよね。
画面に文字を表示したり、セルの値を組み合わせてファイル名を作ったり……。文字列操作はVBA自動化の基本中の基本です。ここであなたに質問です。VBAで文字列をくっつけるとき、どの記号を使っていますか?
`&` (アンパサンド)ですか? それとも `+` (プラス)ですか?
「どっちも一緒でしょ?」と思って適当に使っているなら、ちょっと待ってください!実はこの2つ、「何気なく使っていると、ある日突然データが消える(Nullになる)」という恐ろしい爆弾を隠し持っているのです。
今回は、この「`&` と `+` の決定的な違い」と、プロの現場で必須となる「大量処理の高速化テクニック」を、優しく、かつ深く伝授します。ここをクリアすれば、あなたのVBAスキルは確実にワンランク上のステージに上がりますよ!
—
1. 結論:文字列結合は「&(アンパサンド)」を使え!
いきなり結論から言いましょう。
VBAで文字列を結合するときは、必ず `&` を使ってください。`+` は文字列結合には使わない。 これがプロの鉄則です。
なぜか? それは「Null(ヌル=値が存在しない状態)」が混ざったときの挙動に天と地ほどの差があるからです。
データの裏側で何が起きているのか?(図解的解説)
空っぽのセル(未入力のセル)や、データベースから取得した「値がない」状態を、VBAの世界では `Null` と呼びます。この `Null` が文字列にくっついたとき、`&` と `+` は次のような反応を示します。
- `&`(アンパサンド)の優しさ
- 「おっ、空っぽのやつがいるな。まあいい、そのまま繋げよう!」
- 結果:Nullを空文字(””)として扱って、何事もなかったかのように結合する。
- `+`(プラス)の冷酷さ
- 「計算しようとしたのに、片方がNullだと!? 処理不能だ! 全てをNullにしてやる!」
- 結果:結合結果が丸ごと `Null` に変貌し、後続の処理がすべてクラッシュする。
言葉だけだとピンとこないかもしれないので、実際にコードでその恐ろしさを見てみましょう。
—
2. 挙動の違いをコードで体感する
以下のコードをVBAの標準モジュールに貼り付けて実行してみてください。
Sub ComparePlusAndAmpersand()
Dim strText As String
Dim varNullData As Variant
‘ 変数に文字列と、あえて「何もない(Null)」を代入
strText = “東京都”
varNullData = Null ‘ ここがポイント!
‘ 【実験1】 & 演算子を使った場合
On Error Resume Next
MsgBox “& 演算子の結果: ” & (strText & varNullData), vbInformation, “&の挙動”
‘ 【実験2】 + 演算子を使った場合
MsgBox “+ 演算子の結果: ” & (strText + varNullData), vbCritical, “+の挙動”
On Error GoTo 0
End Sub
実行結果はどうなったでしょうか?
- `&` を使った方は、`東京都` と正しく表示されたはずです。
- 一方、`+` を使った方は……あれ? 空っぽのメッセージボックスになりませんでしたか?(あるいはエラーすら出ずに値が消え去りました)。
実務では、Excelシートの未入力セルを読み込んだり、外部システムと連携したりするときに、知らず知らずのうちに `Null` が混入します。そこに `+` を使っていると、「なぜか特定の人だけデータが空になる謎のバグ」を生み出す原因になります。
したがって、文字列を繋ぐときは必ず `&` を使う。これを今日の合言葉にしてください。
—
3. 【発展編】大量の文字列結合は「&」でも遅い!?Join関数の魔法
さて、`&` の安全性が分かったところで、次はパフォーマンス(速度)の話をしましょう。
例えば、「1000行あるエクセルのデータを、すべて1つの長ーーい文字列にまとめたい」というとき、次のようなコードを書く人がいます。
‘ 【NGパターン:絶対にやってはいけない書き方】
Dim result As String
Dim i As Long
For i = 1 to 10000
‘ ループのたびにメモリ上で文字列を作り直している
result = result & Cells(i, 1).Value & vbCrLf
Next i
一見、何の問題もなさそうに見えますよね。しかし、データが5万行、10万行と増えていくと、このコードはパソコンがフリーズしたかのように激遅(ゲキドサ)になります。
なぜ `&` のループは遅くなるのか?
VBAの文字列型(String)は、メモリ上で「専用の小部屋」を確保しています。
`result = result & 続き` を実行するたびに、VBAは以下のような悲しい作業を裏で行っています。
1. 今までの文字列の長さを測る
2. 「今までより少し広い新しい小部屋」を新しくメモリ上に確保する
3. 古い小部屋から新しい小部屋へ文字をすべてコピーする
4. 最後に「続き」の文字をくっつける
これを1万回も繰り返すのですから、パソコンが疲れてしまうのも無理はありません。
救世主「Join関数」の登場
この問題を一刀両断するのが、VBAに備わっている `Join` 関数 と 配列(Array) のコンビネーションです。
プロの現場では、大量の文字列を扱うときは以下のように書きます。
‘ 【Goodパターン:爆速で処理するプロの書き方】
Sub FastStringJoin()
Dim buf(1 To 10000) As String ‘ 文字列を格納する配列をあらかじめ用意
Dim i As Long
Dim finalResult As String
‘ 1. まず配列にデータをガツガツ格納していく(メモリ上で一瞬で終わる)
For i = 1 To 10000
buf(i) = Cells(i, 1).Value
Next i
g
‘ 2. Join関数を使って、配列の要素を「改行区切り」で一気に結合する!
finalResult = Join(buf, vbCrLf)
‘ 確認用
MsgBox “結合完了!文字数の長さ: ” & Len(finalResult), vbInformation
End Sub
Join関数の何がすごいの?
`Join` 関数は、メモリの再確保を最小限に抑え、裏側で一気にスパッと文字列を繋ぎ合わせます。
ループ回数やデータ量が増えれば増えるほど、普通の `&` 結合とは何十倍、何百倍ものスピードの差となって現れます。
「何万行もあるデータをCSV形式に加工する」「ログファイルをごっそり生成する」といったシーンでは、この `Join` 関数があなたの強力な相棒になります。
—
4. まとめ:ここをクリアすれば、基本はバッチリ!
お疲れ様でした! 今回の重要なポイントをもう一度おさらいしましょう。
1. 文字列の結合には必ず `&` を使う。
- `+` は `Null` が混ざったときにデータを破壊(消失)させる爆弾だから絶対に避ける!
2. 大量のデータをループで結合する場合は、`&` の連続を避ける。
- 配列と `Join` 関数を組み合わせて、パフォーマンスを劇的に最適化する!
この2つを知っているだけで、あなたの書くVBAコードの「安全性」と「処理速度」は、一般的な初心者レベルを遥かに超越したものになります。
「たかが記号、されど記号」。こういう細部へのこだわりこそが、頼れるエンジニアへの第一歩です。
明日からのVBAコーディングで、ぜひ意識してみてくださいね。それでは、また次の海でお会いしましょう!
