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

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

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



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


スポンサーサイト

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






Chapter.68 [ Function プロシージャ ]

■関数を自作する

今まで、この講座ではサブプロシージャ( Sub )を用いてコードを書いてきました。しかし、プロシージャの種類は、なにもサブプロシージャだけではありません。そして、サブプロシージャではできなかったことが、他のプロシージャを用いることで実現できる場合もあります。

そんなわけで今回は、ファンクションプロシージャ( Function )について解説します。
ファンクションプロシージャを用いると、関数を自作することができます。今まで、皆さんは特に意識せずともVBAの関数を使ってきました。乱数を取得する『 Rnd 』も関数のひとつです。小数点以下の数値を切り捨てる『 Int 』だって関数です。ファンクションプロシージャを正しく理解すれば、便利な関数を自分で作ってしまうことが可能になり、汎用的なコードを記述することができるでしょう。

ハッキリ言って、ファンクションプロシージャが使えるかどうかで、結構実力に差が出ると私は思っています。今回の講座で、ファンクションプロシージャの特性と便利さを、是非実感してください。


■何が違うのサブとファンクション

では具体的にサブプロシージャとファンクションプロシージャは何が違うのでしょうか。

それには、VBAの関数を思い浮かべながら考えるのが一番わかりやすいと思います。
例えば、次のコードは、乱数を取得するという意味のコードですね。

Dim S As Single

S = Rnd

このとき、変数 S には取得された乱数が入ります。このことから、 Rnd 関数は、求められた動作に対して、何らかの結果を戻り値として返していることがわかります。

同様に、次のコードは、 Int 関数を使っているコードですね。

Dim I As Integer

I = Int(123.456789)

この場合も、 Int 関数が戻り値として結果を返してくれますね。『123.456789』というデータを受け取り、小数点以下を切り捨てた『123』という結果を戻り値として返してくれます。

関数名求められた動作与えられた引数返す結果(戻り値)
Rnd乱数を取得したい今回は無し0~1の間の乱数
Int小数点以下を切り捨てたい123.456789123

これを見てわかるように、関数とは、必ず結果を返すものであることがわかります。今まで私達が作ってきたサブプロシージャでは、何らかの処理を行っても、その結果を呼び出し元に返すということはしませんでしたね。
ファンクションプロシージャを使うと、呼び出し元に結果を返すことができるようになります。つまり、戻り値を設定することができるのですね。これが実はかなり便利なのです。

それでは、具体的にどのように使うのか、それを考えてみましょう。


■簡単な例でファンクションを理解する

以前、角度に関する内容を取り扱った講座がありましたが、皆さん覚えているでしょうか。その時に登場した『ラジアン』を、簡単に求めることができる関数をファンクションプロシージャで作ってみましょう。

まず、ラジアンについて簡単におさらいします。ラジアンについては大丈夫、という人は読み飛ばしても構いません。

ラジアンは弧度法で角度を扱うための単位の一種でしたね。普通は誰しも度数法による角度(円が一周360度)で考えますが、弧度法はこれとは全く違った角度の考え方です。プログラミングの際には多くの場合、度数法ではなく弧度法による角度の計算が必要になります。
サインやコサインなどの三角関数に関する計算では、ラジアンは必須です。ラジアンの意味はともかく、ラジアンを求めることができなければ、角度に関する計算ができないのです。
ですから、もし度数法の角度からラジアンに簡単に変換できる関数があったら、角度の計算がだいぶ楽になるはずです。今回はこれをファンクションプロシージャを用いて作ってみることにします。

それでは、度数法の角度から、ラジアンへの変換を行う公式から見てみます。

rad = ang * 3.14 / 180

rad がラジアン、 ang が度数法の角度です。
この公式で計算すると、度数法からラジアンを求めることができます。そして、これを元に作成したラジアン変換関数が次のファンクションプロシージャです。

Function Radians(Angle As Long) As Single
    
    Dim S As Single
    Dim L As Long
    
    L = Angle Mod 360
    
    S = L * 3.14159 / 180
    
    Radians = S
    
End Function

構造はほとんどサブプロシージャと同じですね。

まずファンクションプロシージャの宣言部分、つまり、1行目を見てください。
今までサブプロシージャを使ってコードを記述する際には『 Sub ~ 』と記述していました。ところが今回はファンクションプロシージャを使っていますので『 Function ~ 』と記述が変化しています。
サブプロシージャは必ず『 Sub 』で始まり『 End Sub 』で終わりましたね。同様に、ファンクションプロシージャでは、必ず『 Function 』で始まり『 End Function 』で終わります。これは簡単ですね。

そして、黄色い文字で示された部分。『 As Single 』という部分がファンクションプロシージャにはついています。これは今までサブプロシージャにはありませんでしたね。実はこの部分がファンクションプロシージャの一番重要な部分です。

As Single 』という記述からわかるように、これは何らかのデータの型を表しています。では何のデータ型を表しているのでしょうか。

実はこれこそが『戻り値』のデータ型です。ファンクションプロシージャは関数です。何らかのデータを結果として呼び出し元に返します。
このとき、どのようなデータ型でデータを返すのか、それをここでは定義しているのです。

例えば先ほども出てきた『 Rnd 関数 』では、0 から 1 の範囲からランダムに数値を返してきます。当然そのデータは、小数点以下のデータを含むデータです。ですから、Rnd 関数をVBEで記述するときに表示されるパラメータヒントは次のようになっています。

380.gif

Single 型、というのは小数点以下を扱うことができる、数値を扱うデータ型です。上の画像を見るとわかるように、Rnd関数は小数点以下の数値を、結果として返してくることになっているのです。

そして同じように、先ほど自作したラジアン変換関数も、小数点以下の数値データを結果として返します。なぜなら、ラジアンは小数点以下の数値で表されるからです。ですから始めに Single 型のデータを戻り値として返すことを宣言していたのです。

381.gif


■データを返す

さて、なんとなくファンクションプロシージャがわかってきましたか? それでは最後の仕上げです。

先ほどのコードを見やすいようにもう一度掲載します。

Function Radians(Angle As Long) As Single
    
    Dim S As Single
    Dim L As Long
    
    L = Angle Mod 360 '①
    
    S = L * 3.14159 / 180
    
    Radians = S '②
    
End Function

このファンクションプロシージャの名前は『 Radians 』です。緑の文字で表示されていますね。このプロシージャの名前をよく覚えておいてください。

さてそれでは①から見てみましょう。ここでは引数として受け取ったデータを、Mod 演算子によって『 0 ~ 359 』の範囲に制限しています。こうしておけば、どのような大きさの数値データを受け取っても、キチンと度数法に合わせてラジアンを算出できます。

そして②です。
ここで、先ほどの覚えておいてください、と言ったプロシージャの名前が出てきていますね。実はここが戻り値を設定している部分です。
今回の場合、ラジアンを計算した結果は一度、変数 S にまず入ります。そして、今度はその変数 S の値を、プロシージャ名に直接代入していますね。
このように、プロシージャの名前に結果を代入することで、呼び出し元にデータを戻り値として返すことができるのです。


さて、こうしてラジアン変換関数が出来上がりました。これはVBAの関数と同じように、普通に呼び出して使うことができます。
次の例では、引数として与える角度を変更すると、表示されるメッセージが変わるはずです。いろいろ試してみるといいでしょう。

Function Radians(Angle As Long) As Single
    
    Dim S As Single
    Dim L As Long
    
    L = Angle Mod 360
    
    S = L * 3.14 / 180
    
    Radians = S
    
End Function

'-------------------------------------------

Sub Test()

    Dim S As Single
    
    S = Radians(90) 'ここを変える
    
    MsgBox S
    
End Sub



■まとめ

長々と説明してきましたが、ファンクションプロシージャについてなんとなく理解できたでしょうか。
しかし、今更ですがファンクションプロシージャを使うと、どんなメリットがあるのでしょう。

例えば、今回のラジアン変換関数は、いったん作ってしまえばどんなゲームにも使えますね。同様に、衝突判定をする関数などを作っておけば、ゲームを作るたびに何度も衝突判定を実装させる必要はありません。

シューティングゲームなどを例にとると、敵と味方、敵の弾と味方、味方の弾と敵、など、たくさんの衝突判定が必要になりますね。しかし、ここに衝突を判定する関数が登場したらどうでしょう。想像しただけでもかなりコーディングが楽になるような気がしませんか? 

ラジアン変換関数では、戻り値を Single 型にしましたね。衝突判定の関数を作るなら、戻り値を Boolean 型にして、衝突していれば True 、していなければ False などとデータを返すようにしておけばかなり便利です。

