文字列
■概要
VBAで文字列を扱う場合String型を使用します。
格納できる文字数はExcelVBAでは20億文字まで可能となっているので、
文字数にしばれることなく使用することが可能です。
例:
Sub Test()
Dim str As String
str = "テスト"
MsgBox str
End Sub
出力結果:
テスト
■文字の扱い
●文字列の結合
VBAの文字列は簡単に文字の結合を行うことができます。
結合に使用する記号は「&」か「+」を使います。
例:
Sub Test2()
Dim str As String
str = "結合" + "文字列" & "表示"
MsgBox str
End Sub
出力結果:
結合文字列表示
・文字結合の注意点
「+」記号の場合、文字ではなく数値として
計算されてしまう可能性があるので注意が必要です。
例:
シートのA1に1、シートのB1に2を指定
例1(+記号使用):
Sub Test3()
Dim str As String
str = Cells(1, 1).Value + Cells(1, 2).Value
MsgBox str
End Sub
出力結果:
3
例2(&記号使用):
Sub Test4()
Dim str As String
str = Cells(1, 1).Value & Cells(1, 2).Value
MsgBox str
End Sub
出力結果
12
上記の例の出力結果にあるようにTest3は1 + 2の計算が行われ「3」と出力されますが、
Test4では数値の「1」と「2」を結合して「12」と表示します。
このように「+」と「&」で結果が異なりますので状況によって使い分けてください。
●固定長文字列
VBAには一定以上の文字数を設定できないようにする「固定長文字列」が用意されています。
この文字列の1文字は半角、全角ともに1文字としてカウントされます。
・書式
書式例:
Dim 変数名 As String * 文字数
宣言例:
Dim str As String * 10 ' 10文字設定可能
具体例:
Sub Test5()
Dim str As String * 5
str = "1234567890"
MsgBox str
End Sub
出力結果:
12345
Sub Test6()
Dim str As String * 5
str = "1234567890"
MsgBox str
End Sub
出力結果:
12345
●文字数取得関数
文字列の文字数を取得する関数としてLenとLenBが用意されています。
Lenは字数を返し、LenBはバイト数を返します。
・Len
戻り値:
文字数
引数:
String:文字列
内容:
指定した文字列の文字数を返す
半角、全角についてはきちんと判断した字数を返してくれる
例:
Sub Test7()
Dim str As String * 5
str = "1234567890"
MsgBox "strの文字数は" & Len(str)
End Sub
出力結果:
strの文字数は5
・LenB
戻り値:
文字列のバイト数
引数:
String:文字列
内容:
指定した文字列のバイト数を返す
VBAはunicodeなので半角、全角ともに2バイトで計算される
例:
Sub Test8()
Dim str As String * 5
str = "1234567890"
MsgBox "strのバイト数は" & LenB(str)
End Sub
出力結果:
strのバイト数は10
●半角、全角判断でのバイト数取得
VBAの文字コードはUnicodeを使用しているので、
文字は半角、全角にかかわらず2バイトとして扱われています。
半角1バイト、全角2バイトとしてバイト数を取得するには
StrConv関数を使用してShift_JIS形式に置き換えてから取得する必要があります。
StrConv:
戻り値:
変換後の文字列(Variant型)
引数:
第一引数:
変換用文字列
第二引数:
変換定数(以下の表参照)
内容:
文字列を変換定数の内容で変換してその結果の文字列を返す
具体例:
Sub Test9()
Dim str As String
str = StrConv("12345", vbFromUnicode)
MsgBox "strのバイト数は" & LenB(str)
End Sub
出力結果:
strのバイト数は7
StrConvの問題点として固定長で用意された文字列の場合
以下の例のようにShift_JISに変換してもバイト数は全て2バイトで扱われます。
例:
Sub Test10()
Dim str As String * 5
str = StrConv("12345", vbFromUnicode)
MsgBox "strのバイト数は" & LenB(str)
End Sub
出力結果:
strのバイト数は10
■文字列とByte
バイナリ出力で文字列を出力する場合、
Unicodeよりも、Shift_JISの方が都合がいい場合もあります。
ゲームでは固定長の文字列はchar型の配列で持つことが多いので
それを扱う外部データもchar型として出力した方が
データを使用する際に変換の必要がなくなります。
手順:
Sub Test11()
' ①.Byte型の配列を用意
Dim byte_list(19) As Byte
' ②.出力する文字列を用意
Dim str As String
str = "12345"
' ③.UnicodeからShift_JISに変換
str = StrConv(str, vbFromUnicode)
' ④.変換した文字列をバイトの配列として取得
Dim tmp_byte_list() As Byte
tmp_byte_list = str
' ⑤.文字列を配列に代入
Dim i As Long
Dim str_len As Long
If UBound(tmp_byte_list) > 20
str_len = 19
Else
str_len = UBound(tmp_byte_list)
End If
For i = 0 To str_len Step 1
byte_list(i) = tmp_byte_list(i)
Next i
End Sub
まず文字列をShift_JISに変換します。
その変換した文字列を仮のByte型の配列にキャストし、
その配列の値を正式なデータとして使用するByte型の配列に代入します。