2007年7月7日土曜日

第17回目 データ処理マクロの基礎2-5

○第17回目 データ処理マクロの基礎2-5



 前回出てきた"1-56のカラーコード"、すなわち"カラーパレットのインデックス番号"については、下記のホームページを参照してください。

http://www.geocities.jp/ogawa7a/sheets_14.html#color



 今回は、行の部分と3*3ブロックの色塗りです。

 列のマクロをコピーして、修正するといいでしょう。

 セルのコントロールの仕方だけを注視すればすぐできると思います。

 

 行の場合の検査値は、O列=15列に入っています。

 数値と行番号の対応は列と同じです。

 色をぬる場所が異なります。

 今度は、横に色をぬっていきます。それから次の行に移ります。

 

'行の部分

For i = 0 To 8 '下に動かす

If Cells(14 + suuti + i * 9, 15) = 9 Then    'ここを修正

For j = 0 To 8 '横に動かす

Cells(4 + i, 3 + j).Interior.ColorIndex = 6  '黄色 ここを修正

Next j

End If

Next i



 それでは、3*3ブロックの部分です。

 

'3*3ブロック

For i = 0 To 8 '3*3ブロックの番号順に動かす

If Cells(14 + suuti + i * 9, 15) = 9 Then    'ここを修正

For j = 0 To 8 '3*3ブロックの中を動かす

Cells(4 + i, 3 + j).Interior.ColorIndex = 6  '黄色 ここを修正

Next j

End If

Next i

 

 上記のものは、ただ行の部分をコピーし、コメント部分を少し修正しただけです。

 動くものはjとiがあります。jは、ブロックの中をうごくもので、iはブロックの場所が動くものです。

 3つづという規則性がありますので、3でわって商と余りを使います。

 jについては、余りが行の位置、商が列の位置を示します。

 ブロックの左上のセルから見て、(基準行数+余り、基準列番号+商)となっています。

 iによってこの基準となるセルが動きます。これも表の左上のセル(4,3)から見て、

 iの商と余りを用いて、(4+余り*3,3+商*3)となります。

 

'3*3ブロック

For i = 0 To 8 '3*3ブロックの番号順に動かす

   a1=4+(i mod 3)*3

   a2=3+(i\ 3)*3



If Cells(14 + suuti + i * 9, 17) = 9 Then   

For j = 0 To 8 '3*3ブロックの中を動かす

   b1=4+(j mod 3)

   b2=3+(j \ 3)

Cells(a1+b1,a2+b2).Interior.ColorIndex = 8 '水色

Next j

End If

Next i

 

 このあとに、数値が入っているセルにも色をぬりましょう。

 判断は数字が入っているかヌルがはいっているか否かです。

 これは表だけでできます。

 

'数値の入っているセル



For i = 0 To 8

For j = 0 To 8

  If Cells(4 + j, 3+i) <> "" Then   ' ""はヌル(空白)のこと

   Cells(4 + j, 3+i).Interior.ColorIndex = 15 '灰色

  End If

Next j

Next i

 

 あとは、追加すべき機能としては、一々終了しないで、繰り返すかどうかを聞く機能でしょう。

 Inputboxで、終了する場合は99を、繰り返す場合の新しい調べたい数値を入れるようにしたらどうでしょうか。

 suuti = InputBox("終了しますか。終了の場合は99を、繰り返す場合は1-9までの値を入れてください。", , 99)

 このsuutiをif文で聞いてみてください。

  

 さて、繰り返す場合、どうやって、上に戻るのでしょうか?

 goto文があるのですが、ほとんど使用例をみたことがないのです…

 

 以下のような記述を見つけましたので、少しだけの使用にしておきましょう。

 http://excelvba.pc-users.net/fol6/6_7.html


 7.GoToステートメント

---------------------------------------------------------------------------

プロシージャ内で処理を分岐させたい場合にはGoToステートメントを使用することができます。ただし、GoToステートメントを多用するとプログラムが分かりにくくなるのでなるべく使用しない方が良いでしょう。

Sub Goto文()
MsgBox ("Gotoステートメントのテスト1")

GoTo Label1

MsgBox ("Gotoステートメントのテスト2") '→実行されない

Label1:

MsgBox ("Gotoステートメントのテスト3")

End Sub

ここに記述されたとおり、


Label1:



GoTo Label1 というペアで使います。

 ちょっとした応用問題ですので、各自チャレンジしてみてください。

0 件のコメント: