第7回 表計算ソフトの高度な利用法

【追加情報 6/7】

演習の項に解答例を追加した.


今まで見てきたように表計算ソフトは非常に使いやすいプログラムである.しかし,より高度な計算処理やシミュレーションなどを行うためには表計算では実現が難しく,C言語に代表されるプログラミング言語により実現するほかはない. 一部の専門分野では,このような場合MATLAB*を用いることも多い.しかし,MATLABは非常に高価であり,専門分野以外では広く普及しているとは言い難いし,また表計算プログラムの気安さ,使い勝手の良さは魅力的である. このような状況を踏まえ,表計算ソフトとプログラミング言語の両方の利点を取り込んだのが,今回のテーマであるVBA(Visual Basic for Application)である.
*MATLABについては第8回,第9回で取り扱う

本講義で身につけた知識が役立つ科目:

機械工学実験,コンピュータ機械工学,メカトロニクス実習,ゼミ及び卒業研究,大学院における研究など.また一般の講義科目では,ロボット工学などの理解を補助する.

7.1 VBAの特徴

VBAはその名が示すとおり,Basic言語の流れを汲むプログラミング言語である.しかし,VBAはC++を初めとするな最新のオブジェクト指向プログラム手法 (Object-Oriented Programing, OOP) の概念を取り込んだ言語仕様となっており,高度なプログラムを比較的容易に作成することができる.またアプリケーション(今回の場合,Excelを指す)の制御を行うための拡張がなされていて,表との連動によるインタラクティブなプログラムが作れるなど,使いようによっては他ではなかなか実現が難しいプログラムが比較的容易に作成できる.その一方で,処理速度が遅い事が難点である.

7.2 VBAによるプログラミングを始める前に

ExcelのセキュリティレベルによってはVBAプログラムを実行できないことがある.センターのコンピュータ環境では,セキュリティレベルが「高」に設定されており,このままではVBAプログラムを実行できない.以下の手順に従ってセキュリティレベルを「中」に変更しなさい.

  1. 「ツール」メニューの「マクロ」より,「セキュリティ」を選ぶ.
  2. 「セキュリティ」パネル中の「セキュリティレベル」を「中」にしてOKを押す.
  3. 一端,Excel自体を終了させ,再度起動させる.

この設定は,コンピュータの電源を切るまで有効である.本講義終了時に元の設定に戻しておくこと.

【ヒント】

ExcelのメニューにVisual Basicのボタン類が出るように設定しておくと便利である.Excelのメニュー部分にマウスポインタを持って行き,右クリックして出るメニューより「Visual Basic」にチェックマークを入れることで以下の様なボタンをメニュー中に表示することが出来る.

7.3 VBAプログラムの例

それではVBAによるプログラム例を見てみよう.今回の演習で作成する例題プログラムの完成時のイメージをFig.1に示す.このプログラムは,2次元ベクトルの回転の行列計算を表で行い,ベクトルの回転の前後をグラフに表示し,さらにその回転角をVBAによって順次変更・制御するものである.

Fig.1 ベクトルを移動して回転させるExcel VBA

サンプルプログラムの構成
  1. 表1(Sheet1): ベクトルの回転の計算を行う部分.
  2. グラフ:      回転の前後のベクトルや単位円を表示.
  3. 表2(Sheet2): グラフ表示の為のデータを準備.
  4. VBAスクリプト: 回転角の変更を行う.
表1(Sheet1)の作成

第5回を参考にして行列計算の表を作る.ただし,ここでは2次元の同次変換行列(3x3)とする.同次変換行列とは,回転と移動が一度に出来てしまう便利な行列である.ここでは同次変換行列そのものについての学習は意図していないが,理解を補助するため,ある程度の意味がわかっていた方が良いと思われる.同時変換行列の簡単な説明は,このページの最後を参照のこと.

Sheet1を作成したあと,回転角θおよび回転中心(xc,yc)を様々な値に変更するとそれにつれて変換後ベクトルv'が変更されることを確認すること.

表2(Sheet2)の作成

ここにはグラフに書くべき内容の一覧を作る.これらの情報は,もちろんSheet1中に記入してもかまわないのだが,Sheet2に作って隠した方が見た目にすっきりしてわかりやすくなること,また,複雑な演算になると複数のワークシートにまたがった計算シートを作る事が多くなるので,その演習の意味を込めてSheet2に作ることとする.

Fig.2 Sheet2には,単位円を作る部分(左)と,変換前後の
ベクトル(右)をグラフにしやすいように配置している.

Fig.1 に示すようなグラフを作成したいわけであるから,Sheet1上の変換前ベクトルvと変換後ベクトルv'のデータを参照し,さらに単位円のデータを作成する.

グラフの作成(まずは作成のみ.体裁は後回し)

Fig.1 に示すようなグラフを Sheet1上に作成する.ここではグラフの体裁を整えることは後回しにして,とりあえず動作が確認できる最低限のグラフをまず描く.

次のVBAスクリプトを作成して動作を確認してから,最終的に第6回にあるようにエンジニアリンググラフとしての体裁を整えるとよい.

VBAスクリプトの作成

Fig.3にはVisual Basicの開発環境である,Visual Basic Editor上で編集中のVBAスクリプトを示す.実際の作成方法は7.4節で述べる.

Fig.3 VBAを作るための作業ウィンドウ.
このプログラムでは,θの値をループ中で変更している.

