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

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

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



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


スポンサーサイト

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






Chapter.6 [ 変数 ]

■変数の概念

前回の最後に、変数について少しだけ触れましたが、今回はこの『変数』についてを主として解説したいと思います。
それではおさらいも兼ねて、前回紹介したコードを見てみましょう。

Sub Test_2()
Moji = "メッセージのテスト"
MsgBox Moji
End Sub

MsgBoxは、その後ろにつながる文字を、メッセージとして表示する命令だということは、前回説明しましたね。上のコードを見てみると、『Moji』というメッセージが出そうな気がしてしまいますが、実際に実行してみると『メッセージのテスト』というメッセージが出ます。これはどういうことなのでしょうか?

実はこの『Moji』こそが、今回のテーマでもある『変数』なのです。
変数というのは、よく、箱のようなものであるといわれます。しかし、私は最初、恥ずかしながらこの説明では変数を理解できなかった一人です……。初心者だったころ、変数は箱だ、と言われて「はぁ?」とクエスチョンマークが浮かびました。そこで私なりにもう少しわかりやすく説明してみることにします。


■変数はなぜ必要なのか

まず次のコードを見てください。

Sub Test_3()
MsgBox 1 + 2 + 3
End Sub

このコードを実行すると、メッセージは『6』と表示されます。簡単ですよね。計算結果をメッセージとして表示しているだけです。※このコードが動くということはMsgBoxによって、数字や計算結果を表示することも可能、ということがわかります。

それでは次のコードはどうでしょう。

Sub Test_4()
X = 1
Y = 2
Z = 3
MsgBox X + Y + Z
End Sub

このコードを実行すると、やはりメッセージは『6』と表示されます。
このコードでは、変数を3つ使っているのがわかりますか? 『X、Y、Z』の3つが変数です。つまり、箱を3つ用意して、そのなかに異なる数字を入れてから計算に使っているのです。『Xという名前の箱』には1を、同様に『Yという名前の箱』には2を、『Zという名前の箱』には3を入れて、あたかも数字のように計算に使うことができるのです。

次のコードは先ほどのコードと似ていますが、メッセージが変わります。

Sub Test_5()
X = 4
Y = 5
Z = 6
MsgBox X + Y + Z
End Sub

どんなメッセージが出るかはもうわかりますよね?
答えは『15』です。これは説明不要ですね。

さて、上で説明したコードでは、わざわざ変数を使う必要はないように見えます。いちいち変数に数字を代入しなくても、直接計算すればいいだけですものね。
それでは変数が必要なときというのは、いったいどういうときなのでしょうか。

例えば次のようなケースを考えてみましょう。

例:正方形の面積を求める
ただし、一辺の長さは毎回変わる


上のようなケースでは、一辺の長さが、そのときどきによって変わってきます。10cmの場合もあれば、15cmの場合もあるでしょう。こんなとき、たくさんのプログラムを用意するのは無駄ですし、第一全部のケースに当てはまるように複数のプログラムを用意しておくなんて不可能です。
そこで変数を使用して、以下のようなコードを書いてみます。

Sub Menseki()
a = 正方形の一辺の長さ
b = a * a
MsgBox b
End Sub

このコードでは、始めに『a』という変数に一辺の長さを代入しています。さらに、『b』という変数にaの2乗を代入しています。これなら正方形の一辺が、たとえ何センチであっても、ひとつのプログラムで全てカバーできますね。最後に計算結果である『b』をMsgBoxを使って表示すれば、一辺の長さが変わっても簡単に面積を知ることができます。

このように、変数を使うことによって、汎用的で柔軟なプログラムを書くことが可能になるのです。プログラムの見た目もスッキリしますし、何より無駄にコードを書く必要が無くなります。
ゲームのプログラミングに限らず、ほとんどのソフトでは、使う人や使う場面によって、どのような操作をするかが変わってきます。変数を使うことによって、たったひとつのプログラムで様々な動作ができるようになったり、一定の法則にのっとった結果を導き出すことができるようになります。これはとても重要なことです。


■変数の種類

実は変数には複数の種類があります。
先ほどのコードで説明すると、変数aには、必ず数字が入る必要がありますよね。もし変数aの中に『あ』とか文字が入っていたら、計算することができません。
そこで、変数の種類を、あらかじめ宣言しておくことができます。この変数の種類のことを、一般には『変数の型』と呼びます。

ここでは全てを覚える必要はありません。参考までに載せておきますので、とりあえず流し読みでも大丈夫です。

変数の型一覧
記述型の名称入るデータ
Byteバイト型0~255
Booleanブール型TrueかFalse
Integer整数型-32768~32767
Long長整数型-2147481648~
2147481647
Single単精度浮動小数点型Longの小数点使用可版
Double倍精度浮動小数点型Singleの桁数が倍くらい版
String文字列型文字または文字列
Objectオブジェクト型いろんなオブジェクト
Variantバリアント型何でも入っちゃう便利な型
※万能ではないので注意

