ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.12 [ 乱数 ]

■乱数

『乱数』と聞いて、何のことだか皆さんはわかりますか。乱れる数、つまり乱数と言うのはランダムに生成される数のことを言います。
ゲームと乱数とは、実は切っても切れない関係にあります。RPGなどで、どんな敵が出てくるかは毎回ランダムに決まりますよね。あれも乱数が関係していますし、格闘ゲームなどで、敵が繰り出してくる攻撃も、やはりそのときそのときによって違います。これも乱数ですね。
このように、ゲームを作るにあたって、乱数を知っておくことは非常に重要な意味を持ちます。

じゃんけんを思い浮かべてみてください。
実際にじゃんけんを、ゲームとしてプログラミングするには、どうしたらいいでしょうか。
まず、プレイヤーの出す役(グーチョキパー)は、まぁプレイヤー自身が自分で決めるからいいとしても、コンピューターの出す役まで、プレイヤーが決めてしまうわけにはいきません。かといって、何かしら一定のパターンにそって役を決めてしまうと、いつかは見破られてしまうかもしれません。
一番ベストなのは、プレイヤーが毎回役を自由に決めることができ、かつコンピューターは毎回ランダムに決められた役を出してくることですね。こういったときに活躍するのが『乱数』です。
乱数をうまく使って、じゃんけんゲームを作成してみることにしましょう。


■じゃんけんの仕組みを整理する

じゃんけんのルールがわからない、という人はいないと思います。いわゆる三すくみと呼ばれる仕組みを使って勝負を決する、世界共通の遊びです。
これをプログラミングして、ゲームとして遊ぶためにはどうすればいいのでしょうか。簡単に整理してみることにします。

1:プレイヤーが自由に役を選ぶことができる
2:コンピューターはなんの役を出してくるかわからない
3:双方の出した役をもとに、勝負を判定する

最低でも、上に記した3つの条件が必要ですね。
今回のテーマは乱数ですから、まずは2番目の部分を紐解いていくことになります。


■とりあえずどうする?

まずは乱数を生成する仕組みを解説していきます。
乱数を生成するためには、『Rnd』というキーワードを使います。
例えば、次のようなコードを実行すると、実行するたびに、毎回違った答えが表示されます。

Sub Test()
    Dim R As Single
    R = Rnd
    MsgBox R
End Sub


Rndは、0以上の数値で、1よりも小さい数値を、毎回ランダムに返します。つまり、最も小さいときで0が、最も大きいときで0.99999……が得られるわけです。もし、Integer型などの、整数しか扱えない変数を使ってしまうと、小数点以下が四捨五入されてしまうので、0か1のどちらかになってしまいます。
上の例では『R』という変数を定義しています。変数Rは、Singleという型で宣言されていますね。Chapter6でも解説していますが、Singleという型は、単精度浮動小数点型とも呼ばれ、要するに小数点以下の数値を扱うことができる変数の型です。このSingle型の変数を用いることによって、Rndが返してくる結果を詳しく正確に知ることができるのです。

Rnd:

構文
    Rnd()
説明
    0以上、1未満の数値を返す
    返される数値は、毎回ランダムに生成される


■じゃんけんゲームを考える

乱数を作るには、Rndを使うというところまでは理解できましたか?

さて、じゃんけんでコンピューターの役をランダムに変えるためには、Rndをうまく使えばどうにかなりそうですが、まだ困った問題が残っています。
じゃんけんでは、役の種類が3種類しかありません。
グー、チョキ、パーの3種類ですね。しかしRndを使うと、色々な乱数が発生してしまうので、何千何万という膨大な種類になってしまいます。生成されてくる乱数が3種類なら、グーチョキパーにそれぞれ数値をあてがうことによって、コンピューターの役を決めることができます。たとえば1をグー、2をチョキ、3をパーとすれば、数値によってコンピューターの役を決められますね。

Rndをつかって生成される乱数を、一定の範囲に限定したい場合には、『Int』というキーワードを併用する必要があります。

Int:

構文
    Int(number)
説明
    numberで指定した数値の、小数点以下の部分を丸めた結果を返す

Intは、小数点以下の部分を切り捨てて、整数部分だけを返す機能を持っています。例えば、『Int(1.2345)』とすると、結果は『1』になります。『Int(9.8765)』の場合だと『9』です。小数点以下は全て切り捨てられて整数部分だけが取り出されます

単純に、『Int(Rnd)』としてしまうと、絶対に0しか得られませんね。Rndが返す乱数は、絶対に1より小さい数値ですから、小数点以下を切り捨ててしまうと0しか答えが無いわけです。
そこで、Rndの部分に掛け算をして、数値の範囲を大きくしてしまうのです。ちょっとわかりづらいと思いますので、以下の例を見てください。
生成される乱数の範囲結果
Int(Rnd)0~0.99999……0
Int(Rnd*2)0~1.99999……0,1
Int(Rnd*3)0~2.99999……0,1,2
Int(Rnd*10)0~9.99999……0,1,2,3,4,5,6,7,8,9


どうですか、なんとなくわかってきませんか?
『Int(Rnd*10)』という式の場合は、0から9.99999……までの数値が乱数として生成されます。小数点以下の数値を切り捨ててしまうと、0から9までの乱数が得られることになります。つまり、Rndに掛け算する数字から、1を引いた数の乱数を発生させることができるのです。0も含めると、掛け算した数字分の種類の乱数が得られるというのが、これでわかると思います。


■まとめ

RndとInt、この2つのキーワードを使って、じゃんけんの役をランダムに作るためには、3種類の役が必要です。ですから式は『Int(Rnd*3)』のようにすればいいですね。ただし、このやり方では乱数の範囲が0か1か2ですから、ちょっとわかりづらいです。理想的なのは1か2か3ですよね。そのほうが断然わかりやすい。
そこで、式を書くときに最初に1を足してしまいましょう。『Int(Rnd*3)+1』としておけば、1を足しているので得られる乱数の範囲が1か2か3になります。これは簡単ですね。

さて、これらのことを踏まえて、3種類の乱数を生成する式をコードを書いてみましょう。

Sub Ransuu()
    Dim R As Single
    R = Int(Rnd*3)+1
    MsgBox R
End Sub


このコードを何度も実行してみてください。メッセージと表示される数値は、必ず1か2か3のどれかになっているはずです。
これで、じゃんけんのとき、コンピューターが出してくる役を毎回ランダムに変えるための、乱数の準備ができました。


■格言

乱数とは毎回ランダムに生成される数値のこと
乱数を生成するためにはRndを使う
一定の範囲の乱数を得るためにIntを併用する


乱数はゲームの基本のひとつです。しっかり覚えておきましょう。


スポンサーサイト






Chapter.13 [ 条件分岐 ]

■条件分岐ってなに?

じゃんけんゲームを作成するために、もうひとつ欠かせない要素があります。それが『条件分岐』です。
条件分岐とは『もし、○○だったらこうする。××だったらこうする』といったふうに、条件によって処理をわけることをいいます。じゃんけんは自分の出した役と、相手の出した役の組み合わせによって勝ち負けが決まりますね。つまり条件によって勝ったり負けたりするわけですから、これをプログラミングするためには、条件分岐を学ばなくてはなりません。

じゃんけんに限らず、ゲームの作成には絶対に条件分岐が出てきます。
シューティングゲームなら、もし敵の弾が自分に当たったら……とかですね。

条件分岐をしっかり覚えていないと、ゲームの作成は無理です。しっかり覚えましょう。


■If文

条件分岐を行うためには、『If』というキーワードを使います。読み方は『イフ』です。英語でIfは、もし~ですから、意味としてはそのまんまです。

If:

構文
    If 条件 Then
        処理~
    End If
説明
    条件に適合する場合のみ、処理の部分を行う
    最後は必ずEnd Ifをつけて終わる

Ifのあとに半角スペースを空けて、条件を記述します。その後に、また半角スペースをあけてThenをつけます。これは文法上の絶対の決まりですので覚えておいてください。
そして、その条件にあっている(適合している)場合だけ、その後の処理を行います。条件を満たしているかどうかに関係なく、Ifで始まった条件分岐は必ずEnd Ifで閉じなければなりません。
それでは例を挙げてみましょう。

Sub IfTest()
    Dim I As Integer
    I = Int(Rnd * 3) + 1
    If I = 1 Then
        MsgBox "1です"
    End If