ファンクションプロシージャをうまく活用して、効率的なコードの記述や、汎用的な関数の作成を行ってみてください。自分自身も楽になるし、なによりコードが整理整頓されて美しくなっていくでしょう。
かならずレベルアップにつながりますから、がんばって習得してくださいね。



■格言

関数は自作できる
戻り値のデータ型を正しく設定する
ファンクションプロシージャでコードを美しく整理整頓


一度覚えてしまえば、逆に無いと不便になりますね。


スポンサーサイト






実践講座3:知っておきたい基本

実践講座ではExcelVBAを用いてゲームを作成する上で、実際に役立つ知識を中心に解説してきました。今まではどちらかというと、技術的な部分での解説が多かったような気がします。

実践講座3では、今までちょっと置き去りにされていた、知っておくと得をする基本的なことを中心に解説していきたいと思っています。

そして、実践講座3で解説する予定の内容は、更なる高みを目指すなら、必ず通らなくてはならない部分が中心になります。基本的なことではあるのですが、どうしても曖昧に済ましてしまうことが多い部分なのです。

単なるExcelが持つ機能の活用から、一歩抜け出した領域へ到達するためには、実践講座3の内容を理解してるかどうかが重要になります。ExcelVBAが持つ可能性は、恐らく皆さんが思われているよりもはるかに広く、そして深いです。
その気になれば、DirectXを使ってガリガリの3D描画を行う事だってできるのです。ただ、それだけのことをやろうと思ったら、やはりそれなりの技術と知識と、そして経験が必要です。いきなりDirectXを使って3Dのゲームを作ろうとしたって、絶対にうまくいきません。

実践講座3の内容を全て習得したからといって、それが直接DirectXを使えるレベルに到達したとは言えませんが、将来的には必ず役に立つ知識となるはずです。
更なるVBAの高みを目指して、がんばって講座の内容を理解していってください。



    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.69 [ 値渡しと参照渡し ]

■VBAは何渡し?

皆さんは、値渡しと参照渡し、と言われて、それが何のことだかわかるでしょうか。

色んなところで目にはするけど、一体なんのことだかいまいちよくわからない、という人も多いのではないでしょうか。

プログラミング言語によっては、『値渡し』とか『参照渡し』という言葉自体が無いものもあります。しかし、両者の違いを理解しているかどうかは、大抵どのような言語を用いる場合にも、非常に大きな意味を持ちます。
そして、この値渡しと参照渡しを本質的に理解することは『メモリ』についての理解を深めることにつながります。
C言語などの場合には、メモリに関する知識がないとどうにもならないといった雰囲気がありますが、VBAではその辺が曖昧でも、意外とプログラムが組めてしまいます。

値渡しと参照渡しを理解したからといって、必ずしもメモリに関することが全て理解できたとは言えないのですが、それでも、知っているかいないかの違いは大きいです。がんばって覚えてしまいましょう。


それでは早速、値渡しと参照渡しの違いについて考えてみましょう。

まず、次のようなプログラムがあったとします。

Sub sProc(N As Integer)

    N = N + 100

End Sub

なんとも簡易なプログラムですね。その構造は非常に単純です。

このsProcというプロシージャは、整数型の引数をひとつ受け取り、そこに100を足し算するだけのプロシージャです。なんとも単純ですね。

それでは別のプロシージャから、このsProcを呼び出してみることにします。

Sub main()

    Dim Number As Integer
    
    Number = 0
    
    Call sProc(Number)
    
    MsgBox Number
    
End Sub

このmainというプロシージャの最後で呼び出されているメッセージボックスで、どのような値が表示されるか、想像ができますか?

即答できた人は中々優秀です。
このケースでは、『 100 』というメッセージが出るはずですね。

先ほどのコードでは、Callを使ってsProcを呼び出しています。当然、引数は括弧でくくった状態で、sProcに渡しています。


さて、それでは、もしも次のようにコードを書き換えたら、一体どのようなメッセージが表示されるでしょうか。

Sub main()

    Dim Number As Integer
    
    Number = 0
    
    sProc(Number) 'Call をつけずに呼び出す
    
    MsgBox Number
    
End Sub

これも即答できたという人は、基礎がそこそこしっかりできている証拠です。

この場合には、メッセージは『 0 』が表示されます。
同じプロシージャを呼び出しているだけなのに、Callを使ったかどうかで、結果は全く違ったものになります。一体なぜこのようなことが起きるのでしょうか。

実は、これこそが値渡しと参照渡しの違いなのです。


■なぜ結果が変わったのか

VBAでは、プロシージャ間で引数を用いて変数の受け渡しをする際に、原則として参照渡しでデータをやり取りします。前者の例がこれにあたります。

参照渡しを考える場合には、変数をやり取りする際に住所をやり取りしていると考えるとわかりやすいと思います。
今回の例で言えば、引数に渡す変数として使われているのはNumberという変数ですね。これが参照渡しでsProcに渡されています。

このとき、sProc側が受け取っているのは、実は変数の存在する住所(場所)なのです。
住所を受け取ったsProcは、変数がどこに住んでいるのかを知ることができます。ですから、その場所に100を足し算する、という処理を行うことができるのですね。


これに対して、後者では、値渡しで引数が渡されています。
値渡しでは、その名が示す通り、値だけがデータとして渡されます。この場合は、sProcが変数の住所を知ることができません。sProcが受け取るのは、そのときの変数Numberの値、つまり『 0 』という値だけなのです。

受け取った値に100を足し算しても、変数Numberには何の影響もありません。なぜなら、変数Numberがどこに住んでいるのかなんてsProcにはわからないからです。住んでいる場所がわからないのに、そこに変更を加えることはできないのです。

ですから、後者の例では、メッセージとして『 0 』が表示されたわけです。変数Numberには、このとき何の作用も起きていなかったというわけです。


ここで言う住所とは、すなわちメモリのどこにデータが存在するか、ということとイコールです。実際にパソコンの中では、広大なメモリの畑の中で、どこにどのようなデータを置いておくかということが厳密に管理されています。
参照渡しの場合には、そのデータが存在する場所という情報が渡されます。これに対して値渡しでは、その場所にどんなデータがあるかという情報だけがコピーされ、コピーされたデータが渡されています。

この違いは、一見するとわかりにくいかもしれませんが、じつはかなり重要なのです。


■ Call と括弧と引数の微妙な三角関係

VBAでは、プロシージャの呼び出しを行う際に、値渡しをするのか参照渡しをするのかは、プロシージャの呼び出し方などによって変わってきます。

そして、ここに影響するのが、『 Call 』、『 括弧 』、『 引数 』の3つの要素です。

まずはCallから見てみましょう。

Callを使う場合のルール

Callを使う場合、引数を括弧でくくらなくてはいけない
Callを使った場合、原則として参照渡しとなる

Callステートメントは、実は使わなくてもプロシージャを呼び出すことができます。(これについては後で詳しく説明します)
ただし、Callステートメントを使う場合には、絶対に引数を括弧でくくらなくてはいけません。

そして、プロシージャを呼び出す際に、絶対にCallステートメントを使わなくてはいけない、ということはありません。例えば、次のコードはどちらも全く同じように解釈できます。

① Call sProc(Number)

② sProc Number

Callステートメントを使わずにプロシージャを呼び出しているのが②ですね。プロシージャ名に続けて半角スペースを打ち、そのまま引数を指定します。この場合には、引数はVBAの原則どおり参照渡しでやり取りされます。


次に括弧についてです。

■括弧が引数に与える影響

Callなしで括弧を使うと値渡しになる
・戻り値が必要な場合は括弧を使わなくてはいけない

プロシージャを呼び出す際に、括弧を使うかどうかで引数を渡す形式が変わります。

Callを使わずにプロシージャを呼び出すとき、括弧で引数をくくった場合には値渡しになります。先ほどメッセージで『 0 』が表示されてしまったときが、まさしくこれですね。

そしてもうひとつ重要なのが、戻り値が必要な場合には、引数を括弧でくくらなくてはいけないというVBAの仕様です。
例えば、次のようなコードは間違いです。

間違っている例
    L = Int 1.234

この場合、恐らく変数 L には、Int 関数によって小数点を切り捨てた数値が入ってほしいはずです。しかし、先ほども書いたように、戻り値が必要な場合には関数の呼び出しに括弧をつけなくてはいけません。自動構文チェックが有効になっている場合にはエラーが発生して、コードが赤くなってしまうはずです。

390.gif

これを、エラーが起きないように正しく書き直すと次のようになります。

正しい記述の例
    L = Int(1.234)

こうすれば、キチンと変数 L に Int 関数が返す戻り値が入るようになります。当然、構文エラーも起きません。


そしてデータの渡し方に影響する最後の要素として、引数があります。

例えば、次のようなファンクションプロシージャがあるとします。

