九州大学 工学部地球環境工学科船舶海洋システム工学コース「計算工学演習第一」 演習資料 担当：木村
http://sysplan.nams.kyushu-u.ac.jp/gen/edu/ExOfCompEng/2019/index.html

Excel上のマクロを利用してプログラムを組む
Visual Basic for Applications (VBA)のテクニック●Excelのマクロとは？
一連の操作を自動的に行う機能例） セル（マス目）に数字を１から順番に埋めていく●Excelのマクロでどんなプログラムが作れるのか？
任意のセルに書き込まれている数字や文字を読み込んで処理したり、指定した番地のセルへ計算結果を書き込んだりできる
上達すれば、ポップアップウインドウを出して数値やメッセージの入力や表示をしたり、図形描画・画像表示やファイル操作など、様々な操作が可能マクロの作成
１） マクロとVBAツールは「ファイル」や「ホーム」と並んだ「開発」タブの中にあるが、既定で非表示になっているためこれを有効にする
１．「ファイル」タブをクリック
２．「オプション」をクリック
３．「リボンのユーザ設定」をクリック
４．「リボンのユーザ設定」および「メインタブ」の下の「開発」チェックボックスをオンに
２） 「開発」タブ中の「Visual Basic」をクリックすると「Microsoft Visual Basic for Applications」が開く
３） 「Microsoft Visual Basic for Applications」上のメニューバー中の［挿入（I）］から［標準モジュール（M）］を選択
４） ＜コード＞ウインドウにモジュールのコード（プログラム）が白紙状態で表示されるので、ここへプログラムを書くべし！

マクロの実行
１） Excel のメニューバー中の［開発］タブの［マクロ（M）］をクリック
２） 作成したマクロを含めて使用可能なマクロ一覧が表示されるので、選択して実行する

ＶＢＡプログラム言語の仕様【データ型】
Integer -1, 0, 1, 2, …など
・整数型
・浮動小数点型 double 0.12, -4.56 など
・論理（ブーリアン）型 boolean true またはfalse

宣言例） Dim loop As Integer
宣言例） Dim alpha As Double
宣言例） Dim b As boolean

【演算】
・代入

a = 10
変数aに10を代入
a = a + 10
変数aの値に10を加えたものを、aに代入
a = b-ca=b*c
a=b/c;
・２項演算 a = b + c
それぞれ加算・減算・乗算・除算
条件を満たさなければfalseが代入される
・関係演算（演算結果がブーリアン型になる）
b = (a = c)
a と c が等しいときブーリアン型変数bにtrueが代入
b = (a < c)a < c のときブーリアン型変数bにtrueが代入
b = (a <= c)a が c の値以下のときブーリアン型変数bにtrueが代入
変数a,b,c全てブーリアン型変数のとき
c = a And c
AND演算子： aとc 両方ともtrueのとき変数cにtrueが代入
c = a Or c
OＲ演算子： aとc どちらかがtrueのとき変数cにtrueが代入【配列】 同じデータ型を持つ要素に番号をつけて扱う 宣言例） Dim x(10) As Double
使い方： y = x(1)x(3)=zw = x(loop) など

ＶＢＡプログラム言語の仕様【セルのデータを読み書きする】
Cells( 1, 2 ) = 100
x = Cells(3, 4)
Cells( 1, 1 ).Clear【関数を使う】
x = Rnd()x = Sqr(y)1行目の2列目（１－Ｂ）のセルに数値100を書き込む
3行目の4列目（３－Ｄ）のセルの数字を変数 x へ代入
1行目の1列目（１－Ａ）のセルの中身を消去して空にDouble型の変数 x に0～1の乱数を代入
Double型の変数 x にyの平方根を代入【ダイヤログを表示する】
MsgBox “メッセージダイアログ”などなど
詳細は解説書などを参照のこと

ＶＢＡプログラム言語の仕様

プロシージャABCD

Sub ABCD()
Dim x As Double
x = 100
EFGH xEnd Sub

変数の宣言

他のプロシージャEFGHを呼び出し
プロシージャEFGH

Sub EFGH( z )MsgBox zEnd Sub

流れ制御文（１）【連接】b = a + 10
c=a+bb=a+10

