月刊プログラム!
Visual Basic For Excel

Vol_15
2001.Aug.08

Presented by kouta_y
感想等は掲示板、苦情はメールへ。

にこちゃん
インターネットに限らずですが、結構こーゆー「プログラミング教室」みたいな事やってるHPって多いです。
多い方が初心者にとってはありがたいんですが、プログラマ一人一人それぞれ考え方とか、やり方とか違うと思います。
同じコンピュータで同じ言語使ってるにも関わらず、違うってのも面白いんですが、このHPでやってる事も含め「この人がやってる
この方法しかない!」とは考えないでください。
間違ってる事を言ってはいないですが、もっと違うやり方・方法もきっとあります。
多面的な考え方な方が、より柔軟なプログラムが組めると思います。
んで、その方法が一番効率が良いんだという判断は、ご自分で判断出来る様になってください。

何言ってんだか分かんなくなってきました。。。(o_O)/~
それでは本題に入りましょう。


今回はちょっとしたゲームを作ってみます。
ゲームってのは、プログラミングもさることながら、全体的な難易度は最高峰に難しいんじゃないかと思います。
売り物になるような物を作ろうと思ったとき、まず1人では作れないでしょう。(作ってる人もいるとは思いますが・・・)
まずゲームの顔というべき「グラフィックス」。中身の「プログラム」。その時の雰囲気をリアルに表現する「音楽」。
そしてそして一番頭を悩ませる「シナリオ」。
これら4つをマスターしている人達と力をあわせて、やっとこさ「ゲーム」になる。
なかなか1人でやろうと思うと難しいモンです。
まぁちょっとしたもんなら「音楽」くらいはなくてもいいと思いますが・・・。

まぁ、今回作るのはそんな難しいもんではないです。
よくみかける?「スロットゲーム」です。
くるくる数字がループして、ぴこぴこ止めて「やったー!当たったー!」ってやつですね。

では各々簡単に説明しながら作ってきましょう。
まず、エクセルを立ち上げてください。
んで「ボタン」を4つ程作ってください。
とりあえず前準備はこんな所でいいでしょう。(簡単・・・)
ボタン4つ

プログラムの方の前準備です。
「標準モジュール」を追加してください。いつも通りですね。
とりあえず中身からっぽのプロージャを4つ作ります。
はいそうです。ボタンに割り当てる用のいわゆる「イベント」用プロージャです。


メンドイので画像にしました。
こんな感じです。名前は適当でいいです。
色が黒いのは、作者が適当にエディタの環境設定をいぢったからです。(黒のが見やすい)
メニューの「ツール」の「オプション」で出来ますヨン♪

では最初に作ったボタンに、それぞれのプロージャを割り当ててください。
やり方はボタンを右クリックして、「マクロの登録」でやります。
vba_11でも似たような事やってます。


それではプログラミングの本題に移ります。
とりあえずSlotプロージャに、下の様なコードを作ります。
まだ実行はしないでください。実行すると終了できなくなりますので、絶対に実行はしないでください。
実行してしまった方はCtrl+Alt+Delキーで強制終了してください。

Sub Slot()
Dim a As Integer, b As Integer, c As Integer

'ランダム値初期化
Randomize

'初期値を設定
a = Rnd() * 10
b = Rnd() * 10
c = Rnd() * 10

Do
    Cells(3, 2) = a
    Cells(3, 3) = b
    Cells(3, 4) = c
    a = a + 1
    b = b + 1
    c = c + 1
   If a >= 10 Then a = 1
    If b >= 10 Then b = 1
    If c >= 10 Then c = 1
Loop

End Sub

はい。こんな感じです。
一応「スロット」のメインの部分になります。
Cellsの位置は適当で構いません。

でもこのループは「抜ける条件式」がない上に、これだけではストップボタンを押す事が出来なくなるばかりか、終了する事も出来なくなります。
普通にマクロを組んだだけでは、マクロ実行中はユーザーは手が出せないんですが、この問題を解消するのが、
「DoEvents」
という関数です。
この関数はヘルプには「プログラムが独占していた制御を一旦Windowsに返す」とあります。
まぁ要するに「ユーザーに操作を許す」というような意味だと思ってください。
んで、このDoEvents関数をDoループ内の最初に入れてください。
入れたらとりあえず「条件式」は後にして、1回実行してみましょう。



おー、実行中にキャプチャしたんですが、ちゃんと止まってキャプチャ出来てますね。当然ですね。
実行を中止するには、メニューの「実行」から「リセット」をクリックします。
速すぎて見えませんが、ちゃんと出来てる様です。

