官公庁の申請書などで見られる、1マスに1文字ずつ入力する「Excel方眼紙」のようなレイアウトでは、データが複数のセルに分割されてしまいます。これをVBAで扱うには、まずバラバラのセル値を一つに連結する処理が必要です。
この記事では、複数のセルにまたがって入力された値を、一つのデータとして取得するための2つの代表的なアプローチを、それぞれの長所・短所と共に解説します。
方法1:WorksheetFunction.Concat を使う方法(推奨)
Excel 2019やMicrosoft 365で利用可能な、最新のCONCAT
関数をVBAから呼び出す方法です。コードが非常にシンプルで、処理も高速です。
コードと解説
Sub ConcatenateValuesWithConcat()
' 変数を宣言します
Dim dataRange As Range
Dim combinedNumber As Long
' 連結したいセル範囲を設定
Set dataRange = ThisWorkbook.Worksheets("Sheet1").Range("D5:K5")
' WorksheetFunction.Concatで指定範囲の全セルの値を一気に連結し、
' CLng関数で数値型に変換します。
combinedNumber = CLng(WorksheetFunction.Concat(dataRange))
' 結果を表示
MsgBox "CONCAT関数で連結した数値: " & combinedNumber
End Sub
WorksheetFunction.Concat(dataRange)
: 指定したセル範囲(dataRange
)内の値を、左から右へ順番にすべて連結した一つの文字列を返します。CLng(...)
:Concat
が返した文字列(例:"12345678"
)を、VBAで計算などに使える長整数型(Long)の数値に変換します。
この方法は、コードが1行で完結し、非常に高速なため、CONCAT
関数が使える環境であれば最も推奨されるアプローチです。
方法2:ループ処理で1セルずつ連結する方法
For Each
ループを使い、範囲内のセルを一つずつ巡回して、その値を文字列変数に足していく、古典的で分かりやすい方法です。古いバージョンのExcelでも動作します。
コードと解説
Sub ConcatenateValuesWithLoop()
' 変数を宣言します
Dim dataRange As Range
Dim cell As Range
Dim combinedString As String
' 連結したいセル範囲を設定
Set dataRange = ThisWorkbook.Worksheets("Sheet1").Range("D5:K5")
' ループを開始する前に、結合用の変数を初期化
combinedString = ""
' For Eachループで範囲内の各セルを巡回
For Each cell In dataRange
' 連結用の変数に、セルの値を「&」で繋げていく
combinedString = combinedString & cell.Value
Next cell
' 結果を表示
MsgBox "ループ処理で連結した数値: " & CLng(combinedString)
End Sub
ループ処理の中で、文字列連結演算子&
を使い、combinedString
変数にセルの値を次々と繋げていきます。
この方法は処理の流れが直感的で理解しやすいですが、セルの数が増えるとConcat
関数に比べて処理速度が若干遅くなる傾向があります。
まとめ
Excel方眼紙の複数セルから値を一つにまとめるには、2つの方法があります。
方法 | 長所 | 短所 | Excelバージョン |
WorksheetFunction.Concat | 高速でコードが簡潔。 | 特になし。 | 2019 / 365 |
ループ処理 | 直感的で分かりやすい。 | やや遅く、コードが長くなる。 | すべてのバージョン |
結論として、お使いのExcelが2019以降であれば、迷わずWorksheetFunction.Concat
を使いましょう。
どちらの方法でも、最終的に得られる結果は同じです。ご自身の開発環境や、コードの分かりやすさの好みに応じて、最適な方法を選択してください。