2007年6月24日日曜日

第12回目 データ処理マクロの基礎

○第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 件のコメント: