○第12回目 データ処理マクロの基礎
データを処理するマクロの基本は、セルから数値を取得し、数値を加工し、またセルに加工した数値を書き込む、ということになります。
これから更にエッセンスを取り出して、配列変数の使い方とセルの座標の使い方を考えていきます。
"数独"を知っているかと思いますので、数独を材料に使います。
数独の表を、C4(セル座標のこと)からK12にまで展開します。これは適当に用意してください。新聞の週末版に数独のクイズが載っているものがありが、それを使うのが便利でしょう。なければ適当に数値を入れてもいいです。
テーマは、
表にある数値を配列変数に格納し、それを別の場所に書き出す、です。(加工部分は省略した)。
【前提】
数独の表の列の順番で連番を振るとします。一列目が0-8、三列目が18-26、九列目が72-80などとなります。
書き出す場所は、E15から下に展開し、数値は81個あるのでE95までとなります。
D列にE列に対応した連番を振りましょう。0-80まで。
配列変数は二次元とし、変数名等はmm(8,8)とします。
Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
dim mm(8,8)
《表の数値を変数に格納する》
《変数の数値を縦一列に展開する》
《あわせて、手前の列に連番を振っておく》
End Sub
大きなブロックでみると上のようになります。
【解説1】
配列の定義
Dim mm(8,8) で定義。
内容は、0-8 かける 0-8 の変数を意味します。
最初の添え字は列、次の添え字は行を表すとします。
添え字は0から始まります。
以上は前提です。
【解説2】《表の数値を変数に格納する》
mm(i,j) = cells(l,m)
変数の(i,j)にセル(l行,m列)の値を入れます。
i=0(1列目)のとき、j=0-8まで動きますので
for next を使って次のように書きます。
i=0
for j=0 to 8
mm(0,j) =cells()
next j
さて、cells()の添え字はどうなるでしょうか。
表はC4からはいっているので、最初の一列目はC12までです。
ですから、cells(4+j,3)となります。
jの始まりは0で、それに対応するセルの行番号は4ですので、"4+j"となります。
列ば一定でC列なので3のままです。
よろしいですか。
つぎにいきます。今度は列が動くことを考えると、さらにfor nextで包むことになります。
i=0のところを次のように変えます。
for i=0 to 8
cells()の中は(4+j,3+i)になります。
i=0の時は、C列
i=1の時は、D列となるわけです。(最後にnext iを忘れずに)
ここまでで次のようになります。
Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
dim mm(8,8)
'《表の数値を変数に格納する》
for i=0 to 8
for j=0 to 8
mm(i,j) =cells(4+j,3+i)
next j
next i
《変数の数値を縦一列に展開する》
《あわせて、手前の列に連番を振っておく》
End Sub
【解説3】
《変数の数値を縦一列に展開する》は前ところの"mm(i,j) =cells(4+j,3+i)"
を逆にすればいいのです。
cells(l,m)= mm(i,j)
mは条件でE列ですので"5"となります。
lは15から95までです。
このところを、15+lとすると、lは0から80となります。
変数はi,jで管理されているので、i,jをつかって0-80までを作り出す必要があります。
(i=0,j=0)⇒0
(i=0,j=1)⇒1
(i=0,j=8)⇒8
(i=1,j=0)⇒9
(i=1,j=1)⇒10
(i=1,j=2)⇒11 となります。
この規則性から、
l=i*9+jとなります。
したがって、マクロは次のようになります。
for i=0 to 8
for j=0 to 8
cells(20+i*9+j,5)=mm(i,j)
next j
next i
【解説4】
最後にD列に、0からの連番を振るのは
for i=0 to 80
cells(15+i,4)=i
next i
これをまとめると
Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
Dim mm(8, 8)
'表の数値を変数に格納する》
For i = 0 To 8
For j = 0 To 8
mm(i, j) = Cells(4 + j, 3 + i)
Next j
Next i
'《変数の数値を縦一列に展開する》
For i = 0 To 8
For j = 0 To 8
Cells(15 + i * 9 + j, 5) = mm(i, j)
Next j
Next i
'《あわせて、手前の列に連番を振っておく》
For i = 0 To 80
Cells(15 + i, 4) = i
Next i
End Sub
今回は 以上です。

0 件のコメント:
コメントを投稿