End Sub

このコードを見て、どのような挙動をするかわかるでしょうか?
上のコードでいうと『I = 1』の部分が『条件』の部分です。つまり、条件として、変数 I が1の場合だけ、というように定義しています。
Rndによって生成された乱数が、Intによって小数点以下を切り捨てられるのは前回解説しましたね。そしてRndに掛け算し、1を足していることによって、変数 I には1か2か3のどれかが入っています。
3種類のどれかが入った変数 I 。これを条件にして、もし、変数 I が1だったときだけ、『1です』というメッセージを表示させます。上のコードはそういう意味になっているのです。

ということは、もし変数 I に入っている数値が、1以外だったときはどうなるのでしょうか? 答えは何も起こらない、です。実行しても、一瞬にして処理が完了し、何事も無かったかのようにシーン……です。つまり、変数に入っている数値が1だったときだけ、メッセージを表示するコードの部分が行われていることになります。

これがIf文、つまり条件分岐なのです。


■複数の条件を指定する

さて、上で解説したIf文の仕組みを使えば、様々な条件に応じて異なる処理を行うことができるようになります。
ただし、今のままだと1種類の条件にしか対応していません。先ほどの例で言えば、変数 I が1だった場合だけは処理が行われますが、そうではなかった場合には、何も起こりません。条件に合わなかった場合にも、それなりの処理を行いたい場合は結構あるものです。
RPGでいえば、もし敵が死んだ場合には戦闘を終了しますね。しかし死ななかった場合に何も起こらなかったら、ゲームが成り立ちません。これは条件に適合しなかった場合にも、それはそれで何かしらの処理を行う必要があるというケースですね。

条件に適合しなかった場合の処理を行うためには『Else』をつかってIf文を拡張します。これも例を挙げて見てみることにしましょう。

Sub IfTest()
    Dim I As Integer
    I = Int(Rnd * 3) + 1
    If I = 1 Then
        MsgBox "1です"
    Else
        MsgBox "1以外の何かです"
    End If
End Sub

Elseを記述した後のコードは、条件に適合しなかった場合の処理です。
つまり、このコードを実行すると、先ほどのように場合によっては何も起こらないということは絶対にありません。必ず『1です』か、『1以外の何かです』のどちらかのメッセージが表示されます。
変数 I が1だった場合は『1です』と表示。変数 I が2か3だった場合には『1以外の何かです』と表示します。


■さらに細かく条件を分岐する

さぁ、Ifについてはだんだんわかってきましたか?
実は、さらに細かく条件を指定することもできます。今回の例で言えば、変数 I が2か3だった場合には処理が同じものになってしまっていますね。これをさらに分岐させてメッセージを表示させることができるのです。

それが下のコードです。

Sub IfTest()
    Dim I As Integer
    I = Int(Rnd * 3) + 1
    If I = 1 Then
        MsgBox "1です"
    ElseIf I = 2 Then
        MsgBox "2です"
    Else
        MsgBox "3です"
    End If
End Sub

ここまで順をおってキチンと読んできた方には簡単でしょう。
Elseには、じつはIfを合体させることができるのです。これが『ElseIf』です。ElseIfを使う場合は、通常のIf文と同じように、条件を記述してThenをつけます。そしてその後の部分に処理を記述します。
上のコードを、日本語に翻訳すると『もし変数 I が1だったら1ですと表示し、それ以外の場合のうち、もし2だったら2ですと表示する。そのどちらでもない場合は3ですと表示する』というふうになります。

この場合は、変数 I に入っている数値が1か2か3のどれかということが確実ですから、最後の部分はElseだけを記述すればいいですね。もしも変数 I の中身に1~3以外の数値が入っている可能性がある場合は、1~3以外の全ての数値で『3です』と表示されちゃいますからまずいですけどね。

ElseIfは、同じIf文のなかで何度でも使えます。いくらでも条件分岐は増やすことができるのです。ですから、例えば次のようなコードもキチンと動きます。
Sub IfTest()
    Dim I As Integer
    I = Int(Rnd * 5) + 1
    If I = 1 Then
        MsgBox "1です"
    ElseIf I = 2 Then
        MsgBox "2です"
    ElseIf I = 3 Then
        MsgBox "3です"
    ElseIf I = 4 Then
        MsgBox "4です"
    ElseIf I = 5 Then
        MsgBox "5です"
    End If
End Sub



■まとめ

条件分岐をうまく使いこなすことによって、様々な状況に応じて、異なる処理を行うことができます。じゃんけんは自分と相手の役次第で、結果が分かれるゲームです。上手に条件分岐を使うことが、じゃんけんゲームを作るうえで欠かせない要素なのです。

今回、If文をマスターできたことで、じゃんけんゲームを作成するための考え方を、ほぼ理解できたと言っていいと思います。次回は、じゃんけんゲームのゲーム画面を設計してみることにします。


■格言

ゲームには条件分岐は欠かせない
条件分岐を行うためにはIf文を使う
ElseIfを使うことでさらに細かく分岐可能


ゲームに限らず、条件分岐は超重要な概念のひとつ。
しっかり覚えておきましょう。








Chapter.14 [ ゲーム画面のデザイン ]

■ユーザーフォームデザイン

Excelでゲームを作る方法には、大きく分けて4つあります。これについては以前説明しました。詳しくはChapter.9 [ ゲームつくる様々な手法 ]を見てくださいね。
この講座では、いわゆるモード3、ユーザーフォームを使ってゲームを作っていきます。今回は、じゃんけんゲームの実際のゲーム画面を設計してみることにしましょう。

じゃんけんゲームとひとくちに言っても、様々なゲーム画面を考えることができます。というか、むしろこの設計の部分は、プログラマーの個性とも言えますから、ある程度自分の感覚を信じて直感的に設計するのがいいでしょう。なにか不備が見つかったって後から修正すればいいだけのことです。始めは、あまり力を入れすぎないで、さくっとデザインするようにしましょう。

今回の講座では、以下のような感じのゲーム画面を設計します。
068


■フォームの挿入とオブジェクトの配置

まずは新しくユーザーフォームを挿入します。挿入する方法がわからないという人はChapter.10 [ ユーザーフォーム ]<を見てくださいね。
新しく挿入されたユーザーフォーム(以下フォーム)は、毎回規定の大きさになっています。まずはデザインしやすいように、適当に大きくしておきます。フォームの右下隅の部分にある調整ハンドルをドラッグして、少し大きくしておきましょう。
060

大きさを調整

061


次に、ラベルを2つ、テキストボックスを1つ、フォームに配置します。この時点では、大きさは適当に。あとで微調整しますからね。
062


3つのコントロールを配置できましたか? 配置ができたら、プレイヤーが操作方法を理解できるように、説明文を書いてみましょう。説明文を表示するのは『Label1』を使ってやってみることにします。
ラベルに表示されている文章を変更するためには、ラベルの上で、1回だけクリックします。すると、ラベルの文章を編集できる状態になるはずです。ここで、簡単な説明文を書きましょう。
063

今回は、説明文として、以下のようにラベルを編集しました。
ちなみに、ラベルの中で改行したいときは『Ctrl+Enter』です。
064


同様に、『Label2』も文章を編集します。すると次のような形になりました。
065

ラベルやテキストボックスなどのコントロールは、どれも調整ハンドルをドラッグすることで、任意の大きさ、あるいは任意の場所に移動、を行うことができます。文章が入りきらない場合は、それに合わせてラベルの大きさを変えながら、上手にデザインしてください。


■重要なコントロール『コマンドボタン』

さて、上手にデザインできたでしょうか。あせらずやってみてくださいね。
それでは、今回のゲームの肝となるもうひとつのコントロールを配置します。それが『コマンドボタン』です。配置した画像はこんな感じ。
066


コマンドボタンがなぜゲームの肝なのか。それはゲームには必ずイベントが必要だからです。???って感じですよね。イベントって何じゃそりゃ、と思う方も多いでしょう。しかしこの『イベント』がとても重要なのです。

