Excel(エクセル)学習室 HOME


エクセル特別 マクロ(VBA)への誘い

中級・特別編トップへ

   特 別・マクロ(VBA)への誘い
  Excelワークシートでベンチマークに挑戦:近田さん
  Excelでアクションゲームに挑戦:谷孝一さん

 

Excelワークシートでベンチマークに挑戦:近田さん

このページは、メールマガジン「KENZO30★エクセル通信」へ寄せられた「VBAアクションゲーム」の世界的な巨匠である近田さん、谷 孝一さんの投稿を転載させていただいたものです。
メルマガ上での強引な呼びかけにもかかわらず、快く呼びかけに応じて投稿いただいたお二人に感謝しつつ、ここに謹んで転載させていただきます。

これから、マクロ・VBAを勉強したいと思っている方の必ずや「誘い(いざない)」になるものと確信します。

 

Excelワークシートでベンチマークに挑戦

(2003年6月2日、2003年6月9日メールマガジンより転載)

「KENZO30★エクセル通信」読者のみなさま、はじめまして。初投稿となります近田と申します。普段は、VBAでゲームを作っております?
早速ですが拙稿をお届けします。お付き合いいただけたら幸いです。

 

【Excelワークシートでベンチマークに挑戦(前編)】

Excelで集計表を作っているとき、合計欄セルに色を付けたりしますね。このワークシートセル背景色変更、マクロ(VBA)からでも描き変えることができます。例えば、こんな風に。

Sub Macro1()
  ActiveCell.Interior.ColorIndex = 6
End Sub

このマクロを実行すると、選択されているセルが黄色くなります。すごいですねえ、マクロって。これぐらいだと背景色の描き変えは一瞬で完了します。そう、一瞬です。
でも、実はこの処理、意外にもパソコンの処理性能に影響を受けています。背景色を変更するのが1つのセルだけだと全然わかりませんけど・・・。

今は、パソコンの処理速度、速くなりました。一般的なビジネス用途だと、2,3年前のパソコンでも十分に用が足り、例えば1年前と今のパソコンの性能差を実感することはないかもしれません。

最新パソコン買ったのに、速さが実感できず悲しくて夜も眠れない方、買い換えたくても性能差を女房に説明しきれず、悔しい思いをされている方、大丈夫、お手元のExcelちゃんで、視覚的かつ直感的にパソコンの処理性能を把握することが可能です。さらに言うと、この方法で、パソコンショップの最新鋭機の性能を簡単に試すこともできるのです。

 

【Excelワークシートでベンチマークに挑戦(後編)】

先週の前編で、マクロでセルの背景色を変更させる処理はパソコン性能の影響を受ける、という話をしました。そうです。これを使って、簡易的なベンチマークができるのです。
1つのセルの背景色書き換えだと、一瞬で終了してしまいますが、数十から数百のセル背景色を一気に変えてみると、その処理が目に見えるようになるからです。

Sub Macro2()
 For i = 1 To 50
  For i2 = 1 To 35
   For i3 = 1 To 35
    Cells(i3, i2).Interior.ColorIndex = i
   Next i3
  Next i2
 Next i
End Sub

難しいマクロではありません。
単純な三重構造のループで、セルの縦横順番に任意の色番号(ColorIndex)で背景色を指定していきます。

実行してみましょう。どうなったでしょう?
おっと、その前に、列幅を小さくして、セルを正方形にしておいて下さい。実行すると、格子状セルの背景色が描き変わっていきます。左上から右下へと、まるでペンキを塗っていくように。

この書き換えのSpeedに、パソコン性能が如実に現れます。以下、経験からの分析(クロック周波数で)
2G・・・シート単位に塗りつぶしたかのように速い。
1G・・・色の塗り替えが目に見える。ただ、左から右で一斉に塗ったかのよう。
500mhz・・上から下へ1列塗ってから右の列へ1セルずつ塗っているのが見て取れる。

2台パソコンをお持ちの方は、是非速さを比べてみて下さい。家庭と職場で試してみてもいいでしょう。
私なんぞ癖のようなもので、ついついパソコンショップの展示品で試してしまいます。
慣れてくると100mhz単位で見分けられるようになります(嘘)。

え?全然ベンチマークじゃない、計測してないじゃないかって?
そうです。でも、このアナログなところが良いような気がするのです。自分のパソコンだと、気のせいで速く感じたり、ね。
もちろんExcelで、処理をミリ(1/1000)秒単位で計測することも可能ですが、長くなりましたので、その話はまたの機会に・・・・。
お付き合い、ありがとうございました。

特別付録:Excelワークシートでアナログベンチマーク
http://www1.plala.or.jp/chikada/hoka/kenzo1.xls

ええーと次は・・・谷孝一さーーん、投稿ガツーンとよろしく。あれ?そういう趣旨でしたっけ(笑)

●近田さんのHPへぜひ!ご訪問ください。
http://www1.plala.or.jp/chikada/

 

 

先頭へ戻る

 

 

Excelでアクションゲームに挑戦:谷孝一さん

Excelでアクションゲームに挑戦

(2003年6月16日、2003年6月30日メールマガジンより転載) 

「KENZO30★エクセル通信」読者のみなさま、はじめまして。初投稿となります谷と申します。普段は、VBAでゲームを作っております?
早速ですが拙稿をお届けします。お付き合いいただけたら幸いです。

 

【Excelでアクションゲームに挑戦 前編】

コンピュータの楽しみのひとつにコンピュータゲームがあります。最近はフリーゲームでも市販ゲーム負けないほど面白いものがあり、私もダウンロードしては楽しんでいます。でも、自分でもこんなゲームを作ってみたいと思ったことはありませんか。すごい面白いアイデアがあるんだけどどうやって作ったらいいかわからない。そんなことないでしょうか。

