演習の項に解答例を追加した.
今まで見てきたように表計算ソフトは非常に使いやすいプログラムである.しかし,より高度な計算処理やシミュレーションなどを行うためには表計算では実現が難しく,C言語に代表されるプログラミング言語により実現するほかはない. 一部の専門分野では,このような場合MATLAB*を用いることも多い.しかし,MATLABは非常に高価であり,専門分野以外では広く普及しているとは言い難いし,また表計算プログラムの気安さ,使い勝手の良さは魅力的である. このような状況を踏まえ,表計算ソフトとプログラミング言語の両方の利点を取り込んだのが,今回のテーマであるVBA(Visual Basic for Application)である.
*MATLABについては第8回,第9回で取り扱う
機械工学実験,コンピュータ機械工学,メカトロニクス実習,ゼミ及び卒業研究,大学院における研究など.また一般の講義科目では,ロボット工学などの理解を補助する.
VBAはその名が示すとおり,Basic言語の流れを汲むプログラミング言語である.しかし,VBAはC++を初めとするな最新のオブジェクト指向プログラム手法 (Object-Oriented Programing, OOP) の概念を取り込んだ言語仕様となっており,高度なプログラムを比較的容易に作成することができる.またアプリケーション(今回の場合,Excelを指す)の制御を行うための拡張がなされていて,表との連動によるインタラクティブなプログラムが作れるなど,使いようによっては他ではなかなか実現が難しいプログラムが比較的容易に作成できる.その一方で,処理速度が遅い事が難点である.
ExcelのセキュリティレベルによってはVBAプログラムを実行できないことがある.センターのコンピュータ環境では,セキュリティレベルが「高」に設定されており,このままではVBAプログラムを実行できない.以下の手順に従ってセキュリティレベルを「中」に変更しなさい.
この設定は,コンピュータの電源を切るまで有効である.本講義終了時に元の設定に戻しておくこと.
ExcelのメニューにVisual Basicのボタン類が出るように設定しておくと便利である.Excelのメニュー部分にマウスポインタを持って行き,右クリックして出るメニューより「Visual Basic」にチェックマークを入れることで以下の様なボタンをメニュー中に表示することが出来る.
それではVBAによるプログラム例を見てみよう.今回の演習で作成する例題プログラムの完成時のイメージをFig.1に示す.このプログラムは,2次元ベクトルの回転の行列計算を表で行い,ベクトルの回転の前後をグラフに表示し,さらにその回転角をVBAによって順次変更・制御するものである.
第5回を参考にして行列計算の表を作る.ただし,ここでは2次元の同次変換行列(3x3)とする.同次変換行列とは,回転と移動が一度に出来てしまう便利な行列である.ここでは同次変換行列そのものについての学習は意図していないが,理解を補助するため,ある程度の意味がわかっていた方が良いと思われる.同時変換行列の簡単な説明は,このページの最後を参照のこと.
Sheet1を作成したあと,回転角θおよび回転中心(xc,yc)を様々な値に変更するとそれにつれて変換後ベクトルv'が変更されることを確認すること.
ここにはグラフに書くべき内容の一覧を作る.これらの情報は,もちろんSheet1中に記入してもかまわないのだが,Sheet2に作って隠した方が見た目にすっきりしてわかりやすくなること,また,複雑な演算になると複数のワークシートにまたがった計算シートを作る事が多くなるので,その演習の意味を込めてSheet2に作ることとする.
Fig.1 に示すようなグラフを作成したいわけであるから,Sheet1上の変換前ベクトルvと変換後ベクトルv'のデータを参照し,さらに単位円のデータを作成する.
Fig.1 に示すようなグラフを Sheet1上に作成する.ここではグラフの体裁を整えることは後回しにして,とりあえず動作が確認できる最低限のグラフをまず描く.
次のVBAスクリプトを作成して動作を確認してから,最終的に第6回にあるようにエンジニアリンググラフとしての体裁を整えるとよい.
Fig.3にはVisual Basicの開発環境である,Visual Basic Editor上で編集中のVBAスクリプトを示す.実際の作成方法は7.4節で述べる.
第6回のエンジニアリンググラフを参考にしてグラフの体裁を整える.
それでは表Sheet1上の回転角度θを制御するVBAプログラムを作ってみよう.Visual Basic Editorを起動するには,「ツール」->「マクロ」->「Visual Basic Editor」を選ぶ.
Visual Basic EditorはExcelとは別のプログラムなので,元のエクセルとは別に起動される.このためエクセルの画面を見ながらVBAを作成することができる.
VBAのプロジェクト中に標準モジュールを追加する.標準モジュールはVBAのスクリプトを記述する標準的な場所である.このほか,ThisWorkbookやSheet1などに置くこともできる.詳細は専門書を参考にせよ.
標準モジュールを追加するには,VBAProjectを右クリックし,「挿入」->「標準モジュール」とする.
標準モジュールを追加したことにより,ようやくVBAのプログラム(スクリプトあるいはプロシージャともいう)を記述する準備が整った.
標準モジュールのModule1(これがデフォルトで付けられる名前である.今回は特に変更しなくても良い)をハイライトし,その状態で右側のエディタ(白い部分)をクリックすると,プロシージャを記入出来るようになり,カーソルが表示される.
ここで「挿入」->「プロシージャ」を選択すると,
「プロシージャの追加」ウィンドウが以下のように表示されるので,「名前」覧にRotationと記入しOKを押す.ここで,「種類」は「Sub」,適用範囲は「Public」とする.
以上の設定により,以下に示すようにSubプロシージャが宣言される.
ここ(Public Sub ...の行と,End Sub行の間)にFig.3に従って記入して行けば良い.
以下に,例題で用いたVBAのステートメントや関数の簡単な説明を載せる.詳しくはVBAのヘルプを参考にしなさい.
Pi が3.14...という値を持つ定数(constant)であることを示している.
Sheet1を前面に表示し,アクティブにする.
ワークシートSheet1にあるセルを参照するには,通常,Worksheets("Sheet1").Range("C3")としなければならないが,毎回これを書いていては表記が長くなり,読みづらい上に面倒なので,Work...の部分を省略して,.(ドット)から始めて良いようにする.この様に.(ドット)から始まる場合は,それ以前にWith...以下で設定したものが適用される.
Withで設定されたワークシート上のセルC3を参照している.この他に,.Cells(3,3) とする方法がある.
For ... Next で反復(ループ)を表す.ここではループカウンタに浮動小数(Double)の t を用いており,0 から 2 まで,1/8 きざみで(すなわち16回)ループが廻る(反復する)ことを示している.
セルC3にthetaの値を代入している.これにより,ワークシート上に作った表のθの値が書き換えられ,結果,回転行列と,それを用いた行列・ベクトルの演算が行われる.
グラフを最前面に最前面に移動し,再描画を行う.
また,例題プログラムの中では使われていないが,
とすると,実行を1秒間停止させて,計算過程をゆっくり表示させることができる.
出来上がったプログラムを実行するには,以下のどれかを行う.
上記2つのエクセルファイルをメールに添付して提出せよ.尚,エクセルファイル名はそれぞれ,
とする.年組は半角1桁,番号は半角2桁とする.命名規則に厳密に則ること.
VBAプログラムの中で,一回目の回転のループが終了した後,次のループに進む前に,中心座標を書き換える処理をすればよい.
衛星の座標は,適切な同次変換行列を2種用いると計算できる.何故,出来るのか,考察してみよ.以下は解答例である.
課題1の解答例: 【RotationMatrix.xls】
課題2の解答例: 【TheSolarSystem.xls】
Fig.1に示すように,一つの行列の中に回転行列Rと,回転の中心に相当する位置ベクトル(xc,yc)(正確には並進移動量という)の2つを合わせ持ち,かつ,この様な行列の計算がうまくいくように,最後にもう一行[0 0 1]を加えたような行列のことを同次(変換)行列という.このため,行列の大きさは,2次元であるにもかかわらず3x3となっている.3次元の場合は4x4となる.演算上の整合性を保つため,ベクトルの末尾にも[1]を加えて3x1となる.
この様な同次変換行列を用いると,CG(コンピュータ・グラフィクス)等に必要になる3Dシミュレーション,またロボットの腕(肩・肘・手首)や脚(股関節・ヒザ・足首)などのように,多数の関節が連なっているようなものの形を計算するのに大変役立つのである.
VBAはプログラミング言語であり,またアプリケーションの制御用スクリプトでもある.このため,この言語の利用方法は奥が深く,アイディア次第では色々便利な事が出来そうである.この講義によってVBAに興味を持ったら,是非インターネットや書籍でさらに奥深さを探究してみて欲しい.
次回はMATLABを用いた簡単なプログラミングについて演習を行う.MATLABについての必要最小限度の説明は行うが,細かな言語規則についての説明をすることはしないので,情報科学センターのテキストやインターネット等で予習をしておくこと.