Function SumValue(valueA As Long, valueB As Long) As Long

    valueA = valueA + valueB
    
    SumValue = valueA
    
End Function

この SumValue というプロシージャは、引数をふたつ受け取り、その合計値を返してくれるだけという、全く使い道のないプロシージャです。

このプロシージャの中では、引数として受け取ったデータをそのまま計算に使っていますね。

valueA = valueA + valueB

ここです。

このようなコードでは、参照渡しでデータを受け取った場合には、元となっているデータのほうも書き換えてしまいます。つまり、第一引数 valueA に渡された変数のデータを一緒に書き換えてしまうということです。

L = SumValue(変数A , 変数B)

このように呼び出した場合には、変数 A が書き換えられてしまうわけです。

変数 A が、参照渡しされたことによって書き換えられてしまうと、その後の処理に影響が出てしまうかもしれません。後から変数 A を使ったときに、予期せぬ数値が入っていて計算がおかしくなるというのは容易に想像がつきます。

そこで、このような場合などでは、引数の受け取りを行うプロシージャ側で値渡しを明確にしておくことができます。そのためには、引数の宣言時に『 ByVal 』というキーワードを使います。

Function SumValue(ByVal valueA As Long, ByVal valueB As Long) As Long

    valueA = valueA + valueB
    
    SumValue = valueA
    
End Function

このように引数を宣言しておけば、自動的に値渡しでデータが引き渡されます。よって、先ほどのように変数 A が勝手に書き換えられてしまうことはなくなります。

このように、引数のデータを書き換えてしまう可能性がある場合には、受け取る側のほうで、引数を値渡しで受け取るように明示しておくべきでしょう。こうすることで、予期せぬエラーや、思わぬ不具合を事前に回避することができるのですね。


■まとめ

さて、結構長い文章でしたが、皆さんついてこれているでしょうか。

値渡しと参照渡しは、あまり理解していなくてもとりあえずコードを書いていくことができてしまうため、意外と認知度が低いと思います。

これは、VBAが非常に親切、というか、難しいことをそれほど知らなくてもプログラムが組めるように作られているためです。多くの言語では、このようなメモリの参照に関わることは非常に重要視され、その理解度によって習熟度を判断することも多いのです。
しかしVBAが非常に親切なつくりになっているがために、我々はそのことをあまり意識しなくても、それなりにコードを記述していくことができてしまいます。

メモリの話はとりあえず置いておくとしても、値渡しと参照渡しの違いについては理解しておいたほうがいいでしょう。APIを使う場合にも、この渡し方の違いが重要になるケースは多いです。
いまいちピンとこない人もいるかもしれませんが、動作に違いが出るのはどんな場合でも困った問題を引き起こしますから、ゆっくり確実に理解していってみてください。



■格言

VBAでは原則参照渡しとなる
参照渡しはメモリの住所を渡す
値渡しはデータのコピーを渡す
ByValを使って値渡しを明示できる


あまり気にしすぎる必要はないですが、不具合が起きたときなどにこれらの知識が重要になることがありますね。







Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]

■効率的な開発

プログラムに潜む不具合や欠陥を、英語で『 BUG 』、つまりバグと呼びます。

バグとは何か、と言われると明確な定義は無いのが現状のようです。人によって解釈が異なるものだと思いますし。まぁ大抵は、システムやプログラムに、誤って混入してしまった不具合や欠陥のことを言います。

単純に解釈すると、要するに『開発者の不手際』こそがバグだと言えるでしょう。
そして、それらの不具合や欠陥を見つけ出し、修正する作業のことを『デバッグ』といいます。プログラミングにデバッグ作業は付き物です。未来永劫、常にバグと戦い続けるのがプログラマーの宿命です。どんなに優れたプログラマーであっても、バグと無縁という人はきっといないでしょう。

開発段階でバグが見つかった場合は、当然それを修正することになります。修正するべき箇所が明確になっているか、あるいは原因が明らかな場合は、修正するのも容易です。
しかし、『原因が不明』であったり『どこでおかしくなっているかわからない』といった場合には面倒なことになります。

今回の講座からは、デバッグに関して少しやりたいと思います。

デバッグを効率よく行う方法がVBAにはキチンと用意されています。そして、それを知っているかいないかで、開発効率に天と地ほどの差が生まれます。

残念ながら、バグは常に発生するものです。それをいかに上手にさばいていくのか、それこそが優れたプログラマーであるかどうかのひとつの指標になるでしょう。同じバグに直面したとき、その原因をいち早く察知して素早く修正できる人と、原因がわからずに四苦八苦する人の差は歴然です。

今回の講座を通して、効率的なデバッグを是非習得してくださいね。


■イミディエイトウィンドウ

まず始めにご紹介したいのは『イミディエイトウィンドウ』です。

イミディエイトウィンドウを使うと、変数の状態を調べたり、簡単なプログラムを実行してテストしてみたりすることができます。非常に便利なツールです。私はこれがないと開発ができません。

さて、肝心のイミディエイトウィンドウですが、VBEのメニューから、『表示』⇒『イミディエイトウィンドウ』の順にクリックしていくと表示することができます。

400.gif

最初にイミディエイトウィンドウを表示したときには、真っ白な空間が現れるだけで、特に何も記載されていないはずです。イミディエイトウィンドウを活用すると、この場所にデータを出力して変数の中身を調べたり、関数やプロシージャを実行させてテストしてみたりすることができます。

それでは早速具体的な使い方を見ていきましょう。


■関数やプロシージャを実行する

イミディエイトウィンドウを使って、関数やプロシージャを実行してテストすることができます。例を挙げて見てみます。

例えば、現在の時刻を取得することができる関数に、 Now 関数があります。この関数を使うと、現在の日付や時刻を簡単に取得することができます。

Sub GetNow()

    MsgBox Now

End Sub

このプロシージャを実行すると、現在の日付と時刻がメッセージとして表示されます。

401.gif

しかし、現在の日付や時刻を調べるために、いちいちメッセージボックスを表示させるのは非効率です。ちょっと結果を調べたい、こんなとき、イミディエイトウィンドウが役に立ちます。

それではイミディエイトウィンドウに次のように記述して、エンターキーを押してみましょう。

402.gif

    ▼

403.gif

このように、イミディエイトウィンドウを使うと、簡単に結果を知ることができます。

もうひとつ例を挙げてみましょう。

VBAの関数に、文字列の長さを調べる関数として『 Len 関数 』があります。この関数に文字列を渡すと、その文字数を数えて教えてくれます。これをイミディエイトウィンドウを使って試してみましょう。

404.gif

    ▼

405.gif

どうですか? 簡単ですね。

イミディエイトウィンドウに、『 ? 』マークに続けて関数やプロシージャを記述し、呼び出すことができるのですね。これなら簡単なテストを行うたびに、いちいちメッセージを表示させる必要はありません。

また、? マークは変数の中身を調べるのにも使うことができます。何らかのエラーが起きてコードが停止してしまったときなど、変数の中身が知りたいときは結構あります。そんなときにイミディエイトウィンドウを活用すると原因がわかることもあります。

406.gif

    ▼

406+.gif


■結果を出力するのに使う

イミディエイトウィンドウには、コードの実行中に様々なデータを出力することができます。コードが実行されている間、どのように計算結果が変化しているかを調べたり、変数の状態を逐一把握したりするのに役立ちます。

例えば次のようなコードを実行すると、どのようになるでしょうか。

Sub DebugTest()

    Dim myString(2)
    Dim L As Long
    
    myString(0) = "影斬"
    myString(1) = "eizan"
    myString(2) = "Shadow-Slash"
    
    For L = 0 To 2
        Debug.Print myString(L)
    Next
    
End Sub

このプロシージャを実行すると、イミディエイトウィンドウは次のような感じになったはずです。

407.gif

Debug.Print に続けて半角スペースを打ち、イミディエイトウィンドウに出力したいデータを指定します。こうすることで、変数や計算結果がどのようになっているのか知ることができるのです。

同様に、次のようなコードを実行するとどうなるのでしょうか。

Sub DebugTest()

    Dim myString(2)
    Dim L As Long
    
    myString(0) = "影斬"
    myString(1) = "eizan"
    myString(2) = "Shadow-Slash"
    
    For L = 0 To 2
        Debug.Print Len(myString(L))
    Next
    
End Sub

今度は先ほどとは違い、文字列の長さを出力するように変更しました。イミディエイトウィンドウには次のように出力されているはずです。

408.gif



■まとめ

イミディエイトウィンドウの主な使い方は、なんとなく理解できたでしょうか。

? マークを利用して、リアルタイムに状態を調べたり、あるいは、コードの実行中に変数の中身を出力したりでき、ちょっとしたテストや調査にはうってつけのツールです。
他にも、『 ? 100 * 100 』このように記述してエンターキーを押せば、すぐに結果を計算してくれます。電卓がわりにちょっとした計算もしてくれるというわけです。

