文字列
■概要
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型の配列に代入します。
内容:
文字列を変換定数の内容で変換してその結果の文字列を返す
具体例:
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
