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

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

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



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


スポンサーサイト

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






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 ステートメント、そしてウォッチウィンドウを活用していきましょう。



■格言

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


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


関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

メールフォーム

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

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

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

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