例えとして、かの有名なドラゴンクエストを思い出してみてください。町の人に話しかけたときや、重要なシーンなどでは、プレイヤーに選択肢を求める場面がよく出てきます。会話の途中で小さな枠が出て、『はい』か『いいえ』を選択するやつです。このとき、プレイヤーが何も選択しないでずーっとほったらかしにしていると、永遠にゲームが進みません。はいかいいえの選択肢のうち、どちらかを選ぶまでは、ゲームの進行が止まってしまうわけですね。ゲームを進行させるためには、『選択肢を選ぶ』という『イベント』が発生する必要があるのです。
これと同様に考えると、コマンドボタンの意味がわかってきます。

今回のじゃんけんゲームでは、プレイヤーに、自分の出す役を選んでもらい、それぞれに対応した数字を入力してもらいます。ただし、一度数字を入力した後で、考え直して役を変更するかもしれませんね。プレイヤーは悩んだ挙句(悩まない場合もあるでしょうけど)自分の出す役を決定しますが、本当にそれでいいのかどうかは、プレイヤーにしかわかりません。ですから、本当にそれでいいのかどうか、プログラムが勝手に判断することはできません。
そこで、コマンドボタンが押されたときに、テキストボックスに入力されていた数字をプレイヤーの役ということにしてしまうのです。そうすれば、役を最終決定したということを、プログラムが判断できますね。

このように、VBAでプログラムを書く際には、イベントという概念が重要になります。ユーザーの行動のひとつひとつが全てイベントなのです。プログラムは、これらのイベントを検知することによって、初めてユーザーの意思を受け取ります。今回の場合はコマンドボタンがその役目を担ってくれることになります。


■デザインの仕上げ

さて、コマンドボタンも、ラベルと同様に文章を編集可能なコントロールです。英語でCommandButtonでは味気ないので、ここも文章を編集して下のようにしておきます。
067


これで必要なものは全て配置できました。
最後に、フォームの大きさや、各コントロールの位置関係などを微調整して、ゲーム画面を完成させてみましょう。
私の場合は、こんな風になりました。
068


出来上がったゲーム画面を実際に表示して、どのように表示されるのかテストしてみましょう。
メニューの中から『実行』→『Sub/ユーザーフォームの表示』をクリックします。もしくは、ツールバーの、三角マークの実行ボタンからでも表示することができます。現在の段階では、フォームの画面ができているだけで、実際の動作を行うコードが何も実装されていません。だからボタンを連打しても、テキストボックスに何を書いても、何の反応もしません。バグじゃないですよ、これは。とりあえず表示することができる、というだけです。気が済んだら×ボタンで、フォームを閉じておきましょうね。
069_5.gif

実行すると……

069.gif


■まとめ

今回はユーザーフォームのデザインについて簡単にまとめてみました。途中『イベント』の話もありましたね。実はこのイベントの概念は、基本的かつ重要な概念です。これは別の機会に、もっと詳しく解説する予定です。
今回の講座では、ユーザーフォームのデザインとはどんな風に行うのかがわかれば充分でしょう。まずは慣れることが大切ですから、写真を見ながら、上手にデザインをしてみてください。もう少し突っ込んだデザイン講座も、いずれ用意するつもりです。お楽しみに。


■格言

ユーザーフォームは自由にデザインできる
コントロールの文章を編集することができる
大きさや表示位置も自由自在に編集可能


イベントなどの概念は、あらためてまた後日。








自作フリーExcelゲーム紹介

■自作ゲームライブラリ

このページでは、自作のExcelゲームを紹介します。

これらのゲームは、全てExcelのみで動作する、完全無料のフリーソフトです。ただし著作権は放棄しませんので、そのあたりはよろしくお願いします。
影倉庫 Shadow Warehouse ←コチラのサイトよりダウンロードが可能です。


■ExcTyper

Excelゲーム初となる、ローマ字入力自動認識タイピングゲームです。
自動認識というのは、例えば『じ』と入力する場合に『JI』でも『ZI』でも、どちらでも認識してくれる仕組みです。自分はこの入力方式でしか打てないんだよね~、という方でも安心してご利用いただけます。大抵の入力方式は全て対応可能です。

シンプルなゲーム画面ですが、純粋にタイピングを楽しみたい人にはうってつけでしょう。
表計算ソフトであることの利点を、最大限に引き出し、問題文も簡単に作成できます。自作の問題文を使って、楽しくタイピングレベルのアップを目指しましょう。

et1.gif

タイトル画面はこんな感じ。

et2.gif

デフォルトで10種類以上のジャンルから自由に選択できます。

et3.gif

無駄のないシンプルなゲーム画面。

et4.gif

様々なタイピングの記録が、ジャンルごとに残ります。めざせ最速記録。

ダウンロードはコチラより ⇒ 影倉庫 Shadow Warehouse


■HEART_BREAKing

ExcTyperでタイピング練習した後は、マウス操作も磨いておきましょう。
というわけで、このゲームはマウスを使います。次々と迫りくるバイキンたちをクリックでズバズバやっつけます。

最初はゆっくりと襲ってくるバイキンたちも、そのうち凄まじい速度で襲ってくるようになります。レベル30以上は、かなりのマウステクニックが必要ですぞ。

HB01.gif

バイキンは3種類。それぞれ移動アルゴリズムが違います。特にレッドくんには要注意。

最後には獲得した得点が表示され、記録として残ります。

ダウンロードはコチラより ⇒ 影倉庫 Shadow Warehouse


■JobTypeExc及びJobTypeExc_E

このソフトは、仕事中に、こっそりタイピングをしたいという作者の欲求により生まれました。上司に見つかることなく、何気にタイピング練習できます。

画面に表示されるのは、普通のExcelシートです。もちろん、あなたが業務で使っているExcelのファイルを開いている状態でも、タイピングすることが可能です。
ステータスバーに表示される文字をうまくタイピングしましょう。

jt1.gif

一見すると、まるで普通のエクセルシート?

jt3.gif

ステータスバーに問題文を表示。

jt2.gif

↑拡大してみました。

JobTypeExc_Eのほうは、上記の機能プラス英単語練習が可能な姉妹ソフトです。2300語以上の英単語が収録されています。

jte1.gif

タイピング練習しながら、英単語も覚えちゃおう。

ダウンロードはコチラより ⇒ 影倉庫 Shadow Warehouse


■EXCELLASER

ついに完成、超絶モード4!
ということで、Excel最高峰の弾幕系シューティングがここに降臨。今までExcelゲームでは実現不可能と思われていた、300以上の敵弾が襲い来る。あなたは生き残れるか!

シューティング好きな方にも、シューティングはちょっとという方にも遊んでいただけるように作ったつもりです。

excellaser01.gif

タイトル画面はこんな感じ。

excellaser02.gif

弾幕系? 大量の敵弾が画面を埋め尽くす。

excellaser04.gif

サーチレーダーを展開して敵をキャプチャせよ!

excellaser03.gif

レーダーを使って破壊すればアイテムが出現。得点アップの必須アイテム。

ダウンロードはコチラより ⇒ 影倉庫 Shadow Warehouse


■DEX-EV

DirectXを本格的に使用した、初めてのExcelゲームです。
窓の杜でも紹介された、その驚くべき美麗描画を是非体験してください。

dex_ev_c1.gif

今までは実現できなかった、美しい半透明処理を実現!


dex_ev_c4.gif

DirectXによる高速処理が実現する、最大700以上の敵弾幕!


窓の杜紹介記事はコチラ ⇒ DirectXを使った本格弾幕シューティング「DEX-EV」

ダウンロードはコチラ ⇒ Vectorより







Chapter.15 [ コード記述の基本作法 ]

■コードの表情

前回の講座ではユーザーフォームの画面をデザインしました。これでじゃんけんゲームの下地は完成しましたので、あとはコードを書いて実装すればゲームが完成します。

今回は、じゃんけんゲームのプログラミングを行う前に、コードを記述する際の基本的なルールについて解説します。コードの記述には大なり小なりルールが必要です。これには様々な理由があり、じつは結構大切なことなのです。
何のルールもなしに、適当にコードを記述したとしても、プログラム(コンピューター)から見た文法が間違ってさえいなければ、表向きの動作は行われるでしょう。しかし、コードを書くのは人間ですから、人間から見て、わかりやすいものでなくてはなりません。もし後から間違いや不具合を見つけたとき、わかりにくいコードではその原因が掴めない事も多いのです。
焦る気持ちを抑えて、基本をしっかりマスターしましょう。