ここに列挙したもの以外にも型はありますが、とりあえず使いそうなものだけ載せています。それでもかなり色々な種類があるのがわかると思います。

さきほど、変数の型を、あらかじめ宣言しておくことができると書きました。その方法については次回改めて解説したいと思います。
今回は、変数がどんなものか、どうして変数が必要なのかがわかれば、それで充分です。変数はプログラミングの基礎中の基礎ですので、焦らずゆっくり、ひとつひとつ理解していってください。


■格言

変数は様々なデータの入れ物になる
変数を使うことで柔軟なコードが書ける
変数には目的別に様々な型がある


理解できたかな? 説明不足じゃないか不安です……。


スポンサーサイト






Chapter.7 [ 変数の型と宣言 ]

■変数の型を宅急便に例えてみる

宅急便の業者は、様々なモノが入った箱を、目的に合わせて運んでくれます。箱の中身は『重たい家具』だったり、『食べ物』だったり、『ガラスの食器』だったり、色々ですね。宅急便の業者はそれぞれに適切な運送方法を選んで配達します。
もし、箱の中身が『重たい家具』だとすれば、大きなトラックを使って、力の強いドライバーを採用するでしょう。
『食べ物』だとすると、生ものが入っていてもいいように、冷蔵車などで鮮度を保って運ばなければいけません。
『ガラスの食器』には、取り扱い注意とか、割れ物注意とか、注意を促すラベルを貼り付けて慎重に扱うようにするでしょう。
もし、こういったことに手を抜いたり、簡略化したりすれば、配送先のお客に迷惑をかけるかもしれません。

変数の型も、同じように考えることができます。
変数の中身が何なのかを、あらかじめ宣言しておき明確にすることで、様々なトラブルを未然に防ぐことができます。変数に数字が入ることが確実なら、数字を扱う変数であることを明確にしておいたほうが、エラーなどが起こる可能性を低くできます。それに、プログラムを書いている本人にとっても、変数の役割が非常にわかりやすくなるのです。
パソコンが実際に処理を行うときにも、あらかじめデータの種類を指定しておいたほうが、無駄が省ける分実行速度が速くなります。

これらのことを踏まえると、変数の型を宣言しておくことの利点がわかると思います。逆に言えば、キチンと型を宣言していない変数を使うことで、わかりにくく実行速度の遅いプログラムができあがります。ゲームを作成する場合に限らず、実行速度の遅いプログラムはストレスになりますので、やはり適切な変数の型を宣言し、パフォーマンスの向上を図るべきでしょう。


■変数(の型)を宣言する

Sub Menseki()
a = 正方形の一辺の長さ
b = a * a
MsgBox b
End Sub

上のコードは、前回解説に使ったコードです。正方形の面積を求めるプログラムを表したものでしたね。このプログラムでは、変数を2つ使っています。これについてはもう説明しなくてもわかりますね。『a』と『b』の2つが変数です。
このケースでは、どちらの変数も、数字を扱うものだということが前提ですね。そこで、これらの変数を『整数型』という型で宣言してみましょう。

一般的な変数を宣言するときは『Dim』を使います。

Sub Menseki_2()
Dim a
Dim b
a = 正方形の一辺の長さ
b = a * a
MsgBox b
End Sub

これで、2つの変数が宣言されました。
でもこのコードは不完全ですね。どこが不完全だかわかりますか?
『Dim』というのは、あくまでも『これは変数です』ということを宣言しているにすぎません。ですから上で書いたコードでは、『a』と『b』が変数であることまでは宣言できていますが、数字を扱う変数であるかどうかは定義されていないのです。要するに型が宣言されていないわけです。

そこで、数字を扱う型であることを宣言するために、『As』を使って、次のように書き加えます。

Sub Menseki_3()
Dim a As Integer
Dim b As Integer
a = 正方形の一辺の長さ
b = a * a
MsgBox b
End Sub

『Dim』と『As』、この2つのキーワードを両方使うことで、初めて変数の型を宣言することができます。上のコードでは、『aとbは整数型(Integer型)の変数です』と宣言しています。


■変数を宣言するもうひとつの理由

さて、変数の宣言の仕方は理解できたでしょうか?
変数は非常に便利な仕組みであると同時に、プログラミングには欠かせない要素のひとつです。変数を知らずして、ゲームを作り上げることは不可能です。

『Dim』と『As』を使って変数を宣言すると、どのような利点があるかは先に説明しましたね。でも、何でもかんでも変数として宣言できるわけではありません。
例を出して考えてみましょう。

例えば文字を扱う変数を宣言したいとします。
文字を扱う変数の型は『文字列型(String型)』ですので、宣言する場合は次のようになります。

Dim 変数の名前 As String