開発段階では、様々な動作テストや、バグの修正が発生しますが、原因を特定したりする際にイミディエイトウィンドウが活躍するシーンは結構あります。イミディエイトウィンドウを有効に活用して、効率的に開発を行ってみてください。


■格言

イミディエイトウィンドウを使うと、
関数の結果や変数の状態を知ることができる
簡単な計算もできる


私の開発には必須のツールです。








Chapter.71 [ デバッグ2:ローカルウィンドウ ]

■ローカルウィンドウ

前回は、イミディエイトウィンドウについて解説しました。

イミディエイトウィンドウは非常に便利なツールで、デバッグだけでなく、ちょっとしたテストや調査に大活躍してくれます。

今回は、ローカルウィンドウについて解説したいと思います。
ローカルウィンドウは、イミディエイトウィンドウよりも、デバッグツールとしての色あいが強いツールです。ローカルウィンドウを有効に活用することで、エラーやバグの本質を探ることができます。これにより、いち早く問題を解決することができるようになるでしょう。

使い方も特に難しいものではありません。ローカルウィンドウの利用法を覚えて、効率的なデバッグが行えるようになってくださいね。


それでは早速、ローカルウィンドウを表示させましょう。
イミディエイトウィンドウのときと同じように、VBEのメニューから、『表示』⇒『ローカルウィンドウ』の順番に選択していきます。

410.gif

ローカルウィンドウも、表示されたばかりのときは何もない真っ白な状態だと思います。
ローカルウィンドウがその真価を発揮するのは、コードが実行されてからです。


■ステップ実行

ローカルウィンドウの使い方を説明する前に、まず『ステップ実行』について解説します。ステップ実行を使ったほうが、ローカルウィンドウの凄さがよくわかると思うので、面倒ですが、先にステップ実行を覚えてしまいましょう。


通常はコードを実行すると、途中でエラーが起きるか、プロシージャの動作が完了するまで、コードは止まることなく一気に処理が進みます。
そして、エラーが起きるなどして、コードが止まってしまったときは、次の画像で示すように、コードに矢印と色が付きます(既定では黄色)。

411.gif

この状態は、コードの実行が一時的に中断されている状態です。色の付いているコードは、次に実行されるコードですので、注意しましょう。色つきの部分の、一行上までは実行されたということですね。

さて、この中断の状態から再びコードを実行すると、問題がなければ今まで同様、全ての処理が一気に行われます。

しかし、エラーが起きてしまってコードが中断してしまった場合などでは、一行ごとに動作を確かめながら、すこしずつコードを実行したい時もあるでしょう。

そんなときに役に立つのがステップ実行です。

ステップ実行を使えば、コードを一気に実行してしまうのではなく、一行ずつ実行していくことができます。やり方も簡単で、ファンクションキーの『 F8 』を押すだけです。 F8 キーを押すごとに、一行ずつコードが実行されるので、ゆっくり動作を確認しながら進めていくことができます。


■ステップ実行 + ローカルウィンドウ

さて、ステップ実行については理解できましたでしょうか。

ステップ実行は、それ単体でも非常に使えるテクニックですが、ここにローカルウィンドウを加えると、さらに大きな効果を得ることができます。
簡単な例を挙げながら考えてみましょう。

まずは次のようにコードを記述してみます。

Sub DebugTest()

    Dim L As Long
    Dim C As Long
    
    For L = 0 To 10
    
        C = L * L
    
    Next
    
End Sub

変数 L を使って、0~10までの繰り返し処理を行います。そして、変数 C にはそのときの変数 L の二乗が入る仕組みです。簡単ですね。

それでは、ローカルウィンドウが表示された状態で、このコードを実行してみたいと思います。

た・だ・し、普通にコードを実行してしまっては面白くありません。ステップ実行でやってみましょう。

ステップ実行するには F8 でしたね。
コードがまだ実行されていない状態で、ファンクションキーの F8 キーを押してみましょう。

412.gif

うまくいきましたか?
ここから先、F8 キーを押すたびにコードが一行ずつ実行されていきます。

そして、ここで注目すべきはローカルウィンドウです。コードのステップ実行がうまくいっていれば、次のような感じになっているはずです。

412+.gif

先ほどまでは空白だったローカルウィンドウに、現在実行中のプロシージャに含まれている変数の情報が表示されています。変数 L と、変数 C がそれです。

412++.gif

Long型で宣言された変数の初期値は 0 です。ですからこの段階では、どちらの変数も値は 0 が入っているのです。ローカルウィンドウにも、その状況が確かに表示されていますね。

それでは、引き続き F8 でステップ実行を進めていきましょう。するとどうですか、変数 L や変数 C の値が、コードの実行に合わせて変化していくのがよくわかりますね。

413.gif

このように、ステップ実行とローカルウィンドウを併用すると、コード実行中の変数などの状態を、リアルタイムに観察することができます。

ゲームのような複雑な処理の最中には、特殊な計算や、わかりにくい処理が発生することが多くあります。このようなときには、得てして思ったとおりに結果が出ないものです。ローカルウィンドウに表示される値をチェックしながら、地道にステップ実行しながら変数を観察すれば、大抵の問題は発見することができます。

あぁ、この瞬間におかしくなっていたのか!

と、バグの原因を発見することができるでしょう。この感動は結構刺激的ですよ。


■まとめ

ローカルウィンドウには、実行中のプロシージャに含まれている変数の情報がリアルタイムに表示されます。ここにステップ実行を加えると、変数の中に入っているデータの移り変わりさえも、逐一把握することができるのです。これは非常に強力な機能だと言えます。

前回ご紹介したイミディエイトウィンドウでも、変数の中身を知ることはできます。しかし、コードを進めるたびにイミディエイトウィンドウを使って調べるのは、ちょっと手間がかかります。ローカルウィンドウがあれば、そんな手間も必要ありません。ただローカルウィンドウを表示しておけばいいのですからね。

イミディエイトウィンドウ、ローカルウィンドウ、そしてステップ実行。
これらの便利な機能を有効に活用して、効率の良いデバッグを行っていきましょう。

そして余談ですが、ローカルウィンドウにはさらに優れた機能があります。これはまた別の機会にご紹介したいと思います。お楽しみに……。



■格言

ローカルウィンドウを使うと、
変数などの情報をリアルタイムに観察できる
ステップ実行で一行ずつコードを実行できる


デバッグ三種の神器、ってところでしょうか。








Chapter.72 [ デバッグ3:コード実行の中断 ]

■中断する必要性って

VBAでプログラムを書いていると、様々な場面に遭遇します。
エラーが出てうまく処理できない。あるいは、バグがあるようだが原因がわからない。
などなど……。開発に伴って発生する問題を全てを書き出そうとすればキリがありません。

しかし、どのような問題が発生している場合でも、エラーが起きてしまう部分や、バグが潜んでいると思われる部分というのは、ある程度推測できることが多いです。

ここが怪しいんだよね、とか、ここでエラーが起きてしまうんだよね、とか、ある程度は不具合が起きている箇所を特定できるのが普通です。
これは言い換えると、『 特定の怪しい箇所までは、とりあえず動いている 』という事でもありますね。

それなりに大きなプログラムになると、怪しい部分まで地道にステップ実行していく、というわけにもいきません。かといって、意図的にエラーを起こしてコードを止める、というのも無理があります。

そこで、VBAにはコードをいったん中断させる方法がいくつか用意されています。

確実にここまでは正しく動いているから、怪しいのはここだ! というときや、とりあえずここまでは一気に進めて、あとはステップ実行でチェック、というときなど、今回紹介する方法を活用してみてください。


■中断技その1:ブレークポイント

VBEのコードペイン(コードを記述するところ)にある、左側の余白部分を、インジケータバーと呼びます。

この、インジケータバーの任意の箇所をクリックすると、その部分に茶色い丸マークがつき、コードの色が変わります。

420.gif

このように、インジケータバーを使って、コードにチェックを入れることをブレークポイントを設定するといいます。

ブレークポイントは、一種のストッパーのような役割を果たします。

ブレークポイントとして設定されたコードの部分に、プログラムの実行が差し掛かると、エラーが起きているかどうかに関わらず、必ずプログラムの実行が止まります。これは絶対です。

ただし、注意が必要なのは次のようなケースです。

421.gif

この場合、ブレークポイントが設定されている部分は、 If 文の条件分岐次第では実行されない可能性がありますね。

もし、変数 L に取得した数値が 5 以下だった場合には、ブレークポイントの部分は実行されないことになります。このようなケースでは、ブレークポイントによるコードの中断は起きず、プロシージャはそのまま終わってしまいます。

