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

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

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



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


スポンサーサイト

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






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ステートメントを必ず併用


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


関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)
こんばんは~(^^) ご訪問&コメントありがとうございました。 「影斬」という自作のキャラがハンドルネームなんですね。 世界に1つしかない自分の分身のようで、カッコイイとおもいますよ! 覚えやすさとインパクトを両立していると思います(^^)
私はPCの機能的なことは疎いのですが、高校生くらいまでは鬼のようにゲームをやっていました。 今でもたまにPS3でやるゲームは当時のゲーム(主にシューティング)ですね(^^) 今や自分のPCでゲームが作れる時代なんですねぇ・・・(遅れてますかね?)
ではまた☆
  • くらげ#-
  • URL
  • 2008.05.27(Tue)
  • Edit
>くらげさん

私は夢だったんです。ゲームを作るのが。
ですから今は幸せなんだと思います。

それはさておき、コメントありがとうございました。これからもよろしくお願いしますね。
  • 影斬#m.2.LkcQ
  • URL
  • 2008.05.27(Tue)
  • Edit

メールフォーム

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

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

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

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