『変数の名前』は、好きに決めることができます。ローマ字読みで『Moji』とか、型の頭文字をとって『STR』とか、自分がわかりやすい名前をつけるのがいいでしょう。あとでこの変数なんだっけ? なんてことにならないように、直感的に理解しやすい名前をつけるべきです。
ただし、ここで注意点がひとつあります。
あらかじめ命令文などとして定義されているキーワードは、変数の名前に使用できません。これは大文字と小文字の違いは関係なく判断されます。それと、大概の記号も使えません。
例えば次のような変数は宣言できません。

Dim Sub …… VBAで定義されているキーワードなので ×
Dim SUB …… 全部大文字にしたってダメです ×
Dim sub …… 全部小文字だからってやっぱりNG ×
Dim --- …… ハイフンなどの記号は使えない ×
Dim ? ? …… スペースをいれるのもダメ ×

逆に、次のような変数名は使えます。

Dim Sab …… キーワードとかぶってないからOK
Dim S_B …… 記号で使えるのはアンダースコア(コレ⇒_)だけ
Dim aaa …… 安易かどうかは関係ない(わかりずらいから非推奨)
Dim あああ …… 一応日本語も使える(個人的には非推奨)


まとめてみます。

キーワードと同じ名前は使えない
大文字と小文字は区別されない
記号は原則使えない
使える記号はアンダースコアのみ
全角の日本語も一応使える
最大でも半角255文字分まで
一度使った変数名は使えない(スコープによる)
これらのルールを守っていれば原則なんでもよい


変数を全角の日本語で宣言することは、一応可能ですが、個人的には推奨しません。理由としては、一般的ではないので他人のコードが読めなくなる可能性があることや、いちいち入力モードを切り替える必要が出てくること、などがあります。偉大な先人の中には、あえて変数を日本語で宣言することを推奨している方もいらっしゃいます。ですので、変数の日本語宣言は、あくまでも個人的に非推奨だということにしておきます。

変数の名前で重要なことは、第一にわかりやすいことです。自分にとって、最もわかりやすい法則で命名するのが一番いいでしょう。ちなみに、上に挙げたルールの中で『一度使った変数名は使えない(スコープによる)』というのがありますが、スコープについては次回説明したいと思います。結構長くなっちゃうと思うので。理屈はそんなに難しくないですけどね。


■格言

変数を使うなら必ず宣言すること
宣言には『Dim』と『As』を使う
わかりやすさを第一に名前をつけよう


大きなプログラムになるほど変数の名前は重要ですよ








Chapter.8 [ プロシージャとスコープ ]

■プロシージャについて

一向にゲームの作成について解説がないですね……。
でも焦ってはいけません。足し算や引き算ができないうちは、関数や方程式は理解できないのと同じで、基本を知らないうちに、ゲームが作れるようになることはありません。
素晴らしいゲームを作成できるようになるために、下地をしっかり固めましょう。

今回は、『プロシージャ』についてまず説明します。
「はぁ? なにそれ?」って感じですよね。まぁ簡単ですからちょっと我慢して聞いてくださいね。

『プロシージャ』は、端的にいうと、ひとつのコードのかたまりのことです。以前のChapterで、何度か小さなプログラムを載せてきましたが、あれがいわゆるプロシージャなのです。ちょっとわかりづらいですね。もう少し詳しく説明してみます。

Sub Hello()
MsgBox "Hello!"
End Sub

ちょっと懐かしいコードです。この講座の解説に初めて使った、メッセージを表示するプログラムですね。これもプロシージャです。以前のChapterの第5回目を見てもらえばわかりますが、このプログラムは『Sub(サブ)』というキーワードで始まり、『End Sub(エンドサブ)』というキーワードで終わります。このようなプログラムのことを『Sub(サブ)プロシージャ』と呼びます。つまり上のコードは、『Helloという名前のSubプロシージャ』ということになります。
プロシージャの種類は、サブプロシージャのほかに『Function(ファンクション)プロシージャ』や、『Property(プロパティ)プロシージャ』がありますが、Subプロシージャ以外は、今の段階ではまだ覚えなくともいいでしょう。

要するに、プロシージャというのは、最も小さなプログラムのかたまりのことです。Subで始まるプログラムのひとつひとつがSubプロシージャなのです。


■スコープ

変数の宣言には、型までしっかり指定して宣言したほうがいいということは、前回の解説で理解できたと思います。DimとAsで宣言するのでしたね。
前回の最後に、変数の名前をつける際に、注意すべきルールを列挙しました。
その中に、『一度使った名前は使えない(スコープによる)』というものがありました。これを説明するためには『スコープ』についても説明しなくてはなりません。説明ばかりで疲れちゃいますね……。まぁ流し読みでもいいですから、さらっといきましょう。

さて『スコープ』というと、ライフルなどの照準を表したりしますね。ここでいう変数のスコープの意味は、簡単に言うと『適用範囲』のことです。つまり変数のスコープといえば『変数の適用範囲』という意味と同じです。

変数には、その変数が有効となる範囲が決められています。
普通にDimを使って宣言した変数は、そのプロシージャ内のみで使用できます。つまり、適用範囲は『宣言したプロシージャ内のみ』ということになります。別のプロシージャからは、その変数を呼び出すことができないわけです。

