前回は変数の宣言までを書きました。
今回は設定された値を取得して、ランダムに表示するところまで修正しましょう。
いよいよ、プログラムらしくなります。
エクセル de バブルブレーカー(Excel de Bubble Breaker)のダウンロードはこちらから
19.変数の型。
今回は変数の型について説明します。
前回でも述べたように、変数には名前と型があります。
変数名は通常は半角英数字で単語の区切りを大文字にするキャメルケースになることが多いです。またshtやrngなどアルファベット3文字で始まっていますが、これはsheetやrangeの略でプリフィックス(接頭辞)と呼ばれます。プリフィックスをつけることにより他の変数との型の区別がつきやすくなる利点があります。VisualBasicでは変数名やオブジェクト名にプリフィックスをつけることが推奨されていますのでぜひ使ってください。
よく使われる変数の型とプリフィックスについて表に示します。
| プリフィックス | 型名 | 説明 |
|---|---|---|
| int | Integer | 整数型 |
| lng | Long | 長整数型 |
| str | String | 文字列型 |
| flg bool | Boolean | 論理型。TrueかFalseのどちらかが入る |
今回は変数を以下のように宣言しました。
解説し易いように漢字を使っています。
Public sht設定シート As Worksheet
Public sht盤面シート As Worksheet
Public rng盤面 As Range
Private rng開始位置 As Range
Private str開始位置 As String
Private int盤面縦 As Integer
Private int盤面横 As Integer
Private rngバブル色範囲 As Range
Private lngバブル色(1 To 5) As Long
Private lng通常背景色 As Long
Private lng選択背景色 As Long
「sht設定シート」「sht盤面シート」はよく使うオブジェクトなので、全体から見えるように Public 指定しました。
また、盤面のセル範囲もよく使うことになるので、Public で指定しました。
開始位置は、他では使わないため Privateで指定しました。
「str開始位置」という変数は文字型の変数です。
「int盤面縦」「int盤面横」は、-32,768 ~ 32,767 の範囲の整数が入る変数です。
数字以外のもの、範囲以上の数字を代入とエラーになります。
小数点のある数字を代入すると自動で四捨五入されます。
「rngバブル色範囲」は、セル範囲のオブジェクト関数です。
「lngバブル色」は、-2,147,483,648 ~ 2,147,483,647 の範囲の整数が入る変数です。
色は0 ~ 16,581,375までの数値で表されます。
これを16進数であらわすと、&H000000 ~ &HFFFFFF となります。
余談ですが、一つの色を表すのに半角3文字分のメモリーが必要になります。
1024×768 のサイズの一般的なディスプレイに1600万色で表示するにはフロッピーディスク 2枚分のメモリーが必要になります。
エクセルでは、セルの中の文字の色をそれぞれ変えれますが、1600万色で可能にしようとすると、
メモリーが足りなくなり、肝心の計算処理が出来なくなります。
そのため、同時に利用できる色数は56色までに限定されています。
細かな指定をしても、近似色に変更されてしまいます。
「lng通常背景色」「lng選択背景色」は、バブル色と同じ長整数型という変数です。
20.盤面の開始位置、大きさの取得。
新しい Sub プロシージャ「設定値取得」を作成します。
このプロシージャはボタンから呼び出されることはないので、Privateで宣言しています。
1行目 Private Sub 設定値取得()
2行目 Dim i As Integer
3行目
4行目 Set sht設定シート = Application.Worksheets("Sheet1") '将来シート名が変わったときここだけを変更する。
5行目 Set sht盤面シート = Application.Worksheets("Sheet1") '将来シート名が変わったときここだけを変更する。
6行目
7行目 With sht設定シート
8行目 str開始位置 = .Range("開始位置").Value '範囲名があっていれば、将来、どのセルに移動しても変更不要。
9行目 int盤面縦 = .Range("盤面縦").Value
10行目 int盤面横 = .Range("盤面横").Value
11行目 Set rngバブル色範囲 = .Range("通常色") 'オブジェクトを代入していることに注意。
12行目
13行目 For i = 1 To rngバブル色範囲.Cells.Count
14行目 lngバブル色(i) = rngバブル色範囲.Cells(i).Font.Color
15行目 Next i
16行目
17行目 lng通常背景色 = rngバブル色範囲.Interior.Color
18行目 lng選択背景色 = .Range("選択色").Interior.Color
19行目 End With
20行目
21行目 '盤面の範囲を指定する。
22行目 Set rng開始位置 = sht盤面シート.Range(str開始位置)
23行目
24行目 Set rng盤面 = sht盤面シート.Range(rng開始位置, rng開始位置.Offset(int盤面縦 - 1, int盤面横 - 1))
25行目
26行目 End Sub
27行目
1行目から解説していきます。
1行目 Subプロシージャの宣言です。
2~3行目 プロシージャ内で使う変数の宣言です。
5~6行目 Public宣言したシートオブジェクト変数に、シートを設定します。
将来、盤面のシートと、設定のシートが別々になっても、変更が1ヶ所で済むようにします。
7~10行目 設定値を変数(スカラー変数)に代入しています。
str開始位置 = Application.Worksheets("Sheet1").Range("開始位置").Value
int盤面縦 = Application.Worksheets("Sheet1").Range("盤面縦").Value
int盤面横 = Application.Worksheets("Sheet1").Range("盤面横").Value
と書くのと同じことですが、きれいなプログラムを目指すために、"Sheet1"(直値、リテラルという)などという記述な指定は1ヶ所にし、それ以外では変数を使うようにしましょう。
"Sheet1"では分かりにくいので、将来、ユーザーが変えてしまう可能性がありますね。
つまり、直値で記述される内容は、今は固定でも将来変わる可能性があるものがほとんどです。
直値のまま何箇所も記述すると、変わったときの修正に大変苦労することになりますから、
"Sheet1"という直値は、1ヶ所にとどめるのが、将来を見越したコーディングとなります。
変数を宣言して代入してから使うのは面倒に感じることもありますが、極力、直値の記述を避けるように心がけましょう。
本来は定数として宣言するのですが、今回は、基本的に「設定値取得」プロシージャのみ
で使用することとします。
11行目 範囲オブジェクトに、バブルの色設定範囲を指定しています。
13~15行目 バブルの色を、ワークシートの「通常色」範囲に指定されたフォントの色を配列に保存しています。
プログラムの中で最も重要な要素の2つ、繰返しと配列を使っています。
この3行が理解できれば、プログラムの構造の半分を分かったといっても過言ではありません。
先ず、配列についてです。
配列とは、複数の値を1まとめにして扱うことが出来る変数の一種と考えてください。
Private lngバブル色(1 To 5) As Long
と宣言しています。
これで、5色の色をひとまとめにして扱うことが出来ます。
一まとめにして扱う場合 lngバブル色()
3番目の色を扱う場合 lngバブル色(3)
配列と似たものにコレクションというものがあります。
これは、オブジェクトが複数まとめて独自のオブジェクトにしたものと考えてください。
コレクションには、コレクションを構成する要素のほかに、コレクション自体にメソッドや プロパティが存在します。
オブジェクトを配列にした場合、配列はただのまとまりとしての振る舞いしかありません。
さて、配列とコレクションを理解した上で、13行目ですが、繰返し文となっています。
構文の書き方としては、
13行目 For 整数値型変数 = 整数値(初期値) To 整数値(終了値) [Step 整数値(加算値)]
14行目
15行目 Next [For の後に指定した変数]
となります。
[ ] の部分は省略可能です。
このプログラムはコンピュータは次のように実行します。
13行目 整数値型変数に初期値を代入する。
13行目-2 変数が終了値を超えているとき16行目へ飛ぶ。
(加算値がマイナスのときは初期値>終了値になったとき超えたと判断)
14行目 実行する。
15行目 整数値型変数に加算値を足す。
13行目-2 に戻る。
各整数値は、変数(プログラムによって変更される数値)になってもよいので、
初期値が最初から終了値を超えていることも起きます。
その場合は、14行目は実行されません。
(初心者は忘れがちですが、覚えておきましょう)
RangeオブジェクトのCellsプロパティは、コレクションです。
コレクションには、Count というプロパティがあり、コレクションに含まれる要素の数を知ることが出来ます。
これを利用して、バブルの色設定範囲にあるフォントの色を、全て配列に移しています。
13行目 For i = 1 To rngバブル色範囲.Cells.Count
14行目 lngバブル色(i) = rngバブル色範囲.Cells(i).Font.Color
15行目 Next i
Forという命令文(ステートメント)を利用しなければ、
lngバブル色(1) = rngバブル色範囲.Cells(1).Font.Color
lngバブル色(2) = rngバブル色範囲.Cells(2).Font.Color
lngバブル色(3) = rngバブル色範囲.Cells(3).Font.Color
lngバブル色(4) = rngバブル色範囲.Cells(4).Font.Color
lngバブル色(5) = rngバブル色範囲.Cells(5).Font.Color
と書いたのと同じです。
また、コレクションの要素の回数繰り返したいときは、以下のような書き方も可能です。
Dim obj As Object
i = 1
For Each obj In rngバブル色範囲.Cells
lngバブル色(i) = obj.Font.Color
i = i + 1
Next obj
詳しくは For Each などで調べてみましょう。
17~18行目 背景色を取得しています。
22行目、24行目は盤面を取得しています。
Rangeプロパティは、(左上のセル、右下のセル)で新たなセルの範囲を指定できます。
RangeのOffsetプロパティは(下方向にズラす数、右方向ズラす数)で、別の位置のRange(セル範囲)を指定できます。
Range.Offset(0, 0) は、元のRangeを指定していることになるので、10×10の大きさの盤面の
右下のセルは、左上のセルから10-1ズレた位置のセルになります。
そのため、右下のセルの指定は、rng開始位置.Offset(int盤面縦 - 1, int盤面横 - 1) となっています。
ふ~。
慣れたら簡単ですが、ちょっと複雑ですね。
では、最後に以前作った「盤面初期化」のプロシージャを直しましょう。
以下のように、Callステートメントの後ろにプロシージャ名を書きます。
Call 設定値取得
これで、設定値がPublic変数、Praivate変数に取得されます。
次に
With ActiveSheet.Range("F4:X10")
と直値で指定されていた盤面の部分を
With rng盤面
に変更することにより、盤面に罫線が引かれます。
F4の位置に"●"を入力していた部分を消して、
End Withの前に、以下のように加えることで、全てのセルに"●"を入力し、背景色を変更しました。
.Value = "●"
.Interior.Color = lng通常背景色
End With
最後の難関です。
●にランダムに色をつけます。
'ランダムに色をつける
With rng盤面
For i = 1 To int盤面縦
For j = 1 To int盤面横
.Cells(i, j).Font.Color = lngバブル色(Int(Rnd() * 5) + 1)
Next j
Next i
End With
まず盤面のすべてのCellに値が入るようにするには、二重ループを使います。
今回の場合は i の一回目のループで一番上の行 ~ i の最後のループで一番下の行まで値が入るようになっています。
つぎにRand関数は0~1までの乱数をかえします。
ということは (Rand() * 5) + 1 は1以上6未満の数になります。まてよ、5.9とかになったらどうするの?
そこでRand()の前のIntに注目してください。Intは数値を超えない最大の整数を返します。
例えば5.9は5になりますし5.25も5になります。つまり Int(Rnd() * 5) + 1 は1~5 までの整数をランダムに返してくれます。
lngバブル色(1~5) の色はこれまでで指定したので、
これで各Cellの"●"にランダムに色をつけることができました。
ここまで出来れば、盤面の大きさを変更してボタンをクリックしてみましょう。
ずいぶんとプログラムらしくなったと思います。
<< 第34回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その6」 | | 第36回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その8」 >>
>> HOME >> コラム >> 第35回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その7」

コラムの全インデックス
記事一覧 (42)