上に書かれた文（ステートメント）から順番に実行される

c=a+b

条件部にはBoolean型の値がくる【判断】
If ( a < b ) Then
c=bElsec=aEnd If

a<btruec=bfalse
c=a

流れ制御文（２）【多方向分岐】
a=0
if ( a = 0 ) Then
b=b+2
ElseIf( a = 1 ) Then
b=b+4
ElseIf( a = 3 ) Then
b=b+1Else
b=0End If

truefalseb = b+2
a=1trueb=b+4false

a=3truefalseb=b+1b=0

流れ制御文（３）【前判定反復】Do While( a < 0 )a=a+1
Loopa<0

false

true
a=a+1

【後判断反復】Do
a=a+1
Loop While( a < 10 )a=a+1
a < 10true

無限ループに陥ってしまった場合「Ａｌｔ」キーで中断する

false

流れ制御文（４）【所定回数反復】i = 1 （初期化）
For i = 1 to 8
a=a+1
Next

i <> 8 ?
true
a=a+1

For文では自動的にこの処理が行われる

i = i+1

false複数プロシージャ間で同じ変数を共有する：グローバル変数例）シンプレックス法のモジュール
Dim XL, XH, XS,XI, XG,XR,XE As Double
Sub Optimization()
GetXG
Reflect
Extend…
End Sub
Sub GetXG()
XG=(XL+XH+XS+XI)/4
End Sub
Sub Reflect()
XR=2＊XG－XH
End Sub
Sub Extend()
XE=2＊XR－XG
End Sub

モジュールの先頭（プロシージャの前）で定義された変数は、全プロシージャで共有される→ グローバル変数

各プロシージャの中で定義された変数は、そのプロシージャ内だけで通用する → ローカル変数□ 演習問題（１）右に挙げたVBAのコードをマクロとして入力し、適切なセルに数字を入力して実行し、動作を確認せよ。
講義資料の置いてあるホームページからソースコードのテキストファイルをダウンロードできるので利用せよ。

実行する前に「Excelマクロ有効ブック(*.xlsm)」として保存せよ。

実行するときはセルB-1に長さ（100-300程度）、セルB-2に角度（ラジアン）を数値入力し、「開発」-「マクロ」から「Test1」を選択せよ。

' Excel VBA サンプルプログラム'-----------------------------------------------' グローバル変数を定義する
Dim x As Double
Dim y As Double'---------プロシージャ Test1
Sub Test1()'---------変数の宣言
Dim length As Double
Dim theta As Double'---------セルB-1から数字を読み込んでlengthに代入
length = Cells(1, 2)'---------セルB-2から数字を読み込んでthetaに代入
theta = Cells(2, 2)'---------計算結果を変数x,yへ代入
x = length * Cos(theta)y = length * Sin(theta)'---------変数x,yの値をセルB-3, B-4へ書き込む
Cells(3, 2) = x
Cells(4, 2) = y'---------シート上に図形（線）を描画する：プロシージャTest2 を呼ぶ
Test2
End Sub'---------プロシージャ Test2
Sub Test2()'---------シート上に図形（線）を描画する
グローバル変数 x, y の値を用いて処理'
ActiveSheet.Shapes.AddLine 100, 100, 100 + x, 100 + yEnd Sub

□ 演習問題（２）（１）３辺の長さa,b,cで与えられる三角形の面積Sを求めるプログラムを作成せよ。
３辺の長さa,b,cはワークシート上のセルの数値として与え、計算結果の面積Sもa,b,cとは別のセルに書き出せ。

「ヘロンの公式」を利用せよ。

（２）a,b,cのうち長さが最大の辺を底辺として、三角形を図示せよ。

演習の提出について作成したエクセルファイルを下記の課題提出用フォルダへ、課題の番号と提出者が分かるようにファイル名を以下のようにしてアップロードせよ
第2回1TE19xxxZ名前.ｘｌｓｘ
https://share.iii.kyushu-u.ac.jp/public/3RrQAAZIc85AgqABUAFvajQMP_VQTjzM1GWMjTIMieUJ

講義資料、および上記フォルダへのリンクは下記ホームページから
http://sysplan.nams.kyushu-u.ac.jp/gen/edu/ExOfCompEng/2019/index.html