マル中数字をインクリメントする

マル中数字の連番との戦い

1つのブックの中に同じ様式のワークシートが10ヶあって、それぞれに異なるデータを入力していく、という業務が発生した。

ウチの職場では、普通は1シートづつポチポチ入力していくものらしい。

しかし、だ。たいていはせいぜい3シートぐらいまでしか入力することがないらしいんだが、私に割り当てられた業務では約30シート分ぐらい入力せんといかん。

そんなことやってられっかぼけーーーー!

んで、別のシートに約30レコード分のデータを一覧表にしておいて、そこからマクロで転記するようにしようとした。

そしたらね……。

なんと、

データ入力様式のシートの名前が「××①」、「××②」、……みたいになっとる!!!!!!!!

マジかよ……。

一瞬、シート名を変えようかとも思ったんだが、なんかあちこちリンクされているみたいだし、下手にいじくって動かなくなるのもイヤなので、マル中数字をインクリメントして取得する方法を考えた。

マル中数字をインクリメントして取得する

ちょこっとggってみると、こんなのが見つかった。

f:id:akashi_keirin:20170805195502j:plain

①から⑳までは、都合良く順番に並んでいるみたい。

これなら、16進数の 8740 から 1 づつインクリメントさせればうまく行きそうだと思った。

文字コードから2バイト文字を取得する方法については、コチラを参考にした。

手順

文字コードから「①」を取得する手順

  1. 16進数の「8740」をCInt関数で整数に変換する
  2. 1.で得られた整数をChr関数に渡す
  3. 「①」が返る

CInt関数が何をやっているのかよく分かっていないのだが、ともかくイミディエイト・ウインドウに

?Chr(CInt((&h8740))

と入力して[Enter]を押すと、

f:id:akashi_keirin:20170805195504j:plain

この通り、「①」が取得できている。

あとは、「8740」の部分をインクリメントしていけば、①、②、③、……というふうになるはず。

テストコード

次のようなコードで実験してみる。

リスト1
Public Sub testNumberInCircle()
  Dim i As Integer
  For i = 0 To 9
    Debug.Print Chr(CInt("&h" & 8740 + i))
  Next
End Sub

実行結果

f:id:akashi_keirin:20170805195517j:plain

無事、①から⑩まで取得することができた。

おわりに

2バイト文字の処理のしかたについては、根が素人だけに分かっていないことが多くて往生する。

今回はShiftJISだったけど、文字コードは他にもあるので、根本から勉強しないといけないなあ。

@akashi_keirin on Twitter