Dimで宣言した変数は、スコープがそのプロシージャ内に限定されます。ということはつまり、同一プロシージャ内で、同じ名前の変数は複数宣言できないとも言えます。
これが『一度使った名前は使えない(スコープによる)』という意味なのです。Dimで宣言した変数のスコープは、宣言したプロシージャ内ですから、同じプロシージャの中(同じスコープの中)で、同じ名前の変数を複数宣言することはできないのです。

悪い例(変数名がかぶってる)↓
Sub Keisan()
Dim X As Integer
Dim X As Integer
X = 1
X = 2
MsgBox X + X
End Sub


良い例(変数名が異なる)↓
Sub Keisan()
Dim X As Integer
Dim Y As Integer
X = 1
Y = 2
MsgBox X + Y
End Sub



■スコープの範囲を変えるには

Dimで宣言した変数は、宣言したプロシージャ内でのみ使うことができます。
それでは、別のプロシージャからも呼び出せるようにするには、どうしたらいいのでしょうか。

それには、Dimではなく『Public(パブリック)』を使います。
ただし、Publicで変数を宣言する場合は、どんなところからも呼び出すことができるわけですから、プロシージャの中で宣言してはいけません。必ず、モジュールの先頭部分、つまりエディターの一番上のところで宣言しなくてはいけませんので、注意してください。プロシージャの中でPublic宣言を行うとエラーになります。

悪い例(プロシージャ内でPublicを宣言)↓
Sub Keisan()
Public X As Integer
Public Y As Integer

X = 1
Y = 2
MsgBox X + Y
End Sub


悪い例その2(モジュールの先頭以外でPublicを宣言)↓
Sub Keisan1()
X = 1
Y = 2
MsgBox X + Y
End Sub

Public X As Integer
Public Y As Integer


Sub Keisan2()
X = 3
Y = 4
MsgBox X + Y
End Sub


良い例↓
Public X As Integer
Public Y As Integer


Sub Keisan1()
X = 1
Y = 2
MsgBox X + Y
End Sub

Sub Keisan2()
X = 3
Y = 4
MsgBox X + Y
End Sub



変数を宣言するときに、Dimではなく、Publicで宣言するだけで、スコープがアプリケーション(つまりExcel)内部の全てに適用されます。
要するに、変数の宣言時にどのキーワードを使うかによって、スコープの範囲が変わるというわけです。それぞれの宣言方法には、宣言する場所などの決まりがありますので、注意してください。

DimやPublic以外にも、以下のようなキーワードが用意されています。
参考までに見ておいて下さい。(全部じゃないけど代表的なところ)
記述宣言する場所スコープの範囲
Dim
またはキーワードなし
プロシージャ先頭プロシージャ内
Privateモジュール先頭モジュール内
Publicモジュール先頭全部のプロシージャ

※補足
Dimを使用して変数を宣言する場合に、Publicの場合と同じようにモジュールの先頭で宣言すると、Privateと同じスコープを得ることができます。ただし、わかりづらくなるので、モジュールレベルのスコープが必要な場合にはPrivateを使うようにしましょう。


■どのキーワードで宣言するか

長々と書いてきましたが、基本的に変数はDimを使って、プロシージャレベルで宣言するべきです。
理由は色々ありますが、例えばPublicを使って宣言した変数は、その使用目的がハッキリしていないと逆にわかりづらい変数になります。コードのメンテナンス性を悪化させ、ダメダメプログラムのレッテルを貼られることになってしまいます。スコープが全部から参照可能になってしまうわけですから、1箇所で不備があった場合に、全体に影響が及ぶ可能性も出てきてしまいますからね。
特に、コーディングに不慣れなうちは、原則Dimを使ってプロシージャレベルの宣言を行うほうが無難です。あとで、なんに使う変数かわかりやすいという利点もあります。


■格言

プロシージャはプログラムの最小単位
変数はスコープと呼ばれる適用範囲を持つ
変数は宣言方法によってスコープが変化する


とりあえず変数の宣言はDimに統一しておきましょうね。








Chapter.9 [ ゲームつくる様々な手法 ]

■様々な手法

Excelでゲームを作るには、様々な方法があります。
ここでいう方法とは、プラットフォームに何を採用するか、という意味です。
『プラットフォーム』というのは、一体何を指すのか、まずはそこから見ていきましょう。

私を含め、多くのExcelゲームプログラマーにとって、聖地とも呼ぶべきサイトがあります(当ブログからもリンクさせてもらっています)。このサイトは、多くのExcelゲームをフリーソフトとして紹介し、たくさんの人にExcelで作られたゲームの素晴らしさを広めようと日々尽力されています。Excelプログラマーにとっては、作品を発表する場を提供してくれる、非常にありがたいサイトでもあります。私も何点か出品させていただいていますし、貴サイトの運営する『動かす会』の会員でもあります。