表題を『コードの表情』としましたが、英語の羅列に過ぎないコードに、一体どんな表情があるというのでしょう。
これが実は結構多彩な表情があるものなのです。
我々、Excelプログラマーは、大抵の場合、企業プログラマーではありません。要するに、それを飯のタネとして生きている人間ではないのです。ですから、コードの記述もかなり自己流といいますか我流といいますか……。私自身も人のことは言えませんが、結構コードには個人差があり、見づらい、わかりづらい、独特、などの癖が見られます。なかには洗練された(ように見える)コードの持ち主もたくさんいますけどね。

そもそも私自身、専門のカリキュラムや教育を経て、こうして講座を開いているわけではありません。全て我流、独学の産物です。ですからどんなコードが一番素晴らしいのか、ハッキリとわかるわけではありません。
ですので、今回説明するコードの記述に関するルールは、あくまで私自身の私見が導き出したコードの記述法です。そこらへんは寛容な心でお許しを。


■基本中の基本インデント

さて、皆さんは『インデント』と言われて何のことだかわかるでしょうか。直訳すると『へこませる』とかになるんでしょうかね。VBAのコードを記述する場合にインデントと言えば、これはすなわち『字下げ』のことを言います。例を挙げてみましょう。

インデントなしの文章

1行目……これは1行目です。
2行目……同じく2行目。
3行目……同じく3行目。

インデント有りの文章

1行目……これは1行目です。
    2行目……1段インデントしてみました。
        3行目……さらにもう1段インデント


どうですか。簡単ですね。
このように、文章の先端をずらすことをインデントと言うのです。これがコードを書く際には欠かせないルールのひとつです。
インデントを行う場合には、『TABキー』を使うといいでしょう。キーボードの左側のほうにあるキーです。
TABキーは一般的なエディタなどでも共通の動きとして、1回押すごとに半角スペース4つ分の空白を空けてくれます。スペースキーを連打してインデントの調整をするよりも、確実ですし簡単です。是非TABキーに慣れてくださいね。

さて、それではなぜインデントがコードを書く際に欠かせない要素なのでしょうか。それは以下の例を見てもらえれば歴然でしょう。

インデントなしのコード

Sub Indent()
Dim L As Long
L = Int(Rnd * 10) + 1
If L > 0 Then
If L < 10 Then
If L > 2 Then
If L < 8 Then
If L > 4 Then
If L < 6 Then
MsgBox "Lは5でした"
End If
End If
End If
End If
End If
End If
End Sub

インデント有りのコード

Sub Indent()
    Dim L As Long
    L = Int(Rnd * 10) + 1
    If L > 0 Then
        If L < 10 Then
            If L > 2 Then
                If L < 8 Then
                    If L > 4 Then
                        If L < 6 Then
                            MsgBox "Lは5でした"
                        End If
                    End If
                End If
            End If
        End If
    End If
End Sub


インデントが全く無いコードでは、どのIf文から始まったEnd Ifなのか非常にわかりづらいですね。何個も重なっているので、どれがどれに対応しているのか一見して判断がつきません。
それに対し、インデントをキチンと行っているコードでは、どのIf文に対応したEnd Ifかが非常にわかりやすい。視覚的に捉えやすいのではないでしょうか?

このコードの意味としては、まず変数Lに、乱数を用いて1~10までのランダムな数字を入れています。そしてIf文(条件分岐)を使って、変数が0より大きかった場合は……10より小さかった場合は……2より大きかった場合は……、という具合にだんだん絞り込んでいきます。たとえば変数に入っている数字が10だった場合には、2段目のIf文(If L < 10 Then のところ)で条件に当てはまらなくなりますよね。そこでプログラムはEnd Ifを通ってEnd Subへ向かいます。つまり、なにも起きません。
このコードでは、変数に入っている数字が5だった場合のみ、MsgBoxまで辿り着くことができるようになっているのです。

今回は説明の為に、非常に単純な条件分岐を重ねましたが、ゲームを作成するとなると、もっと複雑で、難解な条件の積み重ねが起こります。どのIf文から始まったEnd Ifなのかがハッキリしていないと、あとから不具合が見つかった場合に、修正するのが非常に難しくなります。
インデントを適切に入れることによって、これらの問題を軽減できるのです。


■インデントのタイミング

インデントをするタイミングは、人によって癖が見られる部分ではありますが、大抵は上で挙げた例のように、If文などの特定のキーワードが出てきたところでインデントします。
何も考えずにインデントするのは逆効果ですから、インデントすればいいってことではありません。あくまでも、見やすさや、わかりやすさを優先します。

悪いインデントの例
Sub Indent()
            Dim L As Long
L = Int(Rnd * 10) + 1
        If L > 0 Then
    If L < 10 Then
If L > 2 Then
    If L < 8 Then
        If L > 4 Then
    If L < 6 Then
MsgBox "Lは5でした"
        End If
    End If
End If
End If
    End If
        End If
End Sub


こんなんだと、なにがなんだかわかんないですもんね。

ちなみに、この講座でまだ解説していないので、ちょっとわかりにくいかもしれませんが、私の場合は以下のようなキーワード(ステートメント)が出てきたときにはインデントします。参考までに載せておきますが、わからない人は無理に憶えておかなくても問題ありません。講座を進めるうちに、自然と身についていくと思いますのでね。

・If、Else、ElseIf
・Select Case、Case
・For
・Do
・With



■コメント

コードが膨大になり、巨大なプログラムになればなるほど、ある部分のコードが何に関係したコードなのかわかりづらくなっていきます。例えば私の作成するゲームは、大抵2000~3000行くらいのコードになることが多いです(ただ単に無駄が多いとも言えるが……)。
そうなってくると、あとから見たときに『このコードで何をしようとしたんだ俺……』と途方にくれる、なんてことが起きてきます。これは一度完成した作品のコードを、あとから見直したときなんかにもよく起こる現象です。

ゲームを作成している最中には、それぞれの変数の使い道や、ある部分のコードの動作の役割など、無意識に頭の中に入っています。ですが、時を経てそれらの情報がなくなってしまうと、途端にまずいことになってきます。『この変数なにに使ってんだろ』とか、『やべ、バグ見っけたけどどこでバグってるのかわかんね』ってな具合に、非常に困ってしまいます。

そこで、コードの中に、注釈のようなコメントを入れることができる仕組みが、VBAには備わっています。例えば『ここでゲームオーバーかどうか判定』などのコメントが入っていれば、あとから見ても一目瞭然ですね。ゲームオーバーの処理中にバグが起こったとすれば、このコメント部分を探せばいいというわけですから、後で手直しするときにも、非常に有効な手段となります。


■コメントを入れてみる

それではコメントを入れる方法を説明します。
コメントを入れるためには、コレ→『 ' 』、アポストロフィを使います。Shiftキーを押しながら、キーボードの上段にある7のキーを押すことで入力できます(テンキーの7じゃないですよ)。

VBEでコードを書いているときに、コメントを入れておきたいところができたら、とりあえずアポストロフィを入れます。すると、その行では、その後に書かれる全ての文章がコメント扱いになります。次の行には影響しません。

これも例を挙げてみましょう。

アポストロフィでコメントを入れる
Sub Comment()
Dim S As String
S = "コメントにはアポストロフィ" '変数Sに文字を入れる
MsgBox S 'メッセージとして表示する
End Sub


赤い字の部分がコメントです。
ためしに上のコードをVBEに貼り付けてみてください。コメントの部分は色が変化して表示されると思います。

注意点として、アポストロフィ以降に記述されている文章が、全てコメントとして扱われるということに気をつけましょう。
動作を行うコードの途中に、誤ってアポストロフィを入れてしまうと、本来コードとしての役割を持つ部分までコメントとして扱われてしまいます。

悪いコメントの例
Sub Comment()
Dim S As String
S = ' "コメントにはアポストロフィ" 変数Sに文字を入れる
MsgBox S 'メッセージとして表示する
End Sub


上のようにしてしまうとエラーが発生します。変数Sに入れるものが何も書かれていないと判断されてしまうからですね。


■まとめ

人間がコードを書く以上、これらの基本的なルールには忠実であるべきです。仮に、自分ではどうにもならない難題が発生して、他人にコードを見てもらい直してもらおうと思ったとします。自分にしか理解できないような、わかりにくいコードを書いていると、見づらいコードだという理由で、ダメだしされて終わってしまうかもしれません。
時間が経ってから自分が見直すときにも、これらのルールが守られていれば、すぐに全体を把握し直すことができるでしょう。

