通し番号を途中で改行してみる

昨日は、ユーザーフォーム上に散らかした42個のコマンドボタンを、じわじわ動かして整列させてみた。
infoment.hatenablog.com

これについて、一工夫行った箇所がある。それは1~42の連番を、6行×7列に並び替えした箇所だ。

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
36 37 38 39 40 41 42

行に関しては、1~7の次に、また1に戻って欲しい。そこで、割り算の余りを活用する。
単純に7で割った余りにすると、7の時に余りが0になって都合が悪い。
f:id:Infoment:20181123211233p:plain

そこで予め1を引いておき、7で割った余りを求め、そこに1を足してみる。
f:id:Infoment:20181123211459p:plain
これで、1~7がきれいに循環するようになった。

同時に、8番目でカウントアップする仕掛けが必要だ。こちらは、7で割って小数点第一位を切り上げてみた。
f:id:Infoment:20181123211818p:plain
これで、行についても準備が整った。

ところで先日、こちらで「多段階配列(ジャグ配列)」の存在を初めて知った。
www.excellovers.com

なんと、配列の中に配列を設定できるという。もともと、特に座標のような値は、例えば原点の場合

  • x=0
  • y=0

とするより、

  • 座標(0)(0,0)

と表したほうがしっくりくる。今回で言えば、このような感じか。

(1,1) (2,1) (3,1) (4,1) (5,1) (6,1) (7,1)
(1,2) (2,2) (3,2) (4,2) (5,2) (6,2) (7,2)
(1,3) (2,3) (3,3) (4,3) (5,3) (6,3) (7,3)
(1,4) (2,4) (3,4) (4,4) (5,4) (6,4) (7,4)
(1,5) (2,5) (3,5) (4,5) (5,5) (6,5) (7,5)
(1,6) (2,6) (3,6) (4,6) (5,6) (6,6) (7,6)

以上を踏まえて昨日は、1~42までの連番を多段階配列に変換し、ボタン設置用の座標指定に利用したわけで。

Private Property Get Locate() As Variant
    Dim seq(1 To 42) As Variant
    Dim i As Long
        For i = 1 To UBound(seq)
            seq(i) = Array(Left_Start + ButtonSize * ((i - 1) Mod 7), _
                           Top_Start + ButtonSize * WorksheetFunction.RoundUp(i / 7, 0))
        Next
        Locate = seq
End Property

解説というほどの解説ではないけれど、参考まで。