VBA:文字列操作

目次

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 オブジェクトを使用して、正規表現を用いた文字列操作が可能です。

例えば、特定のパターンに一致する文字列を検索、抽出、または置換することができます。

これは、複雑な文字列パターンを処理する際に特に有効です。例として、英字のみを抽出する、特定の形式のデータを検索するなどの操作が可能です。

hideharu
VBAでの文字列操作は、多様なシナリオで非常に役立ちます。基本から応用までしっかりとマスターしましょう!

&、+

文字列と文字列を結合するにはアンパサンド( & )演算子を使う方法とプラス( + )演算子を使う方法の2つがあります。

どちらを使用しても構わないのですが、 + 演算子は数値と数値の加算を行う演算子としても使用するので、文字列の連結には & を使用すると分かりやすいかもしれません。

“文字列1” & “文字列2”
“文字列1” + “文字列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

このコードでは、str1str2 という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 Sub

Replace

文字列内の特定の単語や語句を、指定された単語や語句に置換します。

Replace(“対象文字列”,”置換前の文字(列)”,”置換後の文字(列)”,検索開始位置(省略可),置換回数(省略可),比較モード(省略可))

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

文字列の左端から指定した文字数分の文字列を取り出します。

Left(“文字列”,取り出す文字数)

strSamp = "111122223333111122223333"
strSamp = Left(strSamp, 4)
'1111を返す

Right

文字列の右端から指定した文字数分の文字列を取り出します。

Right(“文字列”,取り出す文字数)

strSamp = "111122223333111122223333"
strSamp = Right(strSamp, 5)
'23333を返す

Mid

文字列内の指定した文字位置から始まる文字列を取り出します。

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

文字列の文字数を返します。

Len(“文字列”)

strSamp = "111122223333111122223333"
intCount = Len(strSamp)
'24を返す

Instr

文字列内で特定の文字列を検索し、最初に検出された文字の位置を返します。

InStr(検索開始位置(省略可),”検索対象文字列”,”検索文字列”,比較モード)

strSamp = "111122223333111122223333"
intPoint = InStr(strSamp, "3333")
'9を返す

StrConv

文字列を指定の形式に変換します。

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

指定した形式に従って数値、日付/時刻、文字列の表示形式を設定します。

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

コードの説明

  1. シートの設定
    • wsSourceに「Sheet1」を設定し、wsReplaceに「List1」を設定します。
  2. 置換用の表の最後の行を取得
    • lastRowReplaceは、置換用の表の最後の行を示します。
  3. データの最後の行と列を取得
    • lastRowSourcelastColSourceは、「Sheet1」の表の最後の行と列を示します。
  4. Sheet1の表をループ
    • 二重のForループを使って、Sheet1のすべてのセルをチェックします。
  5. 置換用の表をループ
    • replaceRangeの各セルをチェックし、セルの内容に置換対象の文字列が含まれている場合に置換します。
  6. 置換後の値をセルに設定
    • 置換後の文字列を元のセルに戻します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次