適度にインデントやコメントを入れることで、コードとしての完成度が増すのです。これは実際に動作するときには関係のないことですが、非常に重要なことだと、私は思っています。


■格言

インデントとは字下げのことである
インデントはコードの見やすさを向上させる
コメントを利用すればわかりやすいコードになる


今現在の自分のことだけでなく、将来の自分や、第三者のことも考えてコードを記述しましょうね。








Chapter.16 [ じゃんけんゲーム:1 ]

■ゲームの仕組みを考える

Chapter14で、じゃんけんゲームの画面をデザインしました。これにより、ゲームの外観は出来上がりました。今回からは、中身の部分、つまりゲームの動作を定義するコードを書くための、準備をしていきます。コードの実装、これさえ終われば晴れてじゃんけんゲームの完成です。気合を入れて頑張りましょう。

さて、まずは以前に作成した、じゃんけんゲームの画面を見てみましょう。
068


上のような感じにデザインしたんでしたね。このフォームには、全部で4つのコントロールが配置されています。
それは『ラベルが2つ』と、『テキストボックスが1つ』と、『コマンドボタンが1つ』の計4つのことですね。ゲームのコードを書き始める前に、まずはそれぞれの役割について考えてみましょう。

ラベル:
ラベルの役割は、プレイヤーに対して、ルールや、説明を行うための文章を表示することです。製作者である我々が、その文面をあらかじめ用意しておいて、プレイヤーにある程度限定した行動を求めるのが目的です。これは、言い換えると、プレイヤーはラベルの内容に干渉できないということでもあります。
わかりやすく言うと、要するにプレイヤーが文章を編集したり、改ざんしたりはできないということです。あくまでも、プログラマーが編集、使用するものですね。

テキストボックス:
ラベルとは反対に、テキストボックスはプレイヤーが編集するコントロールですね。
1~3の数字を入力しておくことによって、プレイヤーのじゃんけんの役を決めるためのコントロールです。もし、あらかじめ内容が決められているとすると、全くゲームとは言えません。同じ役しか出せないのなら、それはじゃんけんじゃないですもんね。

コマンドボタン:
コマンドボタンに表示されている文面は、プログラマー側であらかじめ用意しておきますが、実際にこのコントロールを使用するのは、ゲームをプレイしているプレイヤーです。
テキストボックスに、自分の役を表す数字を入れてから、このボタンを押してもらいます。このボタンが押されることによって、初めてゲームの動作がスタートするという大事なコントロールです。
考え方としては、短距離走のピストルを撃つ人のように、プログラムにスタートの合図を送るわけですね。

こうして考えてみると、プログラムというのは、まるで飲食店のような構造になっていることがわかると思います。

まずラベルですが、これは店の看板ですね。どんな内容の店なのか、お客にアピールします。『うちの店は立食形式のバイキングですよ』とか『有機野菜の料理が自慢』とか、お客に対して先に説明をするわけです。その店での行動(立食形式)や、その店の特徴(有機野菜の料理)などを、あらかじめお客に伝えておくことによって、店の情報をスムーズに理解させます。
今回のゲームに当てはめて考えるなら、『これはじゃんけんゲームですよ』、『数字で役を入力しますよ』、『数字はここに入力しますよ』、といった具合に情報を流します。

次にテキストボックス。これはウェイターです。お客がどんな注文をするかは、お客以外の誰にもわかりません。お客だって、まだ何を注文するか決めていないかもしれません。そこへウェイターが駆けつけ、どんなものを注文するのか聞くわけです。
今回のゲームでは、プレイヤーが出すじゃんけんの役が『注文する料理』であり、テキストボックスこそが『ウェイター』ですね。プレイヤーの下した決定を、情報として受け取る役割を持っています。

最後にコマンドボタンです。
今回のゲームでのコマンドボタンの役割は、ずばり『調理の開始を告げるコック長』です。正確な表現をすれば、実際にどんな動作をするのかはコードの内容によって変わってきます。コマンドボタンはそのコードに対して、実行しなさいという命令を出すだけです。
つまり、厨房で実際に料理を行っているコックさんは『コードそのもの』であり、コマンドボタンはあくまで、開始を告げる『コック長』の役割を担っているということです。


■名前をつけよう

さて、それぞれのコントロールの役割が理解できたら、それぞれにわかりやすい名前をつけておきましょう。
実際には、コントロールがユーザーフォーム上に配置された時点で、それぞれ自動的に名前がつけられます。例えばラベルの場合は『Label1』。コマンドボタンの場合は『CommandButton1』といった具合です。同じ種類のコントロールを配置していくと、名前の最後の部分にある数字が、連番で振られてひとつずつ増えていきます。
もちろんこのままでもコードは書けます。でもちょっとわかりづらいですよね。せめてなじみのあるローマ字表記とかに変えておいたほうが、わかりやすいという人もいるでしょう。

コントロールの名前を変更する場合は、プロパティウィンドウから行います。
070.gif


071.gif


プロパティウィンドウが表示されていない場合は、メニューの『表示』→『プロパティウィンドウ』の順にクリックしていけば表示できます。

例えば下のような感じで名前をつけると、わかりやすいかな?

ラベル:
もともとは Label?? ←??は連番のことです
  • Setumei……そのまんま(説明を表示するから)
  • Lab_Setumei……ラベルであることがわかりやすい
  • Kanban……飲食店の例えにのっとってつけてみた(ギャグですよ)
  • Raberu……ローマ字に直しただけ


テキストボックス:
もともとは TextBox?? ←??は連番のことです
  • Yaku……そのまんま(役を入力するから)
  • Tex_Yaku……テキストボックスであることがわかりやすい
  • weita……飲食店の例えにのっとって(だからギャグ……)
  • Tekisuto……ローマ字に直しただけ


コマンドボタン:
もともとは CommandButton?? ←??は連番のことです
  • Kaisi……そのまんま(じゃんけんを開始するから)
  • Com_Kaisi……コマンドボタンであることがわかりやすい
  • KockChou……飲食店の例えに(だからギャグだってば!)
  • Botan……ローマ字に直しただけ


まぁ……何が言いたいかっていうと、要するにわかりやすければいいんです。はい。
あとは注意するところとして、変数の名前をつける際に、名づけのルールがありましたね。あれと同じ要領で、記号などは原則使えません。使えるのはアンダーラインだけです。一応全角の文字も使えるらしいです。やったこと無いけど。

参考までに申しますと、私の場合はラベルなら『Lab_XXXXX』、テキストボックスなら『Tex_XXXXX』といったように、何のコントロールかがわかるように名づけます。XXXXXの部分は役割がわかりやすいように、その場で考えて決めます。また、同じような役割を持ったコントロールが複数ある場合(敵キャラクターがたくさんいるときとか)は、必ず連番を振ります。この理由はいつか説明する機会が来るでしょう。実は超重要なので。


■とりあえず名づけ

今回作成するじゃんけんゲームでは、以下のように名前をつけました。以降、解説にはこの名前を使って進めますので、できれば同じにしておいてくださいね。

  • ひとつめのラベル……『Lab_Setumei1』(上にあるほう)
  • ふたつめのラベル……『Lab_Setumei2
  • テキストボックス……『Tex_Yaku
  • コマンドボタン……『Com_Kaisi


実際にコードを書く際には、ここでつけた名前で、コントロールを指定します。いい加減な名前をつける癖は、くれぐれもつけないようにしましょう。わかりやすいことが第一です。変数の場合と同じですね。


■格言

コントロールの役割をしっかり認識しておく
役割に応じたわかりやすい名前をつけておく


コードというのは英語の羅列です。一見してわかりやすい名前をつけましょう。








Chapter.17 [ じゃんけんゲーム:2 ]

■じゃんけんゲーム手順の確認

今回はいよいよじゃんけんゲームのコードを書いていきます。焦らずゆっくりで構いませんから、しっかりついてきてくださいね。

さて、今回作成するじゃんけんゲームを、手順を追って考えてみましょう。

