はじめに
VBAの「固定長文字列」は、指定した文字数に満たない場合に、自動でスペースが追加(パディング)される便利な機能です。しかし、デフォルトの挙動では、代入するデータが文字列なら左詰め、数値なら右詰めとなり、細かなアライメント(文字寄せ)の制御はできません。
例えば、「商品名は常に左詰めで、数量は常に右詰めにしたい」といった、より厳密なフォーマットが求められる場面で活躍するのが LSet
と RSet
というステートメントです。
この記事では、LSet
とRSet
を使って、固定長文字列の中での文字の配置を自在にコントロールする方法を解説します。
LSet
/ RSet
を使ったサンプルコード
このマクロは、それぞれ文字数が固定された3つの変数を用意し、LSet
(左詰め)とRSet
(右詰め)を使って値を代入し、その結果を確認します。
完成コード
' LSetとRSetで文字寄せを制御する
Sub AlignFixedLengthStrings()
'--- 固定長の文字列変数を宣言 ---
Dim productCode As String * 8 '商品コード
Dim productName As String * 10 '商品名
Dim quantity As String * 5 '数量
Dim fullRecord As String
'--- 1. LSetで値を左詰めで代入 ---
' "リンゴ" という文字列を、10文字の領域の左側に寄せる
LSet productName = "リンゴ"
'--- 2. RSetで値を右詰めで代入 ---
' "ABC01" という文字列を、8文字の領域の右側に寄せる
RSet productCode = "ABC01"
' 50 という数値を、5文字の領域の右側に寄せる
RSet quantity = 50
'--- 3. 全ての変数を連結 ---
fullRecord = productCode & productName & quantity
'--- 4. 結果を確認 ---
Debug.Print "コード (" & Len(productCode) & "文字): [" & productCode & "]"
Debug.Print "商品名 (" & Len(productName) & "文字): [" & productName & "]"
Debug.Print "数量 (" & Len(quantity) & "文字): [" & quantity & "]"
Debug.Print "連結後(" & Len(fullRecord) & "文字): [" & fullRecord & "]"
MsgBox "イミディエイトウィンドウに結果を出力しました。"
End Sub
実行結果
上記マクロを実行すると、VBEのイミディエイトウィンドウ(Ctrl+G
で表示)に以下のように出力されます。
コード (8文字): [ ABC01]
商品名 (10文字): [リンゴ ]
数量 (5文字): [ 50]
連結後(23文字): [ ABC01リンゴ 50]
コードの解説
LSet productName = "リンゴ"
LSet
(Left Set) は、固定長文字列変数に対して、値を左詰めで代入します。
"リンゴ"
(4文字)は、productName
(10文字)の領域の左端に配置されます。- 足りない6文字分は、右側に半角スペースが自動で埋められます。
RSet productCode = "ABC01"
RSet
(Right Set) は、固定長文字列変数に対して、値を右詰めで代入します。
"ABC01"
(5文字)は、productCode
(8文字)の領域の右端に配置されます。- 足りない3文字分は、左側に半角スペースが自動で埋められます。
- 数値 (
RSet quantity = 50
) を代入した場合も、同様に右詰めになります。
通常の代入 (=
) との違い
通常の =
で代入した場合、VBAはデータ型に応じて自動的に文字寄せを決定します(文字列は左詰め、数値は右詰め)。LSet
とRSet
は、この自動的な挙動を上書きし、常に意図した通りの文字寄せを強制できるという点が異なります。
まとめ
今回は、LSet
とRSet
を使って、固定長文字列内でのアライメントを制御する方法を解説しました。
LSet
: 値を左詰めで代入する(右側をスペースで埋める)。RSet
: 値を右詰めで代入する(左側をスペースで埋める)。
これらのステートメントは、固定長のデータレコードを作成する際に、各フィールドの文字寄せを厳密に定義する必要がある場合に非常に役立ちます。通常の代入とLSet
/RSet
の違いを理解し、適切に使い分けましょう。