さて、このサイトの管理者である近田会長を筆頭に、Excelでゲームを作るプログラマー集団が『動かす会』です。動かす会では、ゲームの作成方法を、現在のところ4つに分けて定義しています。

モード1:
Excelのワークシート上にある『セル』を、ドットに見立ててゲーム画面を作成する手法です。
ご存知のようにパソコンの画面もテレビ画面も、小さな点の集まりです。その点のひとつひとつが様々な色に変化することで、視覚的な効果を生み出します。
モード1では、セルを小さく縮小し、そのセルに色をつけることによってゲーム画面を描画します。ですから拡大すると何が何やらよくわからなくなります。どこかレトロな雰囲気と、Excelで作成しているという何ともいえない達成感が、このモードの売りといえます。最もExcelらしい、やりがいのあるモードです。

6.01


モード2:
Excelの基本機能の中に、図形を描画する機能があります。この図形のことを『オートシェイプ』と呼びます。
モード2は、このオートシェイプを使用してゲームを作成するモードです。たかが図形と侮る無かれ。実は様々な視覚効果を持たせることができ、移動や回転も簡単にできるという万能機能なのです。ワークシート上をこだわりのオートシェイプが縦横無尽に駆け回る様は、まさにプログラマー冥利につきます。実は一番とっつきやすく、簡単なプログラミングが可能なモードです。

041.gif


モード3:
VBAの機能を最大限に引き出し、画面の構成から作成してしまおうというのがモード3です。VBAのユーザーフォームを使って、自由度の高いインターフェイスを作成できます。実は私の最も得意とするモードでもあります。
モード3では、高い知識と経験が必要ですが、他の言語で作成されたゲームに匹敵する描画を実現することも可能です。こだわりだせば、どこまでもこだわれるモードですね。
ただし、なまじ描画機能が優れていることや、Excelのワークシートを使用しない点などが災いし、Excelらしさが失われてしまいます。まぁ好き好きですけどね。

042.gif


モード4:
モード4は、モード3よりもさらに高度な領域、ウィンドウズの根底にある機能を呼び出してゲームを作成する手法です。私の知る限り、このモードを自由に操れるExcelプログラマーはほとんどいません。
ウィンドウズが様々な機能を提供するために、とても高度なロジックがあらかじめ用意されているのですが、我々はそのことを意識することなく普段パソコンを使っています。モード4はこの根底のプログラムを呼び出して描画を実現するので、他のモードとは描画能力が桁違いです。速度、美しさ、難しさ、全てが半端じゃないです。
よって、私はまだこのモードをものにしていないので、解説できません。ごめんなさい。私もまだまだ勉強中の身なのです。いつか、モード4について解説できるように頑張ります。

モード特徴難易度
モード1
別名セルドット方式
セルのひとつひとつを
ドットに見立てて描画する
☆☆
モード2
別名オートシェイプ方式
オートシェイプをキャラクタなどに
見立てて描画する
モード3
別名ユーザーフォーム方式
ユーザーフォームを使い
高度なデザイン性を実現
☆☆☆
モード4WindowsAPIを呼び出すことで
凄まじい描画能力を発揮
☆☆☆☆☆


■どのモードをチョイスするか

上で紹介した表を見てもらえればわかりやすいのですが、最も簡単に、手軽にゲームを作成できるのはモード2です。ですが、私はあくまでもモード3での解説をしていくつもりです。つまり、ユーザーフォームをプラットフォームとして、これから先の講座も続けていきます。
どうしてモード3にこだわるか、それは単に、私が得意だから……なんですが、一応他の理由もあります。
モード3は、Excelのウィンドウとは別に、単体で動くことができます。つまり、まるでExcelらしからぬ、既存のゲームのような見た目を実現することができるのです。
ハッキリいって、これに関しては賛否両論あります。
Excelでゲームを作成することに喜びを感じるのは、むしろモード1やモード2でゲームを作成したときです。多くのExcelプログラマーが、この感動の為に、日々モード1やモード2でゲームを作り続けています。現在でもファミコンやゲームウォッチが愛されているのと、理屈としては似ていますね。
モード3は、見た目がExcelらしくないという、ある種の利点と難点を、両方同時に備えています。しかしこれは、言い換えれば『うそ! これがExcelなの!?』とユーザーを唸らせることができる可能性を秘めているということでもあるのです。

私は、どちらかというとビジュアルにこだわりを持つタイプです。ですからユーザーフォームの自由度の高さや、エフェクトの多彩さに魅入られたのです。この講座をご覧の皆さんは、むしろ簡単なモード2から始めろよ! と思うかもしれません。でもモード3でゲームを作成することができれば、自然とモード1もモード2も、理解することができるでしょう。そして、きっと満足のいくゲームを作成できるようになるでしょう。


■格言

Excelでのゲーム作成には様々な手法がある
それぞれにメリットデメリットがある
この講座はモード3でのゲーム作成に特化する