じゃんけんゲームのフロー
    1:プレイヤーがゲームを起動
        ▼
    2:プレイヤーが出す役を決める
        ▼
    3:テキストボックスに、役に応じた数字を入力
        ▼
    4:コマンドボタンをクリック(押す)
        ▼
    5:コンピューター側の役をプログラムが決める
        ▼
    6:双方の役を元に勝負を判定
        ▼
    7:結果を表示
        ▼
    8:初期状態に戻す(つまり手順2の状態にする)


たかがじゃんけん、されどじゃんけん。最低でもこの8つの手順を踏む必要があります。結構大変そうですね。でもご安心を。コードを書いて実装させるのは、主に手順5以降の部分です。

まず手順1の部分、ゲームの起動を考えてみましょう。
今回のじゃんけんゲームは、起動と同時にゲーム画面が表示されます。そして、ゲームの操作方法なども、始めからその画面上に表示されていますね。ということは、単純にゲーム画面さえ起動できれば、あとは何もする必要はありません。
なぜなら手順2は、プレイヤーの動作ですね。ですから、プログラマーがまずするべきことはゲーム画面の起動だけでいいのです。
もし、起動と同時にエフェクトやオープニングシーンがある場合は、話が別ですがね。それはまた別の機会に解説することにします。


■ゲーム画面の起動

ゲームを作成しているときには、Chapter14の最後で解説しているように、メニュー画面からフォームを自由に起動させることができます。VBEのメニューから『実行』→『Sub/ユーザーフォームの表示』を選択すればよかったんでしたね。
ですが、プレイヤーがVBEを起動して、メニュー画面からゲームを起動するのは、どう考えても変です。そこで、Excelのワークシートに、ゲームの起動ボタンを作成しておき、それをクリックするとゲームが起動するようにしてみましょう。

それでは、まずフォームを表示させるためのコードを記述します。VBEを起動して、標準モジュールを挿入しましょう。これがよくわからないという人は、Chapter4を見てくださいね。標準モジュールが準備できたら、コードを書いてみましょう。

フォームを表示するためには、Showというキーワードを使います。

Show:

構文
    Object.Show
説明
    Objectは、表示したいユーザーフォームの名前

実際のコードを見てみましょう。
Sub Hyouji()
    UserForm1.Show
End Sub


え? これだけ……? っていう感じですが、これだけです。
UserForm1というのが、ゲーム画面をデザインしたフォームの名前です。それに続けてピリオド『コレ→ . 』を打ち、Showと続けます。たったこれだけです。
このサブプロシージャは、Hyoujiという名前になっているということを覚えておきましょう。これで、Hyoujiという名前の、ゲーム起動用サブプロシージャが準備できました。

次にするべきは、このコードを実行させるための、起動ボタンの作成です。
これから作成するボタンに、このコードを実装させれば、Excelのワークシートからゲーム画面の起動を行うことが可能になります。

まず、VBEではなく、通常のExcelの画面を表示しておき、メニューバーの中の『表示』メニューを開いてください。

080.gif


その中から、『ツールバー』→『フォーム』の順にクリックしていくと、次のような感じのツールバーが表示されると思います。Excelのバージョンによって多少見た目が違うかもしれませんが、その辺は気にしなくて大丈夫です。

081.gif

082.gif


さて、フォームツールバーの中にある、コマンドボタンを探してください。見つかったら、ワークシートに配置してみましょう。配置方法は、フォームにコマンドボタンを配置するときと同じような感覚でできます。

ボタンを配置すると、自動的に次のような画面(ダイアログ)が出ると思います。出ない場合は、ボタンの上で右クリックして『マクロの登録』を選択すれば表示できます。

083.gif

これが表示されない場合は、右クリックを使う。そのときの写真は↓

084.gif

ここで表示されるリストの中に、先ほどプログラムを書いたサブプロシージャ『Hyouji』が含まれていれば成功です。『Hyouji』を選択してOKボタンを押しましょう。これで、ワークシート上のコマンドボタンに、サブプロシージャHyoujiがめでたく実装されました。
もしリストに『Hyouji』が含まれていない場合は、キチンとコードが書けていません。もう一度始めから、ゆっくり見直してみてください。きっとうまくいきますからね。

085.gif


086.gif



■体裁を整える

今のままでは、ワークシートに作成したボタンは『ボタン1』という文字が表示されているだけで、ゲームの起動には似つかわしくありません。これも、フォームのデザインのときと同じように、文章を編集しておきましょう。

私の場合は次のようになりました。

087.gif

088.gif

一度右クリックしてからでないと、文字の編集ができませんので注意しましょう。すでにHyoujiプロシージャが実装されていますので、普通にクリックしてしまうと、ユーザーフォームが表示されてしまいます。

さて、これでゲームの起動に関してはクリアできました。
今回の講座で大切なのは、プレイヤーに対する、我々プログラマーのやさしさです。
Excelのファイルを起動したとき、どのようにすればゲームが始まるのか、それを明確にしておくことが大事です。そうでないとプレイヤーはゲームを始める前に、やる気をなくしてしまうからです。
ユーザーフレンドリー』という言葉がありますが、我々プログラマーは常にこれを意識しておく必要があります。これはゲームに限った話ではありません。いかなるプログラムであろうとも、使う人にとってわかりづらいものであってはなりません
今回作成したボタンがあることによって、プレイヤーであるユーザーが、直感的にゲームの存在を知ることができます。それに、ボタンってなんとなく押してみたくなるでしょ? これが大事なのです。自分本位な、わがままなゲームを作ってしまわないように、常に心がけるようにしましょうね。


■格言

コードは実装して初めて動作する
プレイヤーがイメージしやすいものに実装させる
ユーザーの気持ちになってゲームを設計する


作った本人にしかわからないような仕組みなら、無いほうがましです。








Chapter.18 [ じゃんけんゲーム:3 ]

■ゲーム手順の確認

さて、前回の講座では、手順1の部分『1:プレイヤーがゲームを起動』について解説しました。

じゃんけんゲームのフロー
    1:プレイヤーがゲームを起動
        ▼
    2:プレイヤーが出す役を決める
        ▼
    3:テキストボックスに、役に応じた数字を入力
        ▼
    4:コマンドボタンをクリック(押す)
        ▼
    5:コンピューター側の役をプログラムが決める
        ▼
    6:双方の役を元に勝負を判定
        ▼
    7:結果を表示
        ▼
    8:初期状態に戻す(つまり手順2の状態にする)


手順の2~4までは、ゲームをプレイしているプレイヤーが行う部分であり、我々プログラマーは干渉できない部分ですね。今回は5番目の手順『5:コンピューター側の役をプログラムが決める』のところを見てみましょう。

プレイヤーが出すじゃんけんの役は、1~3の数字のどれかです。そして、それぞれの数字をじゃんけんの役に変換して考えるんでしたね。ということは、コンピューターの出す役も、やはり1~3の数字のどれかであることが望ましいですね。

このコンピューターの役は、毎回違ったものでなくてはなりません。一定の規則を持っているようでは、プレイヤーに見破られた時点で、ゲームとしての役割を果たさなくなってしまいます。さて、以前の講座で、このような場合にはどうしたらいいか、解説をしたのですが覚えているでしょうか。


■乱数の準備

こういったケースでは、コンピューターの役に『乱数』を取り入れるのがいいでしょう。乱数については、以前の講座『Chapter.12 [ 乱数 ]』で詳しく取り上げていますから、よくわからないという人は、そちらで予習しておきましょう。

乱数を生成するには『Rnd関数』を使うんでしたね。
Rnd関数は、毎回異なる数値を返してくれる関数です。ただし、返ってくる数字は『0以上で、1よりも小さい』数値でした。つまり『0~0.999999……』の範囲に限られます。

じゃんけんの役は1~3の範囲に限定されていますから、生成される乱数が1~3の範囲に限定できれば、うまくゲームに乱数を組み込むことができそうですね。毎回1か2か3のどれかが、ランダムに生成されるようにすれば、その数値を使って、コンピューターの役を決めることができるというわけです。

そこで、Int関数を組み合わせて、以下のようにコードを記述します。

コンピューターの役 = Int(Rnd * 3) + 1

ここでは、小数点以下の数値を切り捨てる『Int関数』と、乱数を生成する『Rnd関数』を組み合わせることによって、1~3の範囲で乱数を発生させています。Rnd関数に掛け算している数字を増やせば、もっと大きな範囲で乱数を生成することもできます。仮に上のコードで、掛け算している数値を10にすれば1~10の範囲で乱数を取得することができます。

