VBAでの文字列操作の基本
VBAで文字列を扱う基本から始めましょう。文字列を結合する方法や、文字列を分割する方法は、VBAプログラミングにおいて非常に重要な基本技術です。
① 文字列の結合
VBAで文字列を結合する方法は、シンプルですが強力です。
例えば、二つの異なる文字列変数を結合するには、& 演算子を使用します。
これにより、string1 & string2 のように書くことで、二つの文字列を簡単に連結できます。
この操作は、ユーザーからの入力を受け取ったり、結果を表示する際に特に有用です。
例として、「Hello, ” & userName & “!”」のように使用できます。これは、基本的ながら日々のVBA作業で非常に頻繁に使用される技術です。
② 文字列の分割
VBAでの文字列分割は、Split 関数を用いて行います。
この関数は、指定された区切り文字を基準に文字列を分割し、その結果を配列として返します。
例えば、Split("apple,orange,banana", ",") は、カンマを区切り文字として使用し、3つの果物の名前を含む配列を生成します。
これは、ユーザーからのコンマ区切りの入力を処理する場合や、データを簡単に操作する必要がある場合に特に便利です。
文字列の抽出と挿入のテクニック
VBAにおける文字列の抽出と挿入には、特定の関数を使用します。これらの関数は、プログラミングにおける文字列操作の基礎を形成します。
① 文字列の抽出方法
文字列から特定の部分を抽出するには、Left, Mid, Right 関数が一般的に使われます。
例えば、Left(text, 3)は文字列textの最初の3文字を返し、Mid(text, 2, 3)は2文字目から3文字分を抽出します。Right 関数は文字列の右側から指定された数の文字を抽出します。
これらの関数は、特定のパターンやフォーマットに従ったデータの抽出に非常に役立ちます。
② 文字列の挿入方法
文字列に新しい部分を挿入する場合、& 演算子を再度利用します。
既存の文字列に新たな文字列を追加するには、単に originalString & newString と記述します。
これにより、二つの文字列が結合され、新しい文字列が形成されます。この方法は、メッセージのフォーマットやデータの生成に非常に役立ちます。
高度な文字列操作テクニック
文字列操作のさらなる応用として、文字列の置換や正規表現を使った高度な操作方法を見ていきましょう。
① 文字列の置換
文字列の中の特定の部分を置換するには、Replace関数を使用します。
この関数は、指定された文字列内の特定の文字列を別の文字列で置き換えることができます。
例えば、Replace("Hello World", "World", "VBA") は、”Hello World”の”World”を “VBA” で置き換え、”Hello VBA” という新しい文字列を生成します。
この機能は、データのフォーマット変更や単語の置換に非常に便利です。
② 正規表現を用いた文字列操作
VBAでは、VBScript.RegExp オブジェクトを使用して、正規表現を用いた文字列操作が可能です。
例えば、特定のパターンに一致する文字列を検索、抽出、または置換することができます。
これは、複雑な文字列パターンを処理する際に特に有効です。例として、英字のみを抽出する、特定の形式のデータを検索するなどの操作が可能です。
&、+
文字列と文字列を結合するにはアンパサンド( & )演算子を使う方法とプラス( + )演算子を使う方法の2つがあります。
どちらを使用しても構わないのですが、 + 演算子は数値と数値の加算を行う演算子としても使用するので、文字列の連結には & を使用すると分かりやすいかもしれません。
Sub SampleConcatenate()
Dim str1 As String
Dim str2 As String
Dim result As String
str1 = "Hello, "
str2 = "World!"
result = str1 & str2
MsgBox result ' "Hello, World!"と表示されます。
End Subこのコードでは、str1 と str2 という2つの文字列変数を定義し、これらを結合して result に格納しています。最後に結果をメッセージボックスで表示します。
文字列と数値を結合する
& 演算子は文字列と文字列の連結だけでなく文字列と数値や数値と数値の連結にも使用することができます。
Sub テスト()
Dim s1 As String
Dim s2 As String
Dim n1 As Integer
Dim n2 As Integer
n1 = 12
n2 = 8
s1 = "Version." & n1 '結果:"Vrsion.12"
s2 = n1 & n2 '結果:"128"
End Sub文字列と日付を結合する
& 演算子は文字列と日付の連結や日付と日付の連結にも使用することができます。
Sub テスト()
Dim s1 As String
Dim s2 As String
Dim d1 As Date
Dim d2 As Date
d1 = #2022/12/14#
d2 = #16:25#
s1 = "今日の日付は" & d1
s2 = d1 & d2
End SubReplace
文字列内の特定の単語や語句を、指定された単語や語句に置換します。
Sub SampleReplace()
Dim originalText As String
Dim replacedText As String
originalText = "Good Morning"
replacedText = Replace(originalText, "Morning", "Evening")
MsgBox replacedText ' "Good Evening"と表示されます。
End Subここでは、Replace 関数を用いて “Good Morning” の “Morning” を “Evening” に置き換えています。
Left
文字列の左端から指定した文字数分の文字列を取り出します。
strSamp = "111122223333111122223333"
strSamp = Left(strSamp, 4)
'1111を返すRight
文字列の右端から指定した文字数分の文字列を取り出します。
strSamp = "111122223333111122223333"
strSamp = Right(strSamp, 5)
'23333を返すMid
文字列内の指定した文字位置から始まる文字列を取り出します。
Sub SampleMid()
Dim text As String
Dim extractedText As String
text = "VBA Programming"
extractedText = Mid(text, 5, 6) ' "rogram"を抽出
MsgBox extractedText ' "rogram"と表示されます。
End Subこの例では、Mid 関数を使って文字列 “VBA Programming” の5文字目から6文字を抽出しています。
Len
文字列の文字数を返します。
strSamp = "111122223333111122223333"
intCount = Len(strSamp)
'24を返すInstr
文字列内で特定の文字列を検索し、最初に検出された文字の位置を返します。
strSamp = "111122223333111122223333"
intPoint = InStr(strSamp, "3333")
'9を返すStrConv
文字列を指定の形式に変換します。
strSamp = "aaaaa"
strSamp = StrConv(strSamp, vbUpperCase) 'vbUpperCaseかわりに1でもよい
'AAAAAを返す
'文字列を小文字に変換
strSamp = "AAAAA"
strSamp = StrConv(strSamp, vbLowerCase) 'vbLowerCaseのかわりに2でもよい
'aaaaaを返す
'文字列の各単語の先頭の文字を大文字に変換
strSamp = "aaaaa"
strSamp = StrConv(strSamp, vbProperCase) 'vbProperCaseのかわりに3でもよい
'Aaaaaを返す
'文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換
strSamp = "ハヒフヘホ"
strSamp = StrConv(strSamp, vbWide) 'vbWideのかわりに4でもよい
'ハヒフヘホを返す
'文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換
strSamp = "ハヒフヘホ"
strSamp = StrConv(strSamp, vbNarrow) 'vbNarrowのかわりに8でもよい
'ハヒフヘホを返す
'文字列内のひらがなをカタカナに変換します。
strSamp = "はひふへほ"
strSamp = StrConv(strSamp, vbKatakana) 'vbKatakanaのかわりに16でもよい
'ハヒフヘホを返す
'文字列内のひらがなをカタカナに変換
strSamp = "ハヒフヘホ"
strSamp = StrConv(strSamp, vbHiragana) 'bHiraganaのかわりに32でもよい
'はひふへほを返すFormat
指定した形式に従って数値、日付/時刻、文字列の表示形式を設定します。
'現在のシステム日付が2023/11/20の場合
dtToday=Date
Debug.Print Format(dtToday,"yyyymmdd")
'20231120を返す
Debug.Print Format(dtToday,"yyyy/mm/dd")
'2023/11/20を返す
Debug.Print Format(dtToday,"yyyy")
'2023を返す
Debug.Print Format(dtToday,"mm")
'11を返す
Debug.Print Format(dtToday,"dd")
'20を返す
'現在のシステム時刻が19:20:30の場合
dtNow=Now
Debug.Print Format(dtNow,"hh:mm:ss")
'19:20:30を返す
strData="ABCDE"
Debug.Print Format(strData,"<")
'abcdeを返す
strData="vwxyz"
Debug.Print Format(strData,">")
'VWXYZを返すサンプルコード
Replace
文字列内の特定の文字を置換
このサンプルコードは、セルA1の内容からすべてのスペースを削除する例です。
Sub ReplaceSpaces()
Dim originalText As String
Dim modifiedText As String
' セルA1の内容を取得
originalText = Range("A1").Value
' Replace関数を使ってスペースを空文字に置換
modifiedText = Replace(originalText, " ", "")
' 置換後の文字列をセルB1に出力
Range("B1").Value = modifiedText
End Sub文字列内の特定の文字を置換
このサンプルコードは、セルA1の内容から「Apple」という単語を「Orange」に置換する例です。
Sub ReplaceWord()
Dim originalText As String
Dim modifiedText As String
' セルA1の内容を取得
originalText = Range("A1").Value
' Replace関数を使って「Apple」を「Orange」に置換
modifiedText = Replace(originalText, "Apple", "Orange")
' 置換後の文字列をセルB1に出力
Range("B1").Value = modifiedText
End Sub別シートの置換用リストをもとに、表のなかの文字列を全て置換する
このコードは、「List1」シートの置換用表に基づいて、「Sheet1」シートの表をすべて検索し、置換を行います。