どうぞ気長にお付き合いください。








Chapter.10 [ ユーザーフォーム ]

■フォームの挿入

ユーザーフォームは、プログラマーが自由にデザインできるウィンドウです。パソコンを使っている人なら誰もが目にする、ボタンや、テキストボックスなどを自由に配置し、ゲームの画面をデザインすることができます。

まずは、ユーザーフォームをプロジェクトに追加するところから始めましょう。

以前のChapterの第5回で解説した、『標準モジュール』の挿入というのがありましたね。ユーザーフォームもまた、これと同じ要領でプロジェクトに追加するところから始まります。

まず、Excelを立ち上げて、VBEを開きましょう。そして『挿入』から『ユーザーフォーム』を選びます。これで、画面に空のユーザーフォームが表示されるはずです。

050.gif


このフォームに様々なオブジェクトを配置していきます。


■コントロール

コントロールというのは、ボタンやテキストボックスと呼ばれるオブジェクトのことです。これらのコントロールをフォームの上に自由に配置して、自分なりのゲーム画面を作っていきます。

まずは、各コントロールの説明から始めましょう。

オブジェクトの選択:arrows_object.gif
この矢印を選択しているときは、コントロールの移動や、大きさの変更を行うことができます。

ラベル:label.gif
フォーム上に文字を書きたいときは、このラベルを使用するのが一般的です。ラベルの中に入る文字は、自由に変更できます。フォーム上に説明文や注意書きをするときに使えそうですね。

テキストボックス:text.gif
インターネットをやっているときに、何かに登録したり、掲示板に書き込んだりするときは、このような箱の中に文章を書きますね。テキストボックスは、ユーザー、つまりプレイヤーが文字を入力することができる仕組みです。もちろん、プログラムから中身を制御することもできますがね。

コンボボックス:combo.gif
ドロップダウンリストを表示するためのコントロールです。地図などをインターネットで調べるときとかによく見かけます。右端の▼をクリックすると、下にずらずらとリストが現われるあれですね。

リストボックス:list.gif
コンボボックスとよく似ています。リストを表示するためのコントロールです。コンボボックスとの違いは、ユーザーが値を変更できるかどうかなどがあります。私はあまり使いませんが、その有用性は幅広く、使い勝手のいいコントロールです。

チェックボックス:check.gif
これは見た目でわかりますね。ソフトの設定画面とかによくあります。チェックした項目だけが有効になるやつです。

オプションボタン:option.gif
チェックボックスと、見た目も役割も似ていますが、全く違うコントロールです。その最大の違いは、チェックボックスが複数選択を許可するのに対し、オプションボタンは絶対にひとつだけしか選択できないことです。かならずどちらかの選択肢を選ぶ必要がある場合などに使われます。

トグルボタン:toggle.gif
トグルボタンはあまり使われているのを見かけませんが、機能としては独特なものを持っているコントロールです。トグルボタンを一回クリックすると、ボタンが凹んだままになります。もう一度クリックすると元に戻ります。状態の切り替えなどに使えそう。

フレーム:frame.gif
フォームの中に、独立した空間を作り出します。意味わかりませんね。はい。
例えば、オプションボタンは、先にも説明しましたが、フォームの中で絶対にひとつだけしか選択できません。しかしフォームの中にフレームを作成し、その中にオプションボタンが入っている場合には、それぞれが別々の判断で動くようになります。フォーム上のオプションボタンと、フレームの中のオプションボタンはフィールドが異なるので両方オンになっていても大丈夫です。私はフレームを使いまくるタイプです。便利なのでつい……。

コマンドボタン:command.gif
いわゆるボタンです。押したときに何かが起きるヤツです。よく使います。というかこれ抜きでモード3のゲーム作成をするのは難しいですね。無理じゃないけど。

タブストリップ:tag.gif
このコントロールの上部に、小さなタグがついていますね。このタグを切り替えることで、機能の異なるプログラムをひとつのコントロールから提供できます。

マルチページ:page.gif
タブストリップと見た目はほとんど同じですが、機能は全く違います。
まず、タブストリップは、タブを切り替えても、中身のレイアウトは変化しません。これに対しマルチページでは、中身のレイアウトを個別に設定することができます。多くのソフトでは、設定を呼び出すとマルチページで作られた設定画面がでます。Excelのオプションもマルチページ使ってますね。

スクロールバー:scroll.gif
要するにスクロールするためのバー……なんですが、ゲームで使うときは、むしろ威力の強弱を調節するときとかに使うんではないかと。左に行くほど弱くする、右に行くほど強くするとか。

スピンボタン:spin.gif
クリックするごとに一定量の値を上下させるコントロール。下限と上限を設定することはもちろん、ワンクリックごとの上昇量も任意に設定できます。

イメージ:image.gif
モード3、つまりユーザーフォーム方式でゲームを作成するには、絶対に欠かせないコントロール。様々な画像を表示することができます。背景を透明にしたりもできます。