グラフの体裁の修正

第6回のエンジニアリンググラフを参考にしてグラフの体裁を整える.

7.4 VBAスクリプトの作成

Visual Basic Editorの起動

それでは表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に従って記入して行けば良い.

7.5 例題のVBAスクリプトの解説

以下に,例題で用いたVBAのステートメントや関数の簡単な説明を載せる.詳しくはVBAのヘルプを参考にしなさい.

Const Pi = 3.14 ...

Pi が3.14...という値を持つ定数(constant)であることを示している.

Worksheets("Sheet1").Activate

Sheet1を前面に表示し,アクティブにする.

With Worksheets("Sheet1") ... End with

ワークシートSheet1にあるセルを参照するには,通常,Worksheets("Sheet1").Range("C3")としなければならないが,毎回これを書いていては表記が長くなり,読みづらい上に面倒なので,Work...の部分を省略して,.(ドット)から始めて良いようにする.この様に.(ドット)から始まる場合は,それ以前にWith...以下で設定したものが適用される.

.Range("C3")

Withで設定されたワークシート上のセルC3を参照している.この他に,.Cells(3,3) とする方法がある.

For t = 0 To 2.001 Step (1 / 8) ... Next t

For ... Next で反復(ループ)を表す.ここではループカウンタに浮動小数(Double)の t を用いており,0 から 2 まで,1/8 きざみで(すなわち16回)ループが廻る(反復する)ことを示している.

.Range("C3") = theta

セルC3にthetaの値を代入している.これにより,ワークシート上に作った表のθの値が書き換えられ,結果,回転行列と,それを用いた行列・ベクトルの演算が行われる.

ChartObjects(1).BringToFront

グラフを最前面に最前面に移動し,再描画を行う.

また,例題プログラムの中では使われていないが,

Application.Wait (Now + TimeValue("0:00:01"))

とすると,実行を1秒間停止させて,計算過程をゆっくり表示させることができる.

7.6 VBAプログラムの実行

出来上がったプログラムを実行するには,以下のどれかを行う.

  1. Excelの画面より,メニューに登録したVisual Basicボタン中の実行を押す
  2. Excelのメニュー「ツール」->「マクロ」->「マクロ(M)...」を選択する
  3. Visual Basic Editor画面中の実行を押す
【ヒント】 VBAを実行するには,前もって,マクロを有効にしておく必要がある.

課題

  1. 例題では,回転の中心点は(0,0)のままで,変更していない.このプログラムを改造して,C1(0,0)周りに一周させた後,C2(-0.5,-0.5)周りにもう一周するように変更してみよ.またこの時,単位円の中心位置もC2まわりに再描画されるようにしてみよ.
  2. ある太陽と惑星と衛星の運動の話.太陽の中心座標は(0,0)とする.その周りを距離1au*隔てて惑星が回っている.また,惑星の周りを衛星が距離0.3au隔てて周回している.この様子のシミュレーションをエクセルVBAを用いてせよ.惑星と衛星の公転周期の比η=ωps=0.5とする.また可能であれば,惑星と衛星の公転軌道も描いてみよ(衛星の公転軌道は惑星と共に移動する). *au(Autronomical Unit:天文単位, 1.5e8km)

上記2つのエクセルファイルをメールに添付して提出せよ.尚,エクセルファイル名はそれぞれ,

  1. 課題7-1-年組番号.xls
  2. 課題7-2-年組番号.xls

とする.年組は半角1桁,番号は半角2桁とする.命名規則に厳密に則ること.

提出期限は来週月曜午後5時までとする.

課題1のヒント

VBAプログラムの中で,一回目の回転のループが終了した後,次のループに進む前に,中心座標を書き換える処理をすればよい.

課題2のヒント

衛星の座標は,適切な同次変換行列を2種用いると計算できる.何故,出来るのか,考察してみよ.以下は解答例である.

snapshot

【解答例 6/7】

課題1の解答例: 【RotationMatrix.xls】

課題2の解答例: 【TheSolarSystem.xls】


同次変換行列について

Fig.1に示すように,一つの行列の中に回転行列Rと,回転の中心に相当する位置ベクトル(xc,yc)(正確には並進移動量という)の2つを合わせ持ち,かつ,この様な行列の計算がうまくいくように,最後にもう一行[0 0 1]を加えたような行列のことを同次(変換)行列という.このため,行列の大きさは,2次元であるにもかかわらず3x3となっている.3次元の場合は4x4となる.演算上の整合性を保つため,ベクトルの末尾にも[1]を加えて3x1となる.

この様な同次変換行列を用いると,CG(コンピュータ・グラフィクス)等に必要になる3Dシミュレーション,またロボットの腕(肩・肘・手首)や脚(股関節・ヒザ・足首)などのように,多数の関節が連なっているようなものの形を計算するのに大変役立つのである.

Further Readings

VBAはプログラミング言語であり,またアプリケーションの制御用スクリプトでもある.このため,この言語の利用方法は奥が深く,アイディア次第では色々便利な事が出来そうである.この講義によってVBAに興味を持ったら,是非インターネットや書籍でさらに奥深さを探究してみて欲しい.

次週予告

次回はMATLABを用いた簡単なプログラミングについて演習を行う.MATLABについての必要最小限度の説明は行うが,細かな言語規則についての説明をすることはしないので,情報科学センターのテキストやインターネット等で予習をしておくこと.