さて次に、1コボタンを押したら1コのスロットが止まる様にしないといけません。
ここで「グローバル変数」というものを使います。
今までは「プロージャ」内ででしか使ったり、見たりする事しかできない変数でしたが、「グローバル変数」は「どのプロージャからでも」参照できます。
変数の宣言の仕方はいつも通りですが、「場所」を注目してください。

'グローバル = どっからでも参照出来る
Dim
aa As Boolean, bb As Boolean, cc As Boolean
'
'上の各変数の記憶期間は、エクセルが起動している間中
'ずっと保持される
'
Sub Slot()
Dim a As Integer, b As Integer, c As Integer

'ランダム値初期化
Randomize

'初期値を設定
a = Rnd() * 10
b = Rnd() * 10
c = Rnd() * 10

Do
    DoEvents
    Cells(3, 2) = a
    Cells(3, 3) = b
    Cells(3, 4) = c
    a = a + 1
    b = b + 1
    c = c + 1
    If a >= 10 Then a = 1
    If b >= 10 Then b = 1
    If c >= 10 Then c = 1
Loop

End Sub

aaとかbbというブール型の変数をグローバル変数としています。
宣言場所はプロージャの外でしてます。
プロージャの外で宣言した変数は、グローバル(つまりどこからでも参照できる)変数となります。

んで、ストップさせるには、このブール変数が「Trueになったら加算しない」という感じで使います。
これは説明いらないと思いますが、変数aaは変数a用のフラグ。変数bbは変数b用のフラグ。変数ccは・・・って感じです。
ではそれをIF文にしてコードに追加します。

'グローバル = どっからでも参照出来る
Dim
aa As Boolean, bb As Boolean, cc As Boolean
'
'上の各変数の記憶期間は、エクセルが起動している間中
'ずっと保持される
'

Sub
Slot()
Dim a As Integer, b As Integer, c As Integer

'ランダム値初期化
Randomize

'初期値を設定
a = Rnd() * 10
b = Rnd() * 10
c = Rnd() * 10

'フラグを初期化
aa = False
bb = False
cc = False


Do
   DoEvents
    If Not
aa Then
        Cells(3, 2) = a
        a = a + 1
        If a >= 10 Then a = 1
    End If
   If Not bb Then
        Cells(3, 3) = b
        b = b+ 1
        If b >= 10 Then b= 1
    End If
    If Not cc Then
        Cells(3, 4) = c
        c = c+ 1
        If c >= 10 Then c= 1
    End If
Loop

End Sub

はい。こんな感じですね。
ブール型変数であればIF文の条件式の所で「Not」というのをつければ、「Falseの時」という意味になります。
(NOT演算。否定する結果を返す)

さてさて、最後に残ったa_Stopとかの各プロージャのコードですが、もう説明不要ですね。
はい。ただ単に、フラグ変数をTrueにするだけでよいです。

Sub a_Stop()
aa = True
End Sub

これだけです。

あぁーっと!
後回し後回しにしすぎて、忘れてました。。。
えーと、ループの抜ける条件式ですが、まぁここも説明いらないですかね。
「各変数aa・bb・ccが全てTrueとなった時」という風にしてください。全てTrueという事は、全てストップがかかってるって事ですから。
あとはお好みで、数がそろった時とかの処理を加えたりします。
あっと、エクセルの方のボタンの配置とかも、いろいろ好みでデザインすると良いでしょう。

では最終的なコードです。
Module1.txt
テキストファイル

実行結果例:



なんてセンスのないデザインだろう・・・。
上手くスリーセブンになってるのはプログラマの特権で、あわせました。(いらん事を言う人間だなぁ・・・)


今回はこれで終わりです。
結構まともなモンが作れたなぁと思っているのですが、どうでしょう?
プログラムってのはこんな事も出来ます。

あと「グローバル変数」についてなんですが、「値の保持期間」について説明します。
エクセルマクロの場合、グローバル変数の値はエクセルが起動している間中ずっと記憶しています。(確か)
なので、Slotプロージャ内でフラグ変数を初期化してるんですね。
初期化しないと、1回しか遊べないスロットゲームになります。まぁどんな風になるのか試してみるのも一興?
あとグローバル変数を応用して、回数制限のあるゲームにしても良いかもしれませんね。
1回100円とか(わけわからん)。
作者が作ったソフトでのお金儲けは禁止ですよ♪

えー、では最後に、今回やった「スロットゲーム」を下からダウンロード出来ます。
当然中身でマクロが組まれていますが、ウィルスには感染していません。
尚、このブックで生じたいかなるトラブルにも作者は責任を負いません。
プログラムに関する質問とかは受け付けますよ♪

Book1.lzh
(9.77KB)