RefEdit:refedit.gif
使ったこと無いです。だから詳しく解説することはできませんが、要するにExcelのセルの参照を取得するためのコントロールです。Excelの数式入力のときとかに出てきます。見た目は違いますけど。なんていうか……使い勝手が悪いです。これ。
053.gif

これと同じ機能です↑


■コントロールを配置してみる

では練習してみましょう。
ユーザーフォームをプロジェクトに追加すると、規定のサイズのユーザーフォームが挿入されて、画面上に表示されるはずです。同時にツールボックスが表示されているはずですがどうでしょうか。

ツールボックス:

052.gif


もし表示されていない場合や、誤って消してしまった場合は、メニューの『表示』から『ツールボックス』を選択することで、再表示させることができます。

このツールボックスの中に、様々なコントロールが収められています。この中から、まずは『ラベル』を選んで、フォームに配置してみましょう。

052.5.gif


ラベルのボタンを押すと、カーソルが十字型に変わります。このときにフォーム上でドラッグすると、任意の大きさのラベルを配置することができます。尚、一度配置が完了するとカーソルは通常の状態に戻ります。


■配置したラベルの表示を変更してみる

ラベル上で、一度クリックしてみると、テキストを書くときのように文字を編集することができるようになります。文章が長くなり、ラベルの長さよりも文が長くなると、自動的に改行されますが、任意の場所で改行したい場合は『Ctrl+Enter』で改行できます。ただエンターキーを連打しても改行されないので注意してください。

このラベルに表示されている文字のことを『キャプション』といいます。『Caption』は、見出しとか説明文とかいう意味です。ラベルに限らず、文章を表示できるコントロールにはこのキャプションが設けられていることが多いです。

056.gif


■大きさを変えてみる

ラベルを選択状態にすると、網目状の線があたりを囲み、小さな四角形が8つ出てきます。この小さな四角形部分をドラッグすることで、サイズを自由に変更することができます。ちなみにこの四角形は『調整ハンドル』と呼ばれています。この大きさを変える仕組みはラベルに限らず、どのようなコントロールでも同様です。

055.gif


なんとなくコントロールについては理解できましたか?
次回は、これらのコントロールについてもう少しだけ詳しく解説します。次回の内容を習得できたら、ほぼ基本は完了と言っていいでしょう。本格的に、ゲームの作成を行っていきますよ!


■格言

フォームは自由度の高いオリジナルウィンドウ
フォームには様々なコントロールを自由に配置できる
コントロールはその大きさや移動を簡単に変更調整できる


最初は少ないコントロールをキチンと操ることを学びましょう。








Chapter.11 [ プロパティウィンドウ ]

■プロパティ

『プロパティ』という言葉があります。日本語訳すると『属性』という意味です。VBEの画面をよく見ると、プロパティウィンドウという部分がありますが、これはコントロールなどのオブジェクトの、様々な属性を簡単に設定するための機能です。

060.gif


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

プロパティウィンドウには、現在選択されているオブジェクトの、様々なプロパティ、つまり属性が表示されています。フォームをデザインしていればわかりますが、オブジェクトの種類によって、プロパティも変化します。色々なオブジェクト(コントロール)をフォーム上に配置して、順に選択していってみましょう。内容が変わっていくのがよくわかるのではないでしょうか。

このプロパティを変更することによって、コントロールなどのオブジェクトの属性を変更し、機能面や見た目を変更します。これによって多彩な挙動や表現を実現できます。


■プロパティの種類

今回も、ラベルを例にとってプロパティを変化させるプロセスを見ていきましょう。ラベルにはざっと挙げただけでも、次のようなプロパティがあります。

Nameプロパティ:
そのオブジェクトの名前を定義するプロパティです。
この部分を変更すると、そのコントロールの名前が変わります。コードからこのオブジェクトを指定するときに、ここで定義されている名前を使用します。ラベルの場合の規定値は『Label*』です。(*の部分には連番が自動で入ります)

BackColorプロパティ:
そのオブジェクトの背景色を定義するプロパティです。
ラベルの場合はこのプロパティを変更することで、ラベル自体の色が変わります。黒いラベルとか赤いラベルとか作れます。

BackStyleプロパティ:
そのオブジェクトの背景を透過処理するか指定します。
規定値は『1 - FmBackStyleOpaque』ですが、これに『0 - fmBackStyleTransparent』を指定することで、背景が透けて見えるようになります。もし背景を透過処理している場合は当然BackColorプロパティで指定した色は表示されません。透明なので。

BorderColorプロパティ:
オブジェクトの枠線の色を定義するプロパティです。
ラベルの場合は、既定では枠線が無いので、このプロパティを変更しても特に視覚的な変化はありません。後述のBorderStyleプロパティを変更して枠線を表示している場合に有効になります。

BorderStyleプロパティ:
そのオブジェクトの枠線を表示するかどうかを定義します。
規定値はオブジェクトによって異なります。ラベルの場合は『0 - fmBorderStyleNone』になっており、枠線が表示されていません。『1 - fmBorderStyleSingle』に指定すると枠線が表示されます。イメージオブジェクトなどは、既定で枠線が表示されるコントロールです。