まず、ゲームを作るには高価な開発用のソフトがいるし、プログラムなんてむずかしくてできない。そんなふうにあきらめるの早いですよ。あなたの使っているエクセル。これで立派にゲームが作れるんです。エクセルならマクロの自動記録もあるし、ほかのソフトより簡単にプログラムができます。しかもエクセルにはオートシェイプがあってこれでゲームのキャラを作ることができる。
つまり、エクセルはゲームを作れるばかりかその素材までも作ってしまう。こんなソフトほかにありますか。これは作らなきゃ。

そこで、これからゲームのプログラムの話をしていきたいと思います。
まず、ゲームプログラムと他のプログラムの違いを2つあげるとしたら、ノンプレイヤーズキャラ(NPC)が存在することと、マシンの性能によって処理速度が違ってはいけないことです。

NPCとはプレイヤーが直接操作できないオブジェクトのことです。シューティングゲームでいうと敵や自分の撃った弾(弾は撃つ瞬間まではプレイヤーが操作する)、ブロック崩しでいうとブロックやボールです。(プレイヤーが操作できるのはラケットだけ)
これらはたとえプレイヤーが何もしなくてもかってに動いていきます。この点がオペレータの思い通りの処理を遂行しなければいけない。他のプログラムと大きく違います。

また、他のプログラムではあまり問題になりませんが、マシンによて処理速度が違えばゲームは成立しません。コンピュータによってゲームの難易度が変わってしまうからです。

では、実際にゲームのプログラムとはどんなものなのかというと・・・後編に続く

 

【Excelでアクションゲームに挑戦 後編】

先週はPCトラブルにより投稿できませんでした。申しわけありません。先々週に引き続き、ゲームプログラムのお話をしたいと思います。
前回、ゲームプログラムと他のプログラムの違いはノンプレイヤーズキャラ(NPC)が存在することと、マシンの性能によって処理速度が違ってはいけないことであると書きましたが、それを実現するプログラムは実際どういうものか、まず簡単なゲームプログラムを見てください。

下のコードをVBEの標準モジュールにコピペし、マクロの実行で"ゲーム"を選択してください。
これはシューティングゲームで方向キーで自機が動き、Tabキーで弾を発射します。また、文字キーをたたくとゲームが終了します。

Declare Function GetAsyncKeyState Lib "User32.dll" _
(ByVal vKey As Long) As Long
Dim X(5) As Long, B(1) As Boolean, Start As Single
Sub ゲーム()
      初期化
      Do '恒常ループ
           If B(1) = False Then Exit Sub '恒常ループ脱出
           プレイヤーズキャラ操作
           ノンプレイヤーズキャラ移動
          DoEvents
          Do While Timer - Start < 0.04: Loop '同期
          Start = Timer
      Loop
End Sub
Sub 初期化(Optional dummy As Boolean = True)
      X(0) = 50: X(2) = 50: B(1) = True
      Cells.Font.ColorIndex = 6: Cells.Interior.ColorIndex = 1
End Sub
Sub プレイヤーズキャラ操作(Optional dummy As Boolean = True)
      If GetAsyncKeyState(39) < 0 And X(2) < 100 Then X(2) = X(2) + 1
      If GetAsyncKeyState(37) < 0 And X(2) > 0 Then X(2) = X(2) - 1
      [B16] = Space(X(2)) & "自": [A1].Activate
      If GetAsyncKeyState(9) < 0 And X(3) = 0 Then _
      X(3) = 15: X(4) = X(2)
End Sub
Sub ノンプレイヤーズキャラ移動(Optional dummy As Boolean = True)
      X(0) = X(0) + 2
      If X(0) = 100 Then B(0) = Not B(0): X(0) = 0
      If B(0) = True Then X(1) = X(0) Else X(1) = 100 - X(0)
      [B2] = Space(X(1)) & "敵"
      If X(3) > 0 Then
           Range("B3:B15").ClearContents
           Cells(X(3), 2) = Space(X(4)) & "弾"
           If X(3) = 3 Then
                X(3) = 0: [B3] = Empty
                If Abs(X(4) - X(1)) <= 1 Then _
                [B2] = Space(X(1)) & "爆": B(1) = False
                Else
                X(3) = X(3) - 1
          End If
    End If
End Sub

どうです?ゲームが動きましたか?
メールの改行位置がずれるとエラーになるので注意してください。実際のゲームでは1000行近いコードを書くんですが、上の40行のコードにゲームの要素が全て入っています。そしてプロシージャ"ゲーム"はアクションゲームの最も基本となるものです。
ゲームのプログラムはユーザーの命令を受けて動くイベントリブン型ではなく、恒常ループ(Do〜Loop)を走らせ、その中でNPCを動かし、プレイヤーの操作を取りに行く非イベントリブン型プログラムです。また、ゲームプログラムにはマシン毎の実行速度の差をなくすため、同期ループ(Do While Timer - Start 
< 0.04: Loop)を必ず入れます。ここで関数(Timer)は午前0時から現時点までの秒数を表します。つまり、上のコードの恒常ループは1回のループが0.04秒より短いと同期ループが0.04秒になるまで回り続けるため、マシンの性能に関わらず、ループのスピードが0.04秒に保たれるわけです。

紙面の都合上、非常に簡単な説明になってしまいましたが、これで少しでもゲームのプログラムに興味をもってもらえればうれしく思います。お付き合いありがとうございました。

●谷孝一さんのHPへぜひ!ご訪問ください。
http://www.geocities.co.jp/SiliconValley-Cupertino/8748/

 

 

   先頭へ戻る   

中級・特別編トップへ

Excel(エクセル)学習室 HOME


KENZO30 内容の無断転載は禁止しています