■ 文字列操作、連結、変換、抜出、置換
文字列操作をマスターしよう!
ExcelVBAを使ってシステム開発をする上で、文字列操作は大変重要な意味を持っています。
ワークシート上で表示されている表示形式は、個々のセルの書式として設定されているだけで、見た目通りのデータがセルに格納されているわけではありません。
文字列操作のポイントは、文字列データから必要とされる部分を抜き取ったり、必要とされる形に編集したり、一部分を置き換えたりすることにあります。
これは、さまざまなシステムでほとんどと言っていいほど必要となる操作で、そのためのテクニックはできるだけたくさん知っていたほうが、よりスマートにシステムを開発することができるでしょう。
では、さっそくExcelVBAの文字列操作についてみていきます。
& 、+ 連結演算子
演算子について詳しく知ろう!でも紹介しましたが、文字列の結合に使用します。"+"は連結するリテラルまたは変数が双方で文字列型でない場合、加算(またはエラー)になりますので注意してください。"&"はあくまで文字列として連結します。
(例)
Public Sub test()
Dim MyLng As Long
MyLng = 2
Debug.Print "2" + MyLng
Debug.Print "2" & MyLng
End Sub
この例では、"4"、"22"が出力されます。
Cstr、Str、Val関数
Cstr、Str関数は数値を文字列に変換します。Val関数は文字列を数値に変換します。Strで数値を文字列に変換する場合、正の数だと頭に半角スペース(サイン桁)が付きます。これは符号を記述するためのスペースで、負の数の場合ここに"-"が入ります。Cstr関数にはサイン桁はなくそのまま変換します。またVal関数で文字列を数値にする場合、数字以外の文字があるとそこまでの数字を数値に変換します。
(例)
Public Sub test()
Dim MyLng As Long
MyLng = 2
Debug.Print "2" + Cstr(MyLng)
Debug.Print "2" + Str(MyLng)
Debug.Print Val("2A") + MyLng
End Sub
この例では、"22"、"2 2"、"4"が、それぞれ出力されます。
また、Cstrはデータ型変換関数と呼ばれその仲間に次の関数があります。
データ型変換関数一覧
CBool |
ブール型(Boolean)へのデータ変換 |
CByte |
バイト型(Byte)へのデータ変換 |
CCur |
通貨型(Currency)へのデータ変換 |
CDate |
日付型(Date)へのデータ変換 |
CDbl |
倍精度浮動小数点実数型(Double)へのデータ変換 |
CInt |
整数型(Integer)へのデータ変換 |
CLng |
長整数型(Long)へのデータ変換 |
CSng |
単精度浮動小数点実数型(Single)へのデータ変換 |
CVar |
バリアント型(Variant)へのデータ変換 |
CStr |
文字列型(String)へのデータ変換 |
これらの関数で戻り値が、変換されるデータ型の範囲を超えている場合エラーが発生するので注意が必要です。
Space、String関数
文字列を生成します。Space関数は引数分の半角空白を、String関数は第2引数の文字列の先頭文字を第1引数分作成します。String関数で生成される文字列はあくまで第2引数の先頭文字のみですので、注意してください。
(例)
Debug.Print "*" & Space(2) & "*"
Debug.Print String(4, "*A")
この例では、"* *"、"****"が出力されます。
Trim、Ltrim、Rtrim関数
全角半角の空白を削除します。Trim関数は文字列の左右の空白を、Ltrim、Rtrim関数はそれぞれ、文字列の左側、右側の空白を削除します。なお、文字列内の空白は削除しません。
(例)
Debug.Print Trim(" ** ** ")
Debug.Print LTrim(" ** ** ")
Debug.Print RTrim(" ** ** ")
この例では、"** **"、"** ** "、" ** **"が、それぞれ出力されます。
※ 文字列内の空白を削除したい場合は、Replace関数を使ってスペースを長さ0の文字列に置き換えます。
Lcase、Ucase関数
英字を小文字、大文字に変換します。全角、半角にかかわらず変換します。ファイルの読み書きで、パスを指定する際に使用すると便利です。
(例)
Debug.Print UCase("abcdef")
Debug.Print LCase("ABCDEF")
この例では、"ABCDEF"、"abcdef"が出力されます。
StrConv関数
文字列を指定した形式に変換します。
定数一覧
vbUpperCase:1 |
文字列を大文字にします |
vbLowerCase:2 |
文字列を小文字にします |
vbProperCase:3 |
各単語の先頭文字を大文字にします |
vbWide:4 |
文字列内の半角文字を全角文字にします |
vbNarrow:8 |
文字列内の全角文字を半角文字にします |
vbKatakana:16 |
文字列内のひらがなをカタカナにします |
vbHiragana:32 |
文字列内のカタカナをひらがなにします |
vbUnicode:64 |
文字列をシステム既定のコードページを使ってUnicodeに変換します |
vbFromUnicode:128 |
文字列をUnicodeからシステム既定のコードページに変換します |
(例)
Debug.Print StrConv("abc", vbUpperCase + vbWide)
Debug.Print StrConv("ABC", vbLowerCase + vbNarrow)
Debug.Print StrConv("microsoft ofiice excel", vbProperCase)
Debug.Print StrConv("えくせる", vbKatakana)
Debug.Print StrConv("エクセル", vbHiragana)
この場合、
"ABC"
"abc"
"Microsoft Ofiice Excel"
"エクセル"
"えくせる"
このように出力されます。
Left、Right、Mid関数
文字列から文字列を切り出します。Left、Right関数の場合、第2引数で指定した文字数を文字列の左、右からそれぞれ切り出します。Mid関数の場合、第2引数で指定した文字から第3引数で指定した文字数を抜き出します。第3引数を省略した場合は、文字列の最後まで抜き出します。
(例)
Debug.Print Left("123456", 2)
Debug.Print Right("123456", 2)
Debug.Print Mid("123456", 3, 2)
Debug.Print Mid("123456", 3)
この例では、"12"、"56"、"34"、"3456"が、それぞれ出力されます。
Left、Right、Mid関数はそれぞれ、バイト単位での切り出しに対応します。その場合はLeftB、RightB、MidB、というように最後に"B"を付けます。(Unicodeで処理されるため半角も2バイトになるので注意してください)
(例)
Debug.Print LeftB("123456", 2)
Debug.Print RightB("123456", 2)
Debug.Print MidB("123456", 3, 2)
Debug.Print MidB("123456", 3)
この例では、"1"、"6"、"2"、"23456"が、それぞれ出力されます。
Split関数
文字列を指定した文字(デリミタ)で分割し、1次元配列へ格納します。
(例)
Public Sub test2()
Dim MyStr() As String
MyStr() = Split("Spring,Summer,Autumn,Winter", ",")
Debug.Print MyStr(0)
Debug.Print MyStr(1)
Debug.Print MyStr(2)
Debug.Print MyStr(3)
End Sub
この場合、
"Spring"
"Summer"
"Autumn"
"Winter"
が、それぞれ出力されます。
また、Split関数では、返す要素数を指定することやデリミタの比較方法を指定することも可能です。比較方法の詳細はInstr関数を参照してください。
Midステートメント
文字列の指定部分を置き換えます。Mid関数と書式がよく似ていますが、全く異なる動作をするので注意してください。
第1引数に指定した文字列変数に対して、第2引数の場所から、第3引数分置き換えます。
(例)
Public Sub test()
Dim MyStr As String
MyStr = "123456"
Mid(MyStr, 2, 4) = "****"
Debug.Print MyStr
End Sub
この例では、"1****6"が出力されます。
また、Midステートメントも"B"を付けることでバイト単位の置き換えに対応します。
Replace関数
文字列の一部を指定した文字列に置き換えます。指定した文字列が見つからなかった場合、置き換えません。
(例)
Debug.Print Replace("123456", "2345", "****")
Debug.Print Replace("123456", "9999", "****")
この例では、"1****6"、"123456"が出力されます。
また、Replace関数では開始位置と置き換え回数、比較方法を指定することが可能です。比較方法の詳細はInstr関数を参照してください。
(例)
Debug.Print Replace("123bar456bar789bar0", "bar", "-", 3, 2)
この場合、3文字目から2回置き換えを行うので、"3-456-789bar0"が出力されます。
Len関数
文字列の長さを調べます。全角と半角を区別しません。同じ1文字としてカウントします。"B"をつけることでバイト数をカウントします。(Unicodeで処理されるため全角半角にかかわらず2バイトになります)
(例)
Debug.Print Len("123456")
Debug.Print LenB("123456")
この例では、"6"、"12"が出力されます。
CSVなどに出力する場合、UnicodeではなくShiftJIS換算のバイト数を求めたい場合がよくあります。その場合はStrConv関数を用いて以下のように求めます。
(例)
Debug.Print LenB(StrConv("123456",
vbFromUnicode))
この例では、"9"が出力されます。定数vbFromUnicodeは、システム既定のコードページに変換します。"123"の部分が1バイト、"456"の部分が2バイトで計算されるため、返り値は9バイトになります。
次回も引き続き、文字列操作の解説です。
|