回転する3Dオブジェクト

2016年版

1 概要

 最近のExcelでは、3Dオブジェクトを作成できる。マクロ(VBAスクリプト)を作成して、それらに動きを与えてみよう。ここでは、ボタンをクリックすると、オブジェクトが回転するようにしたい。



2 遊び方

 スタートボタン(ボタン 3)をクリックすると、全体の処理が始まる。時間の経過につれて、星形と月形の、ふたつの3Dオブジェクトが回転する(5度の回転を500回繰り返す)。

3 作り方(概要)

 星形と月形の2D図形を作成する。
 それらを3Dにする。
 ひとつのボタンを作成する。
 プログラム(VBAスクリプト)を記述する。

4 作り方(詳細)

【事前準備】開発タブの表示
 「ファイル」メニュー→オプション→リボンのユーザ設定→「□ 開発タブの表示」にレ点を入れる。
【図形の作成】
 「挿入」メニュー→「図形...」を選択する。
 適当な図形を選択すると、カーソルが十字形になる。Excelシートの上をドラッグすると平面図形ができあがる。星形と月形(または好みの図形)を作成しよう。
【図形の立体化】 3Dにしたいオブジェクトを右クリックし「図形の書式」を選択する。  「3D回転」を選択し「斜投影」を設定する。  「3D書式」を選択し「奥行き」の長さを設定する。 色や質感を変えることもできる。
【ボタンとプログラムの作成】
 つぎに、ボタンを作成したい。開発タブ→ボタン を選択すると、カーソルが十字形になる。Excelシートの上をドラッグするとボタンができあがり「マクロの登録」パネルが開く。
 このとき「新規作成」を選択すると同時にVBエディターが起動する。起動しないときは、「ツール」メニュー→「マクロ」→「Visual Basic Editer」を選択する。そこには、すでに、
  Sub ボタン3_Click()
  End Sub
という(処理の開始と終了を表す)記述がある。この2行の間に「ボタン3がクリックされたら実行する処理」として,以下のようなVBAスクリプトを記述する。
----------------------------------- Sub ボタン3_Click() For n = 1 To 500 Cells(1, 2) = n '図形を5度回転させる Sheet1.Shapes("AutoShape 1").IncrementRotation(5) if n < 300 Then Sheet1.Shapes("AutoShape 2").IncrementRotation(-5) end if DoEvents Next n End Sub -----------------------------------
【コンパイル】 記述(coding)が終了したら、それをコンパイルする(「デバッグ」メニュー→「コンパイル」)。コンパイルとは機械が理解できる形式に変換することである。もしも間違っていたら、「ここが間違っているぞ」という表示がでてコンパイルは失敗するが、心配するな。修正すればいい。うまくコンパイルできたら、VBエディタを終了して、Excel に戻る(「ファイル」メニュー→「Excelに戻る」)。コンパイルできるということは、構文が正しいということである。
【実行】 Excelシートに戻ったら、ボタンが選択されている状態になっているかもしれない。何も選択されていない状態にするために、どこでもいいからセルをクリックしておく。これで準備が整った。さて、ボタンを押してみよう。うまくいけば希望どうりの動きをするはずである。

【修正】 しかし、コンパイルできた(構文が正しい)としてもプログラムは間違っていることもある。ボタンを押したら、ひとつのオブジェクトは動くが、他方は動かない、なんてことがある。あるいは、「そんなオブジェクトはありません」とか「ここが間違ってます」などというウインドウがあらわれる。それでも心配するな。プログラムを修正(デバッグ)すればいい。ふたたびVBエディタに戻って、スクリプトを修正しよう。ただし、忘れやすいのだが、修正したあと、かならずプロセスをリセットすることを忘れないように(「実行」メニュー→「リセット」)。そして、再びコンパイルして、エクセルに戻って、ボタンを押してみる。

【保存と再開】 保存するとき、ファイルの拡張子は .xlsxm にせよ。再びファイルを開くときときセキュリティー警告が出るが無視して、「マクロを有効にする」を選択せよ。

5 プログラムの解説
 2行目(For): これは繰り返し構文である。変数nに1から500を順番に代入しながら、(For n=1 to 500 ~ Next n)で挟まれた処理を(この例では結果として500回)繰り返し実行する。
 3行目(Cells):1行2列目のセルに、変数nの「現在の値」を書き込む。繰り返しの回数が増加すれば、書き込まれる数値も刻々と変化してゆく。
 5行目: Sheet1.Shapes("AutoShape 1").IncrementRotation(5)
で、シート1にあるAutoShape 1という名前の図形オブジェクト(ここでは星形)を5度回転させている。ー5なら逆向きに回転する。
 6行目(IF...Then...End If):IF部の条件が満たされればThen部を実行する。
 DoEvents命令は、「ここまでの仕事をやり終えてから、一旦、他のオブジェクトからの割り込みを許可しろ(割り込みが済めば,仕事を継続する)」という(ある程度は危険な)命令です。本当は使いたくないので、はじめは使いませんでしたが、回転のなめらかな動きがでないので、しかたなく使っています。

6 注意
 オブジェクトの名前(AutoShape 1)やボタンの名前(ボタン3)が異なるかもしれない。Windowsでは、button1かもしれない。自分が作成したオブジェクトの名前を知るには、それをクリックして、リボン直下の左端を見よ。
 Visual Basic言語のヘルプは、Visual Basic Editerを開いているときに、ヘルプアイコンを押す(あるいは「イルカ」をクリックする)とでてきます。

7 <余談> オブジェクト指向システム

 言葉で表現できる何らかの「まとまった」対象物/概念を「オブジェクト」といいます。ボタンや星形や月形の図形はオブジェクトです。また、エクセルのシートもsheetという名前のオブジェクトだし、はたまたエクセルのプログラムもapplicationという名前のオブジェクトです。エクセルシート上のセルもオブジェクトです。
 各オブジェクトは、プロパティー(設定できる項目)やメソッド(自身で実行できるプログラム)をもっています。
 3行目:Cells(1, 2) = n は、本当は Cells(1, 2).Value = n と書くべきでしたが省略しています。Cells(1,2)というオブジェクトのValueというプロパティーにnの値(n =1,2,3,...,10)を代入せよという命令です。
 5行目:Sheet1.Shapes("AutoShape 1").IncrementRotation(20)
の本当の意味は、第1のシート(sheet1)にある"AutoShape 1"という名前のShapeオブジェクトがもっているメソッドIncrementRotation(20)を実行せよ、ということです。
 しかし、これらはボタンの中に書かれています。そこで、「ボタンというオブジェクトが、セルや図形というオブジェクトに向かって仕事を依頼している(メッセージを送っている)」と解釈して下さい。
 したがって、このシステムは「複数のオブジェクトが互いにメッセージを送りあって、個々の部分的な仕事をこなしながら、全体として意味のある仕事をしている」ことになります。そういう風に解釈できるシステムを、ここではオブジェクト指向システムと呼ぶことにします。
(上級者への注:通常はイベント駆動とかメッセージ駆動システムとかいうらしいが、ここでは勝手にオブジェクト指向と呼んでいる。また、クラス定義や継承を使用するオブジェクト指向開発/プログラミング方法について述べているのではないことに注意すること。)