ゼロ埋め連番を作成する

Format関数の第2引数は、変数でも良かった

ゼロ埋め連番文字列を動的に生成する

たとえば、

akashi-keirin.hatenablog.com

こんなマクロを使って大量にファイルを生成するような場合、ファイル名の先頭がゼロ埋め連番になっていると非常に都合が良い。

で、やってみた。

考え方

次のような手順で、適切な桁数のゼロ埋め連番文字列が得られると考えた。

  1. 個数の桁数を数える
  2. 「0」を「個数の桁数-1」個連結した文字列を作り、変数に格納する
  3. 2.でできた文字列に、「#」を連結し、変数に格納する
  4. 3.まででできた文字列をFormat関数の第2引数とする

コーディング

リスト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    '……(1)'
  For i = 1 To n    '……(2)'
    formatString = formatString & "0"
  Next
  formatString = formatString & "#"
  For i = 1 To objNum
    Debug.Print Format(i, formatString)    '……(3)'
  Next
End Sub

(*)で、変数objNumに105を代入しているので、とりあえず105までの連番をゼロ埋めで作ることになる。

(1)の

n = Len(CStr(objNum)) - 1

でobjNum(今回は「105」)のケタ数(今回は「3」)から1引いた数を変数 n に代入している。

Len関数の引数なんだが、

Len(CStr(objNum))

と、objNumをString型にキャストして渡している。

別に

Len(objNum)

でも良さそうなもんだが、実際そうすると、

f:id:akashi_keirin:20170709215538j:plain

こんなふうに、Len関数の返り値が「2」になっている。

イミディエイト・ウインドウに

?Len(105)

とすると、

f:id:akashi_keirin:20170709215618j:plain

こんなふうにコンパイル・エラーになる。

ちょっとggってみると、こういうことらしい。

指定された文字列の文字数、または変数の格納に必要な名目上のバイト数を含む整数型の値を返します。

ということは、単純に

Len(objNum)

としたときの返り値はInteger型の変数のバイト数だったってことか。納得。

話を元に戻そう。

(2)からの4行

For i = 1 To n
  formatString = formatString & "0"
Next
formatString = formatString & "#"

では、Format関数の第2引数を作っている。

今回の例の場合、3ケタのゼロ埋め数字ができれば良いのだから、Format関数の第2引数は、

"00#"

になれば良い。

今回、数字の個数は「105」。すなわち、3ケタのゼロ埋めになれば良い。(1)の段階で変数 n には「2」が入っているので、まずForループで「"00"」ができて、Forループ終了。

最後に、「#」を付け加えるので、変数formatStringの中身はめでたく「00#」になっている。

これを(3)の

Debug.Print Format(i, formatString)

でFormat関数の第2引数として渡してDebug.Printでイミディエイト・ウインドウに変数 i を出力する。

実行結果

f:id:akashi_keirin:20170709215526j:plain

まず最初にこんなふうに表示され、

f:id:akashi_keirin:20170709215551j:plain

f:id:akashi_keirin:20170709215608j:plain

こんなふうに、ゼロ埋めで数字が出力された。

おわりに

ゼロ埋め連番のケタ数を、対象データの個数に応じて動的に設定できるので、それなりに重宝するかも。

@akashi_keirin on Twitter