ジーワンシステム社長のITコラム。
   ITについて、その他もろもろ
>> HOME >> コラム >> 第35回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その7」

« 第34回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その6」 | メイン | 第36回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その8」 »

第35回目 「エクセル de バブルブレーカー(Excel de Bubble Breaker)その7」

前回は変数の宣言までを書きました。
今回は設定された値を取得して、ランダムに表示するところまで修正しましょう。
いよいよ、プログラムらしくなります。

エクセル de バブルブレーカー(Excel de Bubble Breaker)のダウンロードはこちらから

19.変数の型。
   今回は変数の型について説明します。
   前回でも述べたように、変数には名前と型があります。    変数名は通常は半角英数字で単語の区切りを大文字にするキャメルケースになることが多いです。またshtやrngなどアルファベット3文字で始まっていますが、これはsheetやrangeの略でプリフィックス(接頭辞)と呼ばれます。プリフィックスをつけることにより他の変数との型の区別がつきやすくなる利点があります。VisualBasicでは変数名やオブジェクト名にプリフィックスをつけることが推奨されていますのでぜひ使ってください。
   よく使われる変数の型とプリフィックスについて表に示します。

プリフィックス型名説明
intInteger整数型
lngLong長整数型
strString文字列型
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」

トラックバック

このエントリーのトラックバックURL:
http://www.g1sys.co.jp/cgi-bin/app/mt-tb.cgi/53

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

  • 製品案内
システム構築・運用、技術サポート・ビジネスブログ・ホームページ制作の株式会社ジーワンシステム
株式会社ジーワンシステム

〒550-0014
大阪市西区北堀江1-5-2
四ツ橋新興産ビル 11F

TEL: 06-6535-8660
FAX: 06-6535-8661

E-mail: info@g1sys.co.jp

Powered by
Movable Type 3.34