ブレークポイントは、あくまでも実行の対象となったときのみ、コードを中断させるということを覚えておきましょう。

それともうひとつ、ブレークポイントは保存の対象にはなりません。一度Excelを終了してしまうと、設定されていたブレークポイントの情報は消えてしまいます。あとから同じ部分を中断箇所に設定する可能性がある場合には、次に紹介する Stop ステートメントを使いましょう。


■中断技その2:Stop ステートメント

Stop ステートメントは、非常に手軽に利用できる中断技のひとつです。でもまぁ、ブレークポイントを知っていれば、デバッグにはあまり登場する機会が少ないかもしれません。

Stop ステートメントはその名の通り、コードの実行を中断させます。ブレークポイントと同じように、自分( Stop ステートメント自身)が実行されそうになったときになって始めて、その効果を発揮します。

例えば、次のようなコードを実行すると、その日の日付が、16日以降だった場合のみ Stop ステートメントの効果でプログラムの実行が中断されます。

Sub StopTest()

    Dim L As Long
    
    L = 0
    
    L = Day(Now)
    
    If L > 15 Then
    
        Stop
        
    End If
    
End Sub

上記のコードについて簡単に補足します。
Day 関数は、現在の日付を含むデータを引数に渡すと、日付の部分だけを抜き出して返してくれる関数です。
引数に Now 関数をそのまま渡しているので、コードが実行されている当日の日付部分だけが抜き出され、変数 L に入るという仕組みになっています。

先ほどもブレークポイントのところで触れましたが、ブレークポイントはファイルを保存しても記録として中断箇所の情報が残りません。これに対して Stop ステートメントは直接コードとして記述されるので、キチンと保存されて残ります。いったんファイルを閉じ、あとから引き続き同じ場所を中断の対象としておきたい場合は、 Stop ステートメントを使ったほうが便利です。


■中断技その3:Debug オブジェクトを使う

イミディエイトウィンドウの解説を行った際に、 Debug.Print というコードが出てきたのを覚えていますか?

じつはこの Debug には別の使い方もあるのです。それがコードの中断という使い方です。

Debug に続けてピリオドを打ち、『 Assert 』と記述します。さらに、半角スペースを空けて、コードの実行を中断するかどうかを Boolean 型のデータを使って指定します。

コードの実行を中断する場合は、『 False 』を、中断しない場合は『 True 』を指定します。

もちろん直接指定してもいいですし、Boolean 型の変数などで指定しても構いません。

コードが止まる場合
    Debug.Assert False

コードが止まらない場合
    Debug.Assert True

仕組みとしては、ブレークポイントや Stop ステートメントと同じように使えます。Boolean 型で中断するかどうかを指定するときには便利ですね。


■中断技その4:ウォッチウィンドウ

ウォッチウィンドウは、一見するとローカルウィンドウと似たような動作をします。これもやはり便利なツールで、VBAに始めから搭載されています。

ウォッチウィンドウは、ウォッチ、という言葉が示すように、コード実行中の変数の状態などをリアルタイムに観察することができるツールです。
しかし、変数の状態を観察することは、ローカルウィンドウでもできましたよね。ではウォッチウィンドウ独自の機能とは一体なんでしょうか。

ウォッチウィンドウは、あらかじめ条件を指定しておくことで、『条件が満たされた場合だけコードを中断させる』という荒業をやってのけます。考えてみるとこれは相当便利ですね。

例えば、ロールプレイングゲームを作っているとしましょう。そのゲームでは、主人公のヒットポイントが 10 より少なくなると、超強力な技を発動できるというシステムになっているとします。

しかし、これがどうにもうまくいかない。何とか最低限の動作はしているように見えるが、実行中の変数の状態などはどうなっているのだろうか? ヒットポイントが 10 より小さくなったときだけ、コードが中断できればいいのに……

ほら! こんなときこそウォッチウィンドウの出番です。


まずはウォッチウィンドウを表示させます。ローカルウィンドウや、イミディエイトウィンドウと同じように、VBEの表示メニューから表示させることができます。

422.gif

    ▼

423.gif

表示させることができたら、次にVBEのメニューにある『デバッグ』を選択してみます。すると、その中に『ウォッチ式の追加』というメニューがありますね。これを選択しましょう。

424.gif

    ▼

425.gif

うまくダイアログを表示できましたか?

このダイアログを見ると、色々なことが書いてあって、ちょっと混乱するかもしれませんね。

今回はコードの中断について解説しているので、とりあえず『式が True のときに中断』を選択しておきましょう。

426.gif

この状態で、次にコードの実行を中断する場合の条件を指定します。

例えば、先ほどのロールプレイングゲームの話を例に取ると、主人公のヒットポイントが、10 より小さくなったとき、コードの実行を中断したいんでしたね。そこで、主人公のヒットポイントが『 HP 』という名前の変数で管理されていると仮定して、条件を指定してみましょう。

変数 HP の値が 10 より小さくなったらコードの実行を中断する
427.gif

上記のように、条件を入れておき、OKボタンを押します。

ウォッチ式が正しく設定できたら、実際にコードを実行して動作確認します。
すると、変数 HP の値が 10 より小さくなったとき(つまり 9 以下になったとき)に、自動的にコードが中断されるようになります。

このように、ウォッチウィンドウを使うと、ある特定の場合だけ、コードを中断するというテクニックが使えるようになります。ある程度エラーや不具合の原因がハッキリしている場合などには、ウォッチウィンドウを有効に利用することによって、完璧なタイミングでコードを中断させることができるわけですね。


■まとめ

さて、様々な中断に関するテクニックを解説しましたが、どうでしたでしょうか。

ひとくちに中断するといっても、いろいろな方法がありましたね。なかには、一見するとほとんど同じ動作をするものもあり、なぜこのような複数の中断方法があるのか不思議に感じた方もいるかもしれません。

EXE 形式(実行可能ファイル)を生成できる本家VBでは、中断の方法によって、動作が異なる場合があります。そのため、ある程度しっかり使い方を区別する必要があるのですが、VBAでは、それほど気にする必要はありません。

VBAは、VB (Visual Basic) から派生した言語です。単体で実行可能な EXE 形式のファイルを作ることはできませんので、基本的にはデバッグ段階で、様々な中断方法を活用することになります。

自分が実現したい動作に合わせて、ブレークポイントや Stop ステートメント、そしてウォッチウィンドウを活用していきましょう。



■格言

様々な方法でコードを中断できる
ケースバイケースで適切な方法を選ぶ


手軽なのはブレークポイントですかね。








Chapter.73 [ オブジェクトってなんだ ]

■オブジェクトに関する前置き

前回まで、3回にわたってデバッグに関するテクニックを解説しました。知っているのといないのとでは、開発に掛かる労力がまるで変わってきます。

必須のテクニックではないだけに、あまり知られていない便利な機能などもあったりしますので、何かの参考になったとしたらうれしいのですが。


さて、今回のテーマは『オブジェクト』です。内容としては少し難しい話になるかと思います。プログラミングでオブジェクトと言うと、『オブジェクト指向』とか、『オブジェクトとクラス』とか、何かと難しいイメージがあるのではないかと思います。

当講座は、初心者でもわかるように、理屈よりもわかりやすさを重視しています。本当はパソコンの中で何が起こっているのか、知っていたほうが良いこともあるのは確かです。
しかし、ゲームの作成に限らず、プログラミングという作業は得てして単調で、挫折を伴いやすい分野です。それだけに、まずは『できた! という新鮮な感動』、であったり『思い通りに動作した! という達成感』であったり、とにかく自分自身が納得のいく成果がなくてはいけないのだと私は思っています。

パソコンの最深部で行われている難しい理屈より、こうして理解すれば簡単だ! という成果の上がりやすい情報を、皆さんにお届けしたいと考えて、いつもテキストを書いています。ですから、今回の講座の内容も、わかりやすさ重視です。

本当はこうなっているのだよ、という意見を持たれる方もいるかもしれませんし、実際私の認識が間違っていることもあるかもしれません。そんなときは、こっそりメールフォームなどから教えてやってください。

なんだか始めから言い訳みたいになってしまいましたが、頭をやわらかくして、オブジェクトについて考えてみましょう。


■オブジェクトの何たるか

そもそも、プログラミングにおけるオブジェクトって、一体何なのでしょうか。

オブジェクト(object)をそのまま直訳すると、『物・物体』となります。

私達の生きている現実世界では、全てのモノは目で見ることができ、また、触れることができますね。目で見たり、触ったり、そういったことを五感で感じたとき、我々はそこにモノがあると認識することができます。これが現実世界でのオブジェクトです。

それでは、プログラミングにおけるオブジェクトはどうでしょうか。

