String関数なるものの存在を知った

String関数を使う

前回の

akashi-keirin.hatenablog.com

に、id:imihito さんからコメントをいただいた。

特定の1文字の繰り返しは
String関数(名前が紛らわしいですが)を使うと簡単に作れたりします。
VBA.Strings.String$(2, "0")

とのこと。

へえ! 知らなんだ。

VBA界隈では超有名なOffice TANAKAさんによると、

String関数

構文

String(num,character)

引数numには、文字をいくつ並べるかを指定します。

引数characterには、並べる文字を示す文字コード、または文字を指定します。

解説

引数characterで指定した文字コードに該当する文字、または引数characterで指定した文字列の先頭文字を、引数numで指定した回数並べた文字列を返します。

ということなので、コイツを使ったらゼロ埋め用の書式文字列を作るのが簡単にできそう。

コーディング

前回使用したコードでは、ゼロ埋め用に複数の「0」をつなげるのに、Forループを用いた。

Dim i As Integer
Dim n As Integer
Dim formatString As String
n = Len(CStr(objNum)) - 1
For i = 1 To n    '……(*)'
  formatString = formatString & "0"
Next
formatString = formatString & "#"

(*)のところですね。

「最大ケタ数-1」個の「0」をつなげた文字列を作るために、1つづつ「0」をつないでいる。

String関数を使えば、これを

Dim n As Integer
Dim formatString As String
n = Len(CStr(objNum)) - 1
formatString = String(n, "0") & "#"    '……(1)'

おおっ! 最後に「#」を付けるところまで含めて、こんなに簡単に書ける!

実行結果

前回使用したコードを次のように改めて実行。

リスト1
Public Sub testFormatFunction()
  Dim objNum As Integer
  objNum = 105
  Debug.Print objNum & "個のゼロ埋め文字列を作ります。"
  Dim i As Integer
  Dim n As Integer
  Dim formatString As String
  n = Len(CStr(objNum)) - 1
  formatString = String(n, "0") & "#"    '……(*)'
  For i = 1 To objNum
    Debug.Print Format(i, formatString)
  Next
End Sub

(*)のところが変更箇所。

実行すると、

f:id:akashi_keirin:20170716075058j:plain

以下省略。

ほれ、ちゃんとゼロ埋めの文字列ができておる。

おわりに

ある程度VBAで意図通りの処理ができるようになってくると、ついつい手持ちの知識だけでどうにかしてしまう、ということになる。

んで、その結果として

ちょっと知識があればカンタンに書ける処理

を、

すんげー力技で解決しちゃう

ということになる。

ある程度自力でコーディングできるようになってきたら、改めてVBA関数一覧なんかを読み直してみる必要があるなあ、と感じました。

久しぶりに入門書を読み直してみるとするか。

それにしても、そもそも

String関数の本来の使い道って何なのだろう……???

@akashi_keirin on Twitter