Captionプロパティ:
オブジェクトに表示される文字列を定義するプロパティです。
ラベルは文字列を表示するのが目的のコントロールなので、このCaptionプロパティはとても重要です。ここで指定されている文字や文章が、実際にラベルに表示されます。

ControlTipTextプロパティ:
そのオブジェクトの上にマウスカーソルが来たときに、簡単な説明文を表示するときなどに使うプロパティです。
例えばフォームに配置したボタンに『処理を完了します』というControlTipTextプロパティを設定すると、そのボタンの上にカーソルが来たときに、小さなポップアップが表示され、処理を完了しますというメッセージが表示されます。ボタンなどにはあまりたくさんのメッセージを表示させるわけにはいきませんので、このようなプロパティを有効に活用することで、ユーザーフレンドリーな設定を行うことができます。

Enabledプロパティ:
そのオブジェクトの使用許可を設定します。
よく設定画面などで、一定の要項をチェックしていないと、ボタンが灰色になっていて先に進めない場合などがあります。利用規定に同意しますか? とかの時によく見かけますね。『同意する』というオプションボタンをチェックしないと、完了ボタンが押せないヤツです。
このような場合には、Enabledプロパティが設定されているのです。規定では、全てのコントロールで使用が許可される『True』が設定されています。もし、一時的にそのコントロールの使用を許可したくない場合には、Enabledプロパティに『False』を指定するとよいでしょう。

Fontプロパティ:
そのオブジェクトのフォントを定義するプロパティです:
自由にフォントを変更できます。太字にしたり大きさを変えたりできるのは、一般的なフォントの変更を行う場合と同じです。

ForeColorプロパティ:
オブジェクト上に表示されている文字の色を定義するプロパティです。
文字が表示されていない場合は関係ありません。ラベルは大抵文字が表示されていますので、このプロパティを変更することで、文字の色を自由に変えることができます。

Heightプロパティ:
そのオブジェクトの高さを定義するプロパティです。
このプロパティに大きな数字を指定すれば、縦に長いコントロールになります。負の数値は指定できません。

Leftプロパティ:
オブジェクトの横位置を定義するプロパティです。
HeightやWidthプロパティとは異なり、負の数値を指定することもできます。フォーム上に存在するコントロールの場合には、フォームの左の端からの距離を指定します。このプロパティに大きな数値を指定するほど、右の方向へずれていきます。

Pictureプロパティ:
オブジェクトの背景に表示する画像を指定します。
ラベルの場合はあまり使うことはありませんが、イメージオブジェクトは画像を表示させるためのコントロールなので、非常に重要なプロパティです。

TextAlignプロパティ:
そのオブジェクトに表示される文字列の位置関係を定義します。
例えば、左寄せや右寄せ、中央揃えなども指定できます。

Topプロパティ:
オブジェクトの縦位置を定義するプロパティです。
フォームの上の端からの距離を指定します。大きな数字を指定すると、その分下の方向へずれていきます。

Visibleプロパティ:
そのオブジェクトが視覚的に見えるかどうかを定義します。
もし、Visibleプロパティに『False』が設定されている場合は、画面上にそのコントロールは表示されません。その場所には存在しているのですが、見えないだけです。『True』を指定することで、表示させることができます。シューティングゲームなどでは、自機が破壊されてしまったときなどは非表示にしなきゃいけませんよね。そんなときにはVisibleプロパティに『False』を指定すれば非表示になります。

Widthプロパティ:
そのオブジェクトの幅を定義するプロパティです。
Heightプロパティと対を成すプロパティで、オブジェクトの横幅を指定できます。Heightプロパティ同様、負の数値を指定することはできません。大きな数値を指定するほど、横に長くなっていきます。


■膨大なプロパティ

どうですか。疲れますね、これは。
上に挙げたのは、ラベルのプロパティの約半分程度です。ラベルひとつとってもこれだけのプロパティがあるのに、コントロールによってはもっとたくさんのプロパティがあるのですから、たまりません。

結論から言うと、全てのプロパティを覚える必要はありません。状況に応じてある程度使うプロパティは決まってきます。少しずつ、使う機能だけ覚えていけば充分です。ただし、プロパティについて詳しく知りたい場合は、ヘルプを参照したり、インターネットで調べてみたりすると、実はこんな機能があったのか! という発見があることも多いです。興味のある方は是非調べてみてください。

今回はあくまでもプロパティについての基本を理解して欲しいだけです。
細かなプロパティの内容まで覚える必要はありません。ですからあまり勢い込んでプレッシャーを感じないでくださいね。


■格言

プロパティとは属性のこと
プロパティを操ることで多彩な表現が可能になる
必要なプロパティだけを覚えればよい


焦らずゆっくりね。








メールフォーム

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

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

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

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。