@CallMeKoheiさんのブログの記事に「Excel VBA イミディエイトウインドウで整列!」という記事がありました。
たしかに、イミディエイト ウィンドウで桁を揃えてDebug.Printできたら見やすくて便利かもしれません。
というわけで、早速簡単な処理を考えてみました。
Option Explicit Public Sub Sample() Dim v As Variant v = Array("abcde", _ "あいう", _ "123", _ "東京都葛飾区", _ "a") DebugPrintPadRight v v = Array("北海道網走市稲富", _ "", _ "abcdefghijkl", _ "あいうえおかきくけこ", _ "0123456789") DebugPrintPadRight v End Sub Public Sub DebugPrintPadRight(ByVal ary As Variant, _ Optional ByVal max_size As Long = 30) Dim tmp As String, ret As String Dim n As Long, i As Long For i = LBound(ary) To UBound(ary) n = LenB(StrConv(ary(i), vbFromUnicode)) If max_size < n Then n = max_size tmp = StrConv(LeftB(StrConv(ary(i) & Space(max_size - n), vbFromUnicode), max_size), vbUnicode) If i = LBound(ary) Then ret = tmp Else ret = ret & vbTab & tmp End If Next Debug.Print ret End Sub
上記Sampleを実行すると、下図のように文字列の頭が揃った状態でDebug.Printされます。
やっていることは単純で、文字列のお尻に空白をくっ付けて、指定したバイト数で頭から切り出すという、よくあるパディング(埋め)処理です。
ただ、日本語を扱う場合だと、半角文字と全角文字が混在になってしまう可能性があるので、「文字列の長さを取得する(Len/LenB関数):Excel VBA|即効テクニック」にあるような方法で文字列の長さを調整しています。
文字列を一つ一つ指定すると処理が面倒になってしまうため、引数として渡すのは配列にしています。
複数の配列を渡して、まとめてDebug.Printしたい場合は、下記のようにCollectionに入れてループを回せば良いかと思います。
Public Sub Sample2() Dim colAry As VBA.Collection Dim i As Long Dim ary1 As Variant Dim ary2 As Variant Dim ary3 As Variant Dim ary4 As Variant Dim ary5 As Variant Dim ary6 As Variant ary1 = Array("あいう", "abc", "北海道", "123456789") ary2 = Array("かきくけこ", "abcdefghjiklmn", "") ary3 = Array("", "abcdefghj", "東京都新宿区", "012") ary4 = Array("あいうえおかきくけこさしすせそ", "ab", "123456789") ary5 = Array("たちつてとなにぬねのはひふへほまみむめも") ary6 = Array("あかさたなはまやらわ", "aiueokakikukekosashishuseso", "沖縄県那覇市", "012345678901234567890123456789") Set colAry = New VBA.Collection colAry.Add ary1 colAry.Add ary2 colAry.Add ary3 colAry.Add ary4 colAry.Add ary5 colAry.Add ary6 For i = 1 To colAry.Count DebugPrintPadRight colAry(i), 10 Next End Sub
シンプルな処理ですので、実際に上記コードを使う際には、自分の好みに合わせて適当に変更してお使いください。
また、Web検索したところ、海外のサイトで下記のようなWebページも見つけました。
・VBA Tips & Tricks: Aligning Text Output in Variables
http://vbadud.blogspot.jp/2007/04/aligning-text-output-in-variables.html
LSetやRSetを使う方法、これもとても面白い方法ですね!
2015/02/25 追記:
お尻を空白で埋めて頭から切り出す処理を書いておいて、逆に頭を空白で埋めてお尻から切り出す処理がないのは尻切れトンボだったので、処理を追加しました。
Public Sub Sample3() Dim colAry As VBA.Collection Dim i As Long Dim ary1 As Variant Dim ary2 As Variant Dim ary3 As Variant Dim ary4 As Variant Dim ary5 As Variant Dim ary6 As Variant ary1 = Array("あいう", "abc", "北海道", "123456789") ary2 = Array("かきくけこ", "abcdefghjiklmn", "") ary3 = Array("", "abcdefghj", "東京都新宿区", "012") ary4 = Array("あいうえおかきくけこさしすせそ", "ab", "123456789") ary5 = Array("たちつてとなにぬねのはひふへほまみむめも") ary6 = Array("あかさたなはまやらわ", "aiueokakikukekosashishuseso", "沖縄県那覇市", "012345678901234567890123456789") Set colAry = New VBA.Collection colAry.Add ary1 colAry.Add ary2 colAry.Add ary3 colAry.Add ary4 colAry.Add ary5 colAry.Add ary6 For i = 1 To colAry.Count DebugPrintPadLeft colAry(i), 20 Next End Sub Public Sub DebugPrintPadLeft(ByVal ary As Variant, _ Optional ByVal max_size As Long = 30) Dim tmp As String, ret As String Dim n As Long, i As Long For i = LBound(ary) To UBound(ary) n = LenB(StrConv(ary(i), vbFromUnicode)) If max_size < n Then n = max_size tmp = StrConv(RightB(Space(max_size - n) & StrConv(ary(i), vbFromUnicode), max_size), vbUnicode) If i = LBound(ary) Then ret = tmp Else ret = ret & vbTab & tmp End If Next Debug.Print ret End Sub
引数を追加して、右埋め左埋めを切り替えるようにしても良いかもしれません。
この記事へのコメントはありません。