コンピューターの役を決める部分は、このように乱数をうまく生成することができればクリアです。乱数を生成するところまでを実際に記述してみましょう。前回の講座で、サブプロシージャ『Hyouji』を記述した標準モジュールに、次のように記述します。

Sub Janken()
    Dim CPU As Integer
    CPU = Int(Rnd * 3) + 1
    MsgBox "コンピューターの役は" & CPU & "です"
End Sub

このプロシージャでは、コンピューターの役を入れておくための変数が必要です。そこで始めに『CPU』という名前の変数を宣言しています。
重要なのは、乱数を生成するときに、1か2か3の範囲で乱数を生成するということは、変数CPU整数だけを扱う変数だということです。小数点以下の数値を扱う必要がないので、変数は整数型であるIntegerで宣言しておきます。

このコードを実行すると、変数CPUには、1か2か3のどれかが入ります。どの数値が入るかは、乱数を使っているので毎回変わります。
ここでは、ためしにメッセージを表示して、動作が確認できるようにしています。実際にコードを実行して、どのようなメッセージが表示されるかテストしてみてください。毎回異なる数字が表示されれば成功です。


■ちょっと上いく乱数テクニック

ここまでくると、コンピューターの役を決めるところまではクリアできました。
ただし、実はこのコード、完璧ではありません。重大な欠点が潜んでいるのです。それは『乱数の種』に関係しています。

Rnd関数は、乱数を発生させる関数です。しかしその乱数の生成方法は実は一定の規則にのっとっています。わかりやすく言うと『Rnd関数を用いたコードは何度呼び出しても毎回同じ乱数が生成される』ということです。

これって乱数になってないじゃん! という声が聞こえてきそうですが、これは事実です。これは、Rnd関数が『シード値』というパラメーターを元に乱数を生成していることに関係しています。
シード値というのは、乱数の生成に使われる『乱数の種』です。このシード値を元にして乱数ジェネレータという機構が乱数を生成します。Rnd関数は、このシード値を乱数ジェネレータに渡す役割を果たす関数なのですね。
Rnd関数は、基本的に前回生成した乱数をシード値として乱数ジェネレータに渡します。このため、複数回繰り返しても、同じ規則性を持ってしまうことになるのです。

なんだかちょっと難しい話になってきましたが、要するに、乱数が一定の規則を持ってしまうということなので、これはまずいですね。

そこでこの現象を回避する方法が用意されています。
それには、Randomizeというキーワードを使います。

Randomize:

構文
    Randomize
説明
    システムタイマーからシード値を生成する

Randomizeは、乱数ジェネレータに渡されるシード値を、システムタイマー(ウィンドウズの内部にある時間を管理するタイマー)から拾うように指定します。これにより、乱数は、文字通り規則性のない数値がランダムで返されるようになります。

それでは、先ほどのコードを、Randomizeを使って修正してみましょう。

Sub Janken()
    Dim CPU As Long
    Randomize
    CPU = Int(Rnd * 3) + 1
    MsgBox "コンピューターの役は" & CPU & "です"
End Sub


注意点としては、Rnd関数を呼び出す前に、Randomizeを呼び出すということに注意します。あとからRandomizeを呼び出しても無意味ですので気をつけましょう。

これで、コンピューターの役は、本当の意味で毎回異なるものになりました。これにより、プレイヤーがコンピューターの役を予測することが難しくなり、じゃんけんゲームとしての完成度が上がりましたね。


■格言

コンピューターの役を乱数で決める
乱数を生成するにはRandomizeを併用


完全なランダムというのはこうやって実装するのです。








Chapter.19 [ じゃんけんゲーム:4 ]

■コマンドボタンのクリックイベント

わかりやすくするために、もう一度ゲームの手順を見てみます。

じゃんけんゲームのフロー
    1:プレイヤーがゲームを起動
        ▼
    2:プレイヤーが出す役を決める
        ▼
    3:テキストボックスに、役に応じた数字を入力
        ▼
    4:コマンドボタンをクリック(押す)
        ▼
    5:コンピューター側の役をプログラムが決める
        ▼
    6:双方の役を元に勝負を判定
        ▼
    7:結果を表示
        ▼
    8:初期状態に戻す(つまり手順2の状態にする)


手順の3番目で、プレイヤーがテキストボックスに役を入力します。これは1~3の数字で行うのでしたね。そして、プレイヤーはその後、手順の4番目『コマンドボタンをクリック』に移ります。
我々プログラマーは、この手順の4『コマンドボタンのクリック』を合図に、プログラムが動き始めるようにしなくてはなりません。ゲーム画面の起動と同時に、勝手にプログラムが動き始めてはゲームになりませんもんね。

コマンドボタンが押されたと同時に、プログラムが動き出すようにするには、『イベント』について理解している必要があります。
イベントというのは、プレイヤーという『ユーザー』がいて、そのユーザーが行う動作の全てのことを言います。そしてその動作に反応して動き出すプログラムを『イベントドリブン型』などと表現したりします。
今回の場合では、プレイヤーの『ボタンをクリックする』という動作に反応して動き出すプログラムを作成するということになりますね。

それでは、コマンドボタンのクリックを合図に、プログラムが動き出す仕組みとは、どのようにすればできるのでしょう。
それには、コマンドボタンのクリックイベントを使います。

まず、ユーザーフォームのデザイン画面を開きましょう。
ゲームの画面をいろいろとデザインした、あの画面です。

090.gif

この画面上で、コマンドボタンをダブルクリックしてみてください。すると、自動的に以下のような画面になるはずです。
091.gif

この画面は、標準モジュールにコードを書いているときと非常によく似ています。しかし、これは標準モジュールではありません。これはユーザーフォーム自体が持っている『フォームモジュール』と呼ばれるモジュールです。標準モジュールとは全くの別物ですので注意してください。

ユーザーフォームに配置されているコマンドボタンなどの、イベントに関するコードはこのフォームモジュールに記述します。フォームモジュールを開きたいときには、プロジェクトエクスプローラから右クリックして表示させることができますので、覚えておきましょう。

092.gif

092_5.gif

もしプロジェクトエクスプローラが表示されていないときには、VBEのメニューから『表示』⇒『プロジェクトエクスプローラ』の順にクリックしていけば、表示することができます。

さて、コードの解説に戻ります。
コマンドボタンをダブルクリックして、自動的にフォームモジュールに移動したら、以下のようにコードが入っている状態になっています。

Private Sub Com_Kaisi_Click()

End Sub


Com_Kaisiというのは、コマンドボタンにつけた名前です。そしてその後ろにアンダーラインがついて『Click』と書かれています。この最後のClickが、どのイベントなのかを表している部分です。つまり、このコードは、『コマンドボタンのクリックイベント』を表しているのです。

このサブプロシージャ(Private Sub Com_Kaisi_Click())は、ゲーム画面に配置したコマンドボタンがクリックされたときに発動します。この部分にゲームの処理をあてがうことによって、ボタンがクリックされたときに処理を開始することができるのです。


■イベントに関する補足

フォームモジュールを開いているときには、『オブジェクトボックス』と『プロシージャボックス』を有効に活用することで、わかりやすく効率的なコーディングが可能です。

093.gif

オブジェクトボックス:
オブジェクトボックスには、『今、どのコントロールに関するコードを記述しているか』が表示されています。
上の例で言うと、コマンドボタンの『Com_Kaisi』に関するコードを記述していますので、オブジェクトボックスにCom_Kaisiと表示されています。

プロシージャボックス:
プロシージャボックスには、『今、どのイベントに関するコードを記述しているか』が表示されています。正確にはどのプロシージャを記述しているか、ですね。
上の例で言うと、コマンドボタンのクリックイベントに関するプロシージャを記述していますので、プロシージャボックスにClickと表示されています。

オブジェクトボックスと、プロシージャボックスは、フォームモジュール以外のモジュールでも表示されており、任意のコントロールやプロシージャに、移動するときなどには非常に便利です。
オブジェクトボックスを展開してみると、ユーザーフォーム本体を含む、全てのコントロールが一覧表示されます。その中から、任意のコントロールを選択すれば、自動的にそのコードが挿入され、その場所へジャンプできます。すでにコードが記述されている場合は、新しくコードが増えるのではなく、単にジャンプして移動してくれます。
これはたくさんのコントロールが配置されている場合には、とても便利な機能ですね。