置換用の表が不定行数である場合でも機能し、Sheet1のすべてのセルを対象に置換を行います。
Sub ReplaceBasedOnList()
Dim wsSource As Worksheet
Dim wsReplace As Worksheet
Dim replaceRange As Range
Dim cell As Range
Dim findText As String
Dim replaceText As String
Dim lastRowReplace As Long
Dim lastRowSource As Long
Dim lastColSource As Long
Dim i As Long
Dim j As Long
' シートを設定
Set wsSource = Worksheets("Sheet1")
Set wsReplace = Worksheets("List1")
' 置換用の表の最後の行を取得
lastRowReplace = wsReplace.Cells(wsReplace.Rows.Count, "A").End(xlUp).Row
' 置換用の表の範囲を設定
Set replaceRange = wsReplace.Range("A1:B" & lastRowReplace)
' データの最後の行と列を取得
lastRowSource = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
lastColSource = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column
' Sheet1の表をループ
For i = 1 To lastRowSource
For j = 1 To lastColSource
' セルの内容を取得
Dim cellValue As String
cellValue = wsSource.Cells(i, j).Value
' 置換用の表をループ
For Each cell In replaceRange.Columns(1).Cells
findText = cell.Value
replaceText = cell.Offset(0, 1).Value
' セルの内容に置換対象の文字列が含まれている場合、置換
If InStr(cellValue, findText) > 0 Then
cellValue = Replace(cellValue, findText, replaceText)
End If
Next cell
' 置換後の値をセルに設定
wsSource.Cells(i, j).Value = cellValue
Next j
Next i
End Subコードの説明
- シートの設定
wsSourceに「Sheet1」を設定し、wsReplaceに「List1」を設定します。
- 置換用の表の最後の行を取得
lastRowReplaceは、置換用の表の最後の行を示します。
- データの最後の行と列を取得
lastRowSourceとlastColSourceは、「Sheet1」の表の最後の行と列を示します。
- Sheet1の表をループ
- 二重のForループを使って、Sheet1のすべてのセルをチェックします。
- 置換用の表をループ
replaceRangeの各セルをチェックし、セルの内容に置換対象の文字列が含まれている場合に置換します。
- 置換後の値をセルに設定
- 置換後の文字列を元のセルに戻します。