プログラミングは当然パソコンを使って行う作業です。
パソコンは、それ本体は現実世界でいうオブジェクトですが、その中身は、電子的なデータの集合に過ぎません。
人間がその電子的な情報を、直接その目で見ることはできませんし(ディスプレイを介してしか見ることができない)、当然ですが触れることもできません。パソコンの中では何かしらの意味を持つデータであっても、それを人は直接理解したり、または、直接操作したりはできないのですね。電気を操るミュータントじゃあるまいし、パソコンの中を覗いてそこにどんな電子情報が蓄積されているのか、わかる人なんていないのです。

では、その目には見えない電子情報を、目に見える形に変えてくれるのは誰でしょうか。

これは、OSと呼ばれるプログラムの仕事です。Windows や Mac などが知られていますね。
OS(オペレーティングシステム)は、パソコンの中にある電子データの集合を解析し、それを目に見える情報としてディスプレイに映し出してくれます。我々が今、インターネットを楽しんだりゲームを楽しんだりできるのは、OSがせっせと働いてくれているおかげなのです。

このように、皆さんが今、パソコンを使って様々なことを実現できるのは、目に見えない電子データの集合から、目に見える画像や映像へとOSがデータを変換してくれるおかげです。

そして、もうひとつ重要なのが、今回のテーマである『オブジェクト』です。


例えば、皆さんは次のように促されたらどうしますか?

開いているウィンドウをとじてください。

きっと、迷うことなくウィンドウを閉じることができる方がほとんどでしょう。

では次のように促されたらどうですか?

ボタンを押して次に進んでください。

きっと表示されているボタンを押しますよね。


さぁ、考えてみてください。

皆さんが、ウィンドウを閉じたり、あるいはボタンを押したりできるのはどうしてですか? 

……なんか少し変な質問に聞こえますね。頭がおかしい人だと思われてしまいそうです。
しかしこの質問の意味を理解することこそ、オブジェクトを理解することへの第一歩となるのです。


なぜウィンドウを閉じれるのか? それは、ウィンドウがどういう見た目のモノで、どういう動作をするモノなのか、それを皆さんがあらかじめ知っているからですよね。
本来であれば電子的なデータの集合に過ぎない情報が、ウィンドウというモノとして存在しているからこそ、ウィンドウを閉じるなどの操作を行うことができるわけです。

ボタンの場合も同じですね。
ボタンがどのような形をしているモノなのか、皆さんは知っているはずです。そして、もしボタンがどのようなモノなのか知らなければ、それを押すことはできないはずです。


本当は、パソコンの中にあるのは単なる電子的な情報です。しかし、それを目に見えるモノとして扱うことで、私達はそれを直感的に理解し、操作することができるようになります。

ウィンドウというモノ、ボタンというモノ、視覚的に捉えることができ、そして何らかの操作を受け付けるモノ……。これこそがオブジェクトなのです。


■ちょっと精査してみる

なんとなくオブジェクトが見えてきましたか?

要するにオブジェクトとは、人間が直感的に理解したり操作したりできるように、実際には単なるデータに過ぎない情報を、目に見える形に変換したものだと考えることができます。

DOS のような、文字だけで操作するOSが主流の頃には、ある程度の知識がないとパソコンを使いこなすことができませんでした。真っ黒な画面に、数字や英語の羅列が並んでいるのを見て、誰もがそれを理解できるわけではなかったのです。
しかも、何かの動作を要求するには、コマンドを入力して送ってやる必要がありました。コマンドを知らない人にとっては、ファイルをコピーしたり移動したりすることさえ難しかったのです。

しかし、今はウィンドウズなどのグラフィカルにデータを扱うことができるOSが主流となり、多くの人がパソコンを通じて様々なことを実現できるようになりましたね。様々なデータを目に見えるモノとして扱うことによって、文字だけの頃に比べて格段にわかりやすくなったのですね。
ファイルを移動するのなんて、マウスを使ってドラッグアンドドロップするだけですから、その簡単さとわかりやすさは以前と比べて飛躍的に進歩したわけです。


こうなってくると、必然的に我々はオブジェクトを使ってプログラミングしていかなくてはいけませんね。でもこれは既にこの講座で何度もやっています。皆さんは既に経験済みなのです。

ユーザーフォームというモノを使ってゲームを作ろう

    ▼

ユーザーフォームにボタンというモノを配置しよう

    ▼

イメージコントロールというモノを使って画像を表示しよう

どうですか。オブジェクトを使ってプログラミングしているのがわかりますね。

今まで、私が講座の中で、『コマンドボタンを配置しましょう』などと書いたことがありましたが、これは正確には『コマンドボタンオブジェクトを配置しましょう』だったわけです。


■プログラミング的視点で見るオブジェクト

それでは、オブジェクトについて大筋で理解できたところで、実際のプログラミングではオブジェクトをどのように扱っていけばいいのか、考えてみましょう。

まず知らなくてはならないのは、『オブジェクトの定義とは何か』ですね。

ためしに、VBAのヘルプにはどのように書かれているのか見に行ってみました。

オブジェクトは、ワークシート、セル、グラフ、フォーム、レポートなど、アプリケーションの要素を表します。Visual Basic コードでは、オブジェクトのメソッドの 1 つを使ったり、プロパティのいずれかの値を変更する前に、対象となるオブジェクトを識別する必要があります。

これを見て、オブジェクトが何なのか理解できる人がどのくらいいるでしょうか。少なくとも、初心者の頃の私には理解できなかったでしょうね。

しかし、まぁオブジェクトが何かということになると、上記の説明が間違っているわけではありません。わかりにくいだけで。


オブジェクトは、上記の解説にもあるとおり、アプリケーションを構築する要素のことを言います。ここで言うアプリケーションとは、スバリ Excel そのものを指します。

アプリケーション( Excel )を構築する要素と言えば、いろんなものが思いつきます。

・Excel ブック
・ブックのワークシート
・ワークシートのセル
・グラフ(グラフシート)
・図形(オートシェイプ)
・ウィンドウ
・メニューバーやツールバー
・ユーザーフォーム
・フォーム上のコントロール各種

などなど……。

とにかく沢山のモノが集まって、Excel というひとつのアプリケーションが成り立っているということがわかります。Excel でのオブジェクトとは、上で挙げたような、アプリケーションを構築する要素のことを指すわけです。

例えばブックであれば、『 Workbook オブジェクト 』です。同様に、ワークシートであれば『 Worksheet オブジェクト 』ですね。
セルを表すオブジェクトなら『 Range オブジェクト 』ですし、オートシェイプを表すのが『 Shape オブジェクト 』です。

このように、オブジェクトは、アプリケーションに欠かせない存在であり、オブジェクトをいかに扱っていくかによって、プログラムの完成度に大きな影響が出ることもわかるでしょう。


そして、オブジェクトの持つ特徴として非常に重要なのが、次の3つです。

・プロパティ
・メソッド
・イベント

これらの特徴や使い方をいかに理解しているか、それこそがオブジェクトの本質をどれだけ理解できているかの指標になります。

実は案外と、プロパティやメソッドというのは理解しにくい言葉だと個人的には思います。

私自身はその意味を理解するまでに、結構時間かかったほうだと思います。よくわからないまま、なんとなくプログラムを組んでいました。いろんな解説書を読んだりしましたが、結局その本質を理解できていなかったような気がしますし。

そんなわけで、次回は上記の3つの要素について、できる限りわかりやすく解説したいと思っています。ここを乗り越えられれば、オブジェクトについての理解が深まるだけでなく、確実に次のステップに進むことができるはずです。
これからも一緒にがんばって取り組んでいきましょう。


■格言

オブジェクトは単なる電子データを
人間が理解しやすくするための仕組み
Excelはたくさんのオブジェクトでできている


無理に理解しようとせず、直感的にイメージしてみてくださいね。








Chapter.74 [ プロパティ・メソッド・イベント ]

■オブジェクトが持つ特徴

前回は、オブジェクトが何であるか、また、オブジェクトとはどういう考え方のもとに成り立っているのか、それを解説しました。

大まかな概念の解説だけでしたので、なんとなくスッキリしていない人もいるかもしれません。今回は、そのあたりをもう少し煮詰めて、オブジェクトが持つ特徴を解説していきたいと思います。

オブジェクトが持つ特徴のうち、大切なのが『プロパティ』と『メソッド』です。ここに『イベント』を加えて、オブジェクトの3大特徴と考えることができます。この考え方は一般的なものということではなくて、私なりのオブジェクトの考え方です。そこらへんは注意してくださいね。多分ここ以外で『オブジェクトの3大特徴は?』とか言うと、へんな人だと思われちゃいます。