同様に、プロシージャボックスには、そのモジュール内に記述されている全てのプロシージャが格納されていますので、展開するとその一覧が表示されます。その中から任意のプロシージャを選択すると、即座にそのプロシージャのあるところにジャンプしてくれます。
コードが超膨大な量になると、どこに目的のプロシージャがあるのかわかんなくなっちゃうことがよくあります。
プロシージャボックスを有効に利用することで、即座に目的のプロシージャへ移動でき大変便利です。

また、フォームモジュールにコードを記述しているときには、プロシージャボックスはもっと便利に使えます。
それは、新しいイベントプロシージャを挿入したいときに活躍するのですが、ここではあまり詳しく解説はしません。簡単に触れておきますが、以下のようなことができます。

094.gif


095.gif


■クリックイベントから呼び出す

コマンドボタンのクリックイベントが準備できたら、そこからじゃんけんゲームの処理を呼び出すようにコードを記述します。

前回の講座で、じゃんけんの処理を行うためのプロシージャを記述しましたね。といってもまだ乱数を生成するだけのコードですけど……。
今回はコマンドボタンをクリックしたときに、そのプロシージャを呼び出すようにしてみましょう。

他のプロシージャを、外部から呼び出すためには『Call』というキーワードを使います。

Call:

構文
    Call 呼び出したいプロシージャ名
説明
    指定したプロシージャを呼び出す

プロシージャを呼び出したいところで、Callに半角スペースを空けてプロシージャ名を続けます。実際のコードは以下のようになります。

Private Sub Com_Kaisi_Click()
    Call Janken
End Sub

こうすることによって、コマンドボタンがクリックされると同時に、サブプロシージャJankenが呼び出されます。
サブプロシージャJankenは、乱数を生成してメッセージを表示するようにプログラムが記述されているはずですから、コマンドボタンをクリックするたびに、メッセージが表示されるようになったはずです。

ためしにユーザーフォームを実行して表示させて、コマンドボタンを押してみましょう。クリックするたびにサブプロシージャJankenが呼び出され、メッセージが出れば成功です。

096.gif



■格言

イベントを自在に操る
プロシージャを呼び出すにはCallを使う


やや難しい内容でしたが、理解できたでしょうか。








Chapter.20 [ じゃんけんゲーム:5 引数]

■引数

さて、前回までで、手順1~5までを解説しました。今回から解説するのは手順の6番目『6:双方の役を元に勝負を判定』です。
実はこのじゃんけんゲームの最大の難関でもあり、処理の中心的な役割を果たす部分が、この手順6のところです。気合を入れて取り掛かりましょう。

今回は掲題のとおり、『引数』について解説します。この引数という概念も、プログラミングに欠かせない概念です。覚えれば確実に実力アップですので、頑張ってくださいね。

引数というのは、『データの橋渡し役』と考えると一番わかりやすいのではないかと思います。プロシージャとプロシージャの間で、データをやり取りするときには、非常に重要な役割を果たします。

例え話として、こんな話をしてみましょう。

あるところに、お使いロボットがいます。彼は、依頼されたとおりに、一品残らず完璧にお使いして手に入れてきてくれます。なんともすごいロボットです。
でも、彼は自分で考えてお使いしてくることはできません。あくまでも、お使いしてくるべき商品というデータをもらって、初めて機能するロボットなのです。彼は今日も、ご主人の無理な注文に応えるべく、ライトぴかぴか街を歩き回ります。


さて、この『お使いロボット』を、『プロシージャ』に置き換えてみるとどうでしょうか。

あるところに『じゃんけん』というプロシージャがあります。このプロシージャは、じゃんけんの役を元に、勝負を判定することができます。しかも、自分でコンピューターの役をランダムに決める機能を持っています。
でも、このプロシージャは、プレイヤーの役を自分で考えて決めることはできません。あくまでも、プレイヤーが決めた役というデータをもらって、初めて機能するプロシージャなのです。今日もじゃんけんというプロシージャは、淡々と勝負を判定し続けます。


上の例で言うところの、『データ』こそが『引数』なのです。

今回と次回の2回に分けて、実際に役を判定する部分のプログラミングを解説しますが、それはあくまでも『プレイヤーの決めた役』というデータがあってこそ、意味を持つプログラムに他なりません。ですから、まずは引数という概念をしっかりと理解し、プロシージャからプロシージャへ、データを渡すやり方を覚えましょう。


■引数の使い方

引数を使うためには、2つのステップが必要です。

1:引数を受け取るプロシージャの準備
2:目的の場所で引数を指定してプロシージャを呼び出す

この2つです。

前回の講座で、2番目の部分、つまり他のプロシージャを呼び出す方法は解説しました。それにはCallというキーワードを使えばよかったのでしたね。
上記の1番目の部分で触れているように、まずはCallで呼び出されるプロシージャの準備をしなくてはいけません。

それでは、まず今までの解説で出来上がっている、じゃんけんゲームのコードを見てみましょう。

Sub Janken()
    Dim CPU As Long
    Randomize
    CPU = Int(Rnd * 3) + 1
    MsgBox "コンピューターの役は" & CPU & "です"
End Sub


現時点では、コンピューターの役をランダムに決めて、それをメッセージとして表示するという機能だけが、実装されています。
このサブプロシージャ『Janken』を、引数を取るように変更すると、次のようになります。

Sub Janken(PLAYER As Integer)
    Dim CPU As Long
    Randomize
    CPU = Int(Rnd * 3) + 1
    MsgBox "コンピューターの役は" & CPU & "です"
End Sub


どこが変わったかわかりますか?
処理を行うコードの部分には全く変更がありませんが、プロシージャの名前を宣言している、1行目の部分が変わっているのがわかるでしょうか?
Jankenの後ろにある括弧の中に、『PLAYER As Integer』という記述が加わっています。変数の宣言を行うときのように、『As』に続けて型を宣言していますね。そうです。これは実は変数の宣言と全く同じ理論で考えることができます。
ここで宣言されたPLAYERというのは、実体としては変数です。そしてInteger型の変数として宣言されていますので、整数を扱う変数として、サブプロシージャの中で普通に使うことができます。

ただし、変数PLAYERは、括弧の中で宣言されているので『引数』です。
ですから、このプロシージャが動作するときには、既に何らかのデータを持っていなくてはいけないのです。先の例で言えば、お使いする商品がわからないうちは、ロボットがお使いにいけないのと同じですね。そこで、このプロシージャが呼び出されたときには、既にプレイヤーの役が決まっていなくてはいけません。

そこでステップの2番目。引数を指定してプロシージャを呼び出す、の出番です。

呼び出すときに引数を指定する場合は、やはり括弧を使います。Callで変数を呼び出す際に、引数を括弧で囲んでやればいいだけです。例を挙げてみましょう。

まずは、呼び出されるプロシージャ、『Janken』のほうを、以下のように修正しておきましょう。

Sub Janken(PLAYER As Integer)
    Dim CPU As Long
    Randomize
    CPU = Int(Rnd * 3) + 1
    MsgBox "コンピューターの役は" & CPU & "です"
    MsgBox "ちなみにプレイヤーの役は" & PLAYER & "です"
End Sub


次に、呼び出す側の修正です。
フォームモジュールの、コマンドボタンのクリックイベントプロシージャで、サブプロシージャJankenを呼び出していましたね。そのコードの呼び出し部分を次のように修正しましょう。

Private Sub Com_Kaisi_Click()
    Call Janken(1)
End Sub


Jankenというプロシージャに、引数として『1』を渡すように修正しました。このコードを実行すると、ランダムに決められたコンピューターの役が表示され、その後、プレイヤーの役として、『1』が表示されるはずです。

100.gif

こうなれば成功です。
今回は、引数として『1』という決められた数字を渡しているだけですので、実行結果は毎回同じになってしまいます。
しかし、引数としてデータを渡していることが、これで証明できましたね。
ためしに引数として与えるデータを色々変えて実行してみると、違いがわかるのではないでしょうか。

ちなみに、引数を受け取る変数PLAYERは、変数の型がInteger型ですので、整数以外のデータを渡そうとするとエラーになります。注意しましょうね。


■格言

データをやり取りするには引数を活用
引数は2つのステップで実装する


だんだんゲームの骨格が出来上がってきましたね。








メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。