文字列

■概要

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型)
				
		引数:
			第一引数:
				変換用文字列
			
			第二引数:
				変換定数(以下の表参照)
				tool_0031
			
			内容:
				文字列を変換定数の内容で変換してその結果の文字列を返す

			具体例:
				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型の配列に代入します。