それはさておき、これらオブジェクトの特徴について、早速解説していきます。

さきほど登場したプロパティやメソッドという言葉は、VBAでプログラミングをしていれば結構よく耳にする言葉だと思います。しかし、これらの意味をしっかりと理解し、説明できる人は実はそれほど多くないのではないでしょうか。

私もプロパティやメソッドについて、キチンと理解できるまでには時間がかかりました。
実際、ちょっとわかりにくい概念のような気がしますし、できる限りわかりやすく解説したいと思います。


■プロパティ

プロパティは、直訳すると『属性』となります。

この言葉からもわかるように、プロパティとはオブジェクトの『属性』や『特徴』を表す要素です。これをわかりやすく理解するために、我々人間をオブジェクトとして捉えながら考えてみましょう。

あるところに、影斬という人間がいました。
影斬は背が高く、めがねをかけており、そして左利き。
ゲームを作ることが趣味の26歳の男、それが影斬です。

ここでは、『影斬』という『人間オブジェクト』の特徴がたくさん出てきましたね。

まず、この人間オブジェクトは『影斬という名前』です。これは立派なプロパティですね。

Dim eizan As 人間

eizan.名前 = "影斬"

そして、この影斬という人間は26歳の男で、背が高くめがねをかけており左利きです。

Dim eizan As 人間

With eizan
    .名前 = "影斬"
    .背丈 = 高い
    .めがね = True
    .利き手 = 左
    .性別 = 男
    .年齢 = 26
End With

このように、プロパティとは、オブジェクトの特徴や性質を表す要素のことを言うのです。もっとわかりやすく言えば、プロパティとは、オブジェクトがあらかじめ持っている変数のことです。

例えば、ワークシートのセルを表すオブジェクトは『 Range オブジェクト 』です。そして、このオブジェクトには『 Value 』や『 Width 』などの多彩なプロパティが備わっています。

セルに入力されている値を取得したり、あるいは設定したりしたい場合には Value プロパティを使えばいいですね。 Value プロパティは変数と同じような感覚で使えるのがわかります。

Cells(1, 1).Value = "ABC"
MsgBox Cells(1, 1).Value

上のようなコードが実行されると、『 ABC 』というメッセージが出るはずです。 Value プロパティをオブジェクトが持っている変数なのだと考えれば、それほど難しくないですよね。


■メソッド

メソッドは、直訳すると『方法・手法』などとなりますが、プログラミングに関してメソッドといえば、単にオブジェクトへの命令を指します。

メソッドを考える場合も、先ほどのように、人間に例えて考えるとわかりやすいでしょう。

例えば、『歩く』。

これは、どう考えても先ほど出てきたプロパティとは異なります。
歩く、というのは動作です。動きを伴います。このようなオブジェクトの動作や操作をメソッドと呼ぶのです。

例えば、ワークシートのセルを表す『 Range オブジェクト 』には、『 Delete 』や『 Insert 』などのメソッドが備わっています。

Delete メソッドを使えば、目的のセルを削除することができます。削除する、という動作が行われるというわけですね。同様に Insert メソッドを使うと新しくセルが挿入されます。挿入するという動作を命令することができるわけです。

Range("B2").Delete
Range("C3").Insert xlShiftDown

上記のコードが実行されると、セルの B2 が削除され、C3 の真上に新しくセルが挿入されます。

これを見てわかるように、メソッドとは、オブジェクトがあらかじめ持っている関数であることがわかります。
オブジェクトが持つ独自の関数を呼び出すことによって、セルを削除したり挿入したり、オブジェクト独自の動作を命令することができるのですね。

■補足コラム:メソッドの引数

先ほどのコードで使われている Insert には、引数が指定されていますね。

Range("C3").Insert xlShiftDown

ここで指定されている xlShiftDown は、VBAで定義されている定数です。これを Insert メソッドの引数に指定すると、挿入が行われるときセルがどの方向にずれるのかを指定できます。

引数が指定できるということからも、メソッドが関数である、ということがわかりますね。当然、メソッドの種類によって、引数を取るのかどうか、あるいは何個の引数を取るのか、そして引数を省略できるのかどうかは異なります。詳しく調べると、意外と便利な使い方ができるメソッドがたくさんあります。興味のある方は調べてみるといいでしょう。



■イベント

イベントは、一部のオブジェクトに備わっている特殊な性質です。

以前にも、イベントについては解説したことがありました。イベントとは、マウスでクリックしたり、シートを挿入したり、あるいキーが押されたり、といったユーザーの操作のことを言います。

例えば、ボタンが押されたときにプログラムが起動するようにしたければ、ボタンのクリックイベントを使います。これは何度も講座内で出てきていますので、イメージしやすいと思います。

オブジェクトの種類によって、当然用意されているイベントの種類は異なります。どのようなイベントに対して処理することができるのかは、オブジェクトのヘルプを参照するなりして調べるしかありません。

便利なイベントの例を挙げると、例えばワークシートオブジェクトのイベントに、『 SelectionChange イベント 』があります。
セレクションのチェンジ、つまり、選択されているセルが変更されたときに、このイベントが発生します。このイベントをうまく活用すれば、特定のセルしか選択できないようにする、などの処理が実現できます。

選択されているセルが変更され、SelectionChange イベントが発生したとします。このとき、選択されたくないセルをユーザーが選択しようとしていたら、選択セルを強制的に変更してしまえばいいのです。

全てのオブジェクトがイベントという概念を備えているわけではありません。しかし、イベントについてキチンと理解していることで、ユーザーの動作に対応して柔軟な処理を行うことができるのですね。


■まとめ

さて、少し難しい内容でしたが、理解できたでしょうか。文章力が足りなくて伝わっていなかったら申し訳ない。

プロパティやメソッドは、オブジェクトを理解するときには必ず出てきます。そして、プロパティやメソッドを理解していなければ、オブジェクトを理解できたとは言えません。

先ほど、人間をオブジェクトに例えて解説しましたね。私はこれが一番わかりやすい考え方だと思っています。

我々人間には、名前や身長、体重や外見など、たくさんの特徴があります。そして、それは百人百様、個人ごとに皆違っています。人間という大きなくくりで考えれば、皆同じ人間ですがその特徴は千差万別ですよね。
ワークシートのセルはたくさんありますが、そこにどんな値が入力されているか、字の色はどう設定されているか、背景色はどう設定されているかなど、特徴(プロパティ)はセルごとに違っているのです。

メソッドについても同じです。人間というオブジェクトには歩くという動作ができますが、オブジェクトの種類が違っていたら、同じ動作ができるとは限りません。
もしも、車というオブジェクトがあったら、『歩く』ではなく『走る』のはずです。

セルには挿入という動作( Insert メソッド)がありますが、コマンドボタンには挿入という動作はありません。オブジェクトが違えば、備わっているメソッドも変わるのです。


ここまで来てようやくオブジェクトの全容が見えてきます。

オブジェクトとはつまり、独自のプロパティやメソッドを持つデータのかたまりなのです。必ずしも『プロパティ・メソッド・イベント』の全てを持っているとは限りませんが、少なくともいずれかを備えていることがオブジェクトを定義する条件です。


■格言

プロパティはオブジェクトが持つ変数
メソッドはオブジェクトが持つ関数
イベントはユーザーの動作を検知する仕組み


オブジェクトを理解できていることは、他の言語でのプログラミングにも役立ちます。







Chapter.75 [ オブジェクト変数 ]

■オブジェクトと変数

プログラミングには欠かせない仕組みのひとつに、変数があります。

変数を有効に利用することで、汎用的で、また、効率的な処理が行えるようになります。本講座でも何度も登場しており、変数抜きで、プログラミングを行うのは不可能といっても過言ではありません。

しかし、『オブジェクト変数』という言葉を聞いて、すぐにどんなものか想像がつくでしょうか。

オブジェクト変数はその名の通り、オブジェクトを扱うための変数です。しかし、それがどうして必要なのか、どうして便利なのか、その辺りがよく理解されていないような気もします。

今回は、このオブジェクト変数についてやりたいと思います。


■まずはやってみる

オブジェクト変数は、オブジェクトを扱うための変数です。当然ですが、オブジェクトを必要としないプログラムでは、使い道はありません。

Excelにはたくさんのオブジェクトがあるので、VBAでプログラミングをする際には結構お世話になることも多いです。肝心なのはその使い方と使い道です。ここでは例を挙げて考えてみましょう。

選択されているセルを、オブジェクト変数に取得
    ▼
取得したオブジェクト変数を使って、セルに値をセットする

上記のような流れで、とりあえずやってみましょう。


まず、オブジェクト変数は、当たり前ですが変数です。ですから、まずはオブジェクト変数を宣言しましょう。もちろん宣言しなくてもいいのですが、宣言をしたほうがいいです。これは普通の変数と同じですね。

今回は、選択されているセルを扱うオブジェクト変数なので、セルを扱えるように型を宣言しなくてはいけませんね。ワークシート上のセルは、Range オブジェクトですから、これを扱える型でオブジェクト変数を宣言します。

Dim R As Range

これでOKです。簡単ですね。

オブジェクト変数に、どんなオブジェクトをセットしたいのか、それがハッキリしていれば上記のような宣言が可能です。もし、オブジェクトがどんな型を持つオブジェクトなのか不明な場合には、次のように宣言することもできます。

Dim Obj As Object

このような宣言を俗に『 汎用オブジェクト変数の宣言 』などといいます。『汎用』ですから、どんなオブジェクトでも対応できるという一見すると便利なしろものです。

しかし、これはあまりオススメできません。

理由は、通常の変数を思い出してもらえればわかります。普通の変数にも、どんなデータでも入れられる便利な変数の型がありましたよね。
そうです。 Variant 型です。 Variant 型の変数は、数字はもちろん、小数点以下を含む数値や文字列など、なんでも格納できる便利な型です。
しかしその反面、使い道がわかりにくくなったり、実行速度が遅くなったりするなどの悪影響も少なからず持っています。いろいろ便利に使える代償を覚悟しなくてはいけないのです。

汎用オブジェクト変数も、これと全く同じで、便利な反面、デメリットを抱えています。

当然、実行速度に悪影響を与えます。そして、この後解説する、便利なメンバ表示機能も働かなくなります。(メンバ表示については後述しますね)

プログラミングとは、曖昧なものを極力排除するべきものですから、便利だからといって、汎用オブジェクト変数を使用するのは、できる限り避けたほうがいいでしょう。


さて、ちょっと横道に逸れました。Range 型で宣言したオブジェクト変数の、実際の使い方を見てみましょう。

確認の為に、先ほどのコードをもう一度掲載します。

Dim R As Range

これだけで、ワークシートのセルを扱える、Range 型のオブジェクト変数が宣言できるのでしたね。

この段階では、変数が宣言されただけです。ですから、変数の中には、何も入っていません。空(から)の状態です。ためしに、ローカルウィンドウを表示した状態で、次のようなコードを実行してみると、よくわかります。

Sub Object_Test()

    Dim R As Range
    
    Stop
    
End Sub

このコードを実行すると、Stop ステートメントの効果で、コードの実行がストップします。

すると、ローカルウィンドウには、次のように表示されているはずです。

430.gif

オブジェクト変数 R は、Nothing となっていますね。 Nothing 、つまり『何もない』というわけです。
オブジェクト変数に Nothing が設定されているときは、何も入っていない状態を表します。宣言しただけのオブジェクト変数には、最初は何も入っていないのですね。

さてそれでは、空の状態になっているオブジェクト変数に、オブジェクトを入れてみましょう。

オブジェクトを変数に入れる場合は、次のようにします。

Sub Object_Test()

    Dim R As Range
    
    Set R = Range("A1")
    
    Stop
    
End Sub

緑の文字で表示されている部分、ここがオブジェクト変数を扱う上で、非常に重要なポイントです。

普通の変数になにか値をセットするときは、特に何も考えずに、『 = (イコール)』を使って値を代入すればよかったですね。しかし、オブジェクト変数に、何かしらのオブジェクトをセットするときには、必ず Set ステートメントを併用しなくてはいけません。これは絶対の決まりです。

これはどうしてなのか、それを厳密に説明すると非常にややこしくなるので、こういうものだと割り切って、あたまに叩き込んでしまうのがいいでしょう。

オブジェクト変数に、オブジェクトをセットするときには、必ず Set ステートメントを併用すること。


Set ステートメントを使って、オブジェクト変数にオブジェクトがセットされると、変数 R は、キチンとオブジェクトとしての実体を持つようになります。
これを確かめるために、先ほどのコードを実行してみることにしましょう。

431.gif

先ほどとは違い、Nothing がついていませんね。そして、型の項目に、Range と書かれています。さっきまでは Nothing でしたが、今は何かが入っていることになっているわけです。

先ほどのコードでは、変数 R に、ワークシートのセルA1 をセットしていましたよね。

Set R = Range("A1")

ですからこの変数 R は、ワークシートのセルA1 そのものを表すオブジェクト変数になっています。どういうことか、ちょっとわかりにくいですね。

それでは、次のようにコードを修正して実行してみましょう。

Sub Object_Test()

    Dim R As Range
    
    Set R = Range("A1")
    
    R.Value = "Test"
    
End Sub

さて、これを実行すると、どうなるでしょうか。

答えはなんとなく想像がつきますよね。

ワークシートを表示させてみればわかりますが、セルの A1 に、『 Test 』という文字が入力されているはずです。

このように、オブジェクト変数に、何かしらのオブジェクトをセットすると、オブジェクト変数はセットされたオブジェクトそのものを表すようになります。つまり、次のコードの①と②は、全く同じことをやっていることになるのです。

Sub Object_Test()

    Dim R As Range
    
    Set R = Range("A1")
    
    R.Value = "Test" '①
    
    Range("A1").Value = "Test" '②

End Sub



■どうして必要なのか、何が便利なのか

オブジェクト変数の基本的な使い方はわかりましたか?

しかし、このような仕組みがどうして必要なのでしょうか。

まず挙げられるのは、開発段階での利便性です。例えば、次のような例を考えてみてください。

同時に、たくさんのブックを開いている

それらのブックにはたくさんのシートがある

特定のブックの、特定のシートの、特定のセルを操作したい

このような場合、任意のセルを指定するには、次のように記述する必要があります。

Workbooks("ブック名").Worksheets("シート名").Range("セルのアドレス")

たくさんのブックや、複数のシートがある場合、セルA1 はたくさんありますよね。シートの数だけ、セルA1 が存在します。そんな時、どれかを特定するためには、上記のように全てを厳密に指定しなくてはいけません。
もし、ブック名やシート名を省略してしまった場合には、アクティブなブックの、アクティブなシートのセルを表してしまいます。

当然、特定のセルを操作したい場合には、毎回毎回、先ほどのように書かなくてはいけなくなります。これは非常に面倒ですよね。

でも、こんなときにオブジェクト変数を活用すると、非常にラクチンです。

いったんオブジェクト変数に、任意のセルをセットしてしまえば、次からは変数名を記述するだけで特定のセルにアクセスできるのです。

Set R = Workbooks("Book1").Worksheets("Sheet1").Range("A1")

R.Value = "Test"
R.Select

あとから変数 R が表すセルを変更したくなったとしても、最初にセットしている部分だけを変更すればいいので、手入れが簡単になります。

また、コードを実際に手入力してみればわかると思いますが、キチンとオブジェクトの型を指定して変数を宣言していれば、自動メンバ表示がかかります。これにより、コードのスペルミスや、誤入力を防ぐことができます。

432.gif

上記の画像を見るとわかるように、変数名に続けてピリオドを打つと、入力する候補としてプロパティやメソッドが自動的に表示されます。
これなら、入力ミスをすることも少なくなりますね。

また、パフォーマンスの面で考えても、そのままオブジェクトを記述するよりも、オブジェクト変数を使用したほうが有利のようです。まぁ、目に見えて速度が変化するということは無いかもしれませんが、厳密には多少の高速化が見込めるはずです。


■まとめ

さぁ、どうでしたか、オブジェクト変数、理解できましたでしょうか。

実際、知らなきゃ知らないで、結構済んでしまう部分ではありますが、知っているかいないかで、実力に大きな差が生まれるのも事実です。

いったん使い方がわかってしまえば、結構便利です。

また、今後、高度な処理を行ってみたいと考えている人は、ぜひとも今回の講座を参考に、オブジェクト変数について理解を深めておいてください。
なぜなら、クラスを扱う場合にもオブジェクトの概念が必要になりますし、APIを用いた処理などにも必要なケースが出てきます。

そして、ExcelVBAゲームのひとつの到達点である、DirectXを用いた高度な処理には、このオブジェクトを用いるプログラミング手法が絶対に必要です。まぁ、まだまだ先の話ではありますが、基本的なことを理解しておくことは必ず何かの役に立つはずです。

焦る必要はありません。まずはセルやシートなど、身近なオブジェクトを自由自在に操れることを目指しましょう。そして、その先にはもっと素晴らしい世界が待っていることを胸に抱き、これからも一緒にがんばっていきましょう。


■格言

オブジェクト変数は型までしっかり宣言
オブジェクト変数への代入には
Setステートメントを必ず併用


次回の内容にも、実は続きます。
ゆっくりでいいですから、しっかり習得してくださいね。








メールフォーム

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

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

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

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