54
2017-01 更新 熊本高専 森下功啓 VBA数値計算01

VBAで数値計算 01 数値計算の紹介

Embed Size (px)

Citation preview

Page 1: VBAで数値計算 01 数値計算の紹介

2017-01更新 熊本高専森下功啓

VBAで数値計算01

Page 2: VBAで数値計算 01 数値計算の紹介

本資料の目次

数値計算の紹介と本資料への導入プログラミングの初歩をおさらいExcelのマクロ作成VBAの解説課題その他

2

Page 3: VBAで数値計算 01 数値計算の紹介

数値計算の紹介と本資料への導入

3

Page 4: VBAで数値計算 01 数値計算の紹介

シリーズ内容≒数値計算

この講義の内容は、ざっくり言うと数値計算です。

つまり、微分・積分・行列計算・連立方程式などをコンピュータに計算させるために、代表的な解法と実装(コーディング:プログラムを書く行為)を取り扱います。

ついでに、VBA(Visual Basic Application)という、Excelのマクロの使い方も学びます。

4

Page 5: VBAで数値計算 01 数値計算の紹介

マクロって?

あるソフトウェアの中で動作させるプログラムをマクロと言います。主に、手動で行っていた作業を自動化させることを目的で使われます。マクロは何らかのプログラミング言語で記述されます。

例えば、LabVIEWやArcGISやQGISや画像処理系ソフトウェアではPythonが使われており、Googleスプレッドシートではjavascript、ExcelやWordではVBAが使われています。

5

Page 6: VBAで数値計算 01 数値計算の紹介

VBAって?

プログラミング言語のBasicにGUI操作のためのライブラリを一体化させたVisual Basicをスクリプト化されたものがVBAです。ExcelとWordで利用できます。事務屋さんに大人気です。なお、MacとWindowsとでは操作感が異なるので注意が必要です。

6

Page 7: VBAで数値計算 01 数値計算の紹介

数値計算の例

7

図1 太陽電池の等価回路

これは太陽電池のモデルです。このパネルの出力電流Iと出力電圧Vを求めるには、数値計算を利用します。

Page 8: VBAで数値計算 01 数値計算の紹介

8

基礎式

*変数はイタリック体、添字やexpなどはイタリック体にしないのが普通だが、この例では守られていないので注意

Page 9: VBAで数値計算 01 数値計算の紹介

9

中略

Page 10: VBAで数値計算 01 数値計算の紹介

10*一部に誤字がある

Page 11: VBAで数値計算 01 数値計算の紹介

11*このプログラムはVisual Basic .NETで記述されている。

Page 12: VBAで数値計算 01 数値計算の紹介

12*このプログラムはVisual Basic .NETで記述されている。

Page 13: VBAで数値計算 01 数値計算の紹介

13*このプログラムはVisual Basic .NETで記述されている。

もっといい記述がある気がする・・・。

Page 14: VBAで数値計算 01 数値計算の紹介

・・・何やっているの?

f(x) = 0という方程式を解くために、解析的に(数学の理論的)微分を行い、ニュートン法により方程式を満たすxを求めました。方程式と解法をプログラムで表現して計算させています。

14

Page 15: VBAで数値計算 01 数値計算の紹介

この資料の位置づけ

手計算で数学の問題が解けても、現実的な問題は解けません。複雑な問題ではプログラムを作ります。ところで、今やフルスクラッチ(一から全部書く行為)はバグの温床となりやすいため推奨されていません。この資料の読者はライブラリ(プログラムを機能ごとにまとめたもの)を利用することの方が多いでしょう。それを考えると計算結果が間違っているかどうかをチェックする技術の方が重要かもしれません。しかしながら、本資料で扱う基本的なアルゴリズムと実装方法は様々な計算問題の基礎として重要です。

15

Page 16: VBAで数値計算 01 数値計算の紹介

プログラミングの初歩をおさらい

16

Page 17: VBAで数値計算 01 数値計算の紹介

コンピュータとは

一つ一つ具体的なことを書かないとだめ人間みたいに雰囲気を読んでくれないアルファベットで英語みたいな文章を書く文法があるコンピュータは複数のことが同時にできない普通は細かな時間でプログラムを切り替えている

17*javascript勉強会@未来会議室より引用

Page 18: VBAで数値計算 01 数値計算の紹介

プログラムって何?

コンピュータへの命令足し算や引き算ができる文字を画面に表示できる計算することを評価と呼ぶ

18*javascript勉強会@未来会議室より引用

Page 19: VBAで数値計算 01 数値計算の紹介

変数

コンピュータは計算した瞬間に結果を忘れる結果を利用するために一時的に箱なようなものが必要複雑な計算をするためには変数を使う変数を使うために、宣言が必要

19*javascript勉強会@未来会議室より引用

@javascript @Python@C @VBA

いろんな言語の変数宣言例

Page 20: VBAで数値計算 01 数値計算の紹介

代入

プログラムではイコール(=)は同じという意味ではなく入れるという意味入れるということを代入と呼ぶここでは変数aに7を代入している

20*javascript勉強会@未来会議室より引用

@VBA

Page 21: VBAで数値計算 01 数値計算の紹介

文字列

文字列は文字が並んだもの 例えば "abc"VBAの文字列はダブルコーテーション「”」で囲む

21*javascript勉強会@未来会議室より引用

左は、「BASIC」という文字列を代入しようとしてBASICという変数の代入と認識され正常な動作を期待できない。初心者あるあるの典型例だ。

誤 正 @VBA@VBA

Page 22: VBAで数値計算 01 数値計算の紹介

配列

変数は箱配列は箱がつらなったもの配列は英語でarray配列は箱に数字を割り振る数字は0から始まる(0,1,2,3,4,...)VBAは1から始めることもできる・・・。

数字を添字(そえじ)・要素番号・インデックスと呼ぶ

22

@javascript

*javascript勉強会@未来会議室より引用

Page 23: VBAで数値計算 01 数値計算の紹介

条件分岐

状況を判断して処理を分ける条件分岐にはifを使う

23

*足し算の結果が10より大きいか小さいかを判断する例@javascript

*javascript勉強会@未来会議室より引用

Page 24: VBAで数値計算 01 数値計算の紹介

ループ(繰り返し処理)

繰り返し処理を行うにはforを使う

24

*0から9までの合計を計算する例@javascript

*javascript勉強会@未来会議室より引用

Page 25: VBAで数値計算 01 数値計算の紹介

関数

関数を使うことで、繰り返し使える処理を作成できる関数は処理に名前をつけて、再利用ができる

25

*3回’Hello World’を表示するために関数を用いた例@javascript

*javascript勉強会@未来会議室より引用

Page 26: VBAで数値計算 01 数値計算の紹介

引数

関数には変数を渡すことができる渡す変数のことを引数と呼ぶ

26

*渡された変数を表示する関数の例@javascript

*javascript勉強会@未来会議室より引用

Page 27: VBAで数値計算 01 数値計算の紹介

アルゴリズムとデータ構造

英単語を覚えても英語は話せない英語の文法、言い回しなどの学習が必要問題を解くための手段 →アルゴリズムアルゴリズムはある特定の手順で答えを導き出せるものパターンが有るのである程度は覚える必要がある。例えば、配列の中にある数字をすべて足して、合計を求める方法は?どんな変数をどのように保持するか →データ構造

27*javascript勉強会@未来会議室より引用

Page 28: VBAで数値計算 01 数値計算の紹介

EXCELのマクロ作成28

Page 29: VBAで数値計算 01 数値計算の紹介

マクロの開発環境立ち上げ

1. 「開発」タブをクリック2. 「Visual Basic」をクリック

29

*タブが表示されていない場合@Windows左上の「ファイル」→「オプション(左メニューの一番下)」→「リボンのユーザ設定」→右側のチェックボックス群にある「開発」を☑→OK

※画像はExcel2010のものです

Visual Basic

開発タブ

Page 30: VBAで数値計算 01 数値計算の紹介

開発環境の見方

30

プログラムの実行・一時停止・停止ボタン

プロパティ

プロジェクト(シートなど

の構造)

※画像はExcel2010のものです

エディタ領域(デフォルトではエディタは

開いていない)

Page 31: VBAで数値計算 01 数値計算の紹介

SHEET1にマクロを書く準備

31※画像はExcel2016@Win10のものです

Sheet1をダブルクリック 左のエディタが開いて、Sheet1にマクロを書く準備が

できた。

□を押して、最大化しておこう

Page 32: VBAで数値計算 01 数値計算の紹介

VBAでHELLO WORLD

以下のコードを書いて、実行してみよう。(F5キーでも実行可)

32

Sub Test()Range("A1") = "Hello World."

End Sub*コピペ用

※画像はExcel2016@Win10のものです

Page 33: VBAで数値計算 01 数値計算の紹介

こんな画面が出てきたら

実行したい関数を選択して、実行を押す。

33*カーソルが関数から外れているとこの画面が出ます。

Page 34: VBAで数値計算 01 数値計算の紹介

結果

A1セルに”Hello World.”が表示されていれば成功だ。

34※画像はExcel2016@Win10のものです

Page 35: VBAで数値計算 01 数値計算の紹介

作成済みマクロの実行方法

開発タブ→「マクロ」クリック→関数選択→「実行」クリック

35※画像はExcel2016@Win10のものです

Page 36: VBAで数値計算 01 数値計算の紹介

マクロ付きファイルの保存

「名前を付けて保存」から、拡張子として「.xlsm」を選択する。

36※画像はExcel2016@Win10のものです

Page 37: VBAで数値計算 01 数値計算の紹介

デバッグモード

ブレークポイントを設定すると、プログラムの実行をそこで一時停止させることができる。その後、キーボード操作によって一行ずつ実行させることができる。

37※画像はExcel2016@Win10のものです

一時停止後にF8キーを押すと1行ずつ進む

止めたいところでクリック

マウスオーバーで変数の中身を表示してくれる。

Page 38: VBAで数値計算 01 数値計算の紹介

ウォッチ式の追加

デバッグモードで一時停止中に変数を監視できる。

38

変数を右クリック→ウォッチ式の追加

監視中の変数の一覧が表示される。

*何かしらのウィンドウが開くが、通常はそのままOKなどをクリック

Page 39: VBAで数値計算 01 数値計算の紹介

VBAの解説39

Page 40: VBAで数値計算 01 数値計算の紹介

VBAができること

他のExcelブックの処理セルデータの読み込み/書き出し罫線を引くなどの手動で行える操作の全てファイル入出力

40

Page 41: VBAで数値計算 01 数値計算の紹介

VBAが苦手なこと

エラー原因の追求エラー処理シリアル通信ネットからデータを取ってくる綺麗なグラフを描く綺麗なコードを短く書く最近の科学的な操作全般

41

Page 42: VBAで数値計算 01 数値計算の紹介

VBAができない(困難な)こと

オブジェクト指向プログラミング最近のデータベースサーバとの連携

42

Page 43: VBAで数値計算 01 数値計算の紹介

VBAの文法と用語 1

43

内容 文法返り値のない関数(VBでは関数のようなスコープ単位をプロシージャという)

Sub <関数名>()‘ 何か処理。Exit Subで途中脱出が可能である。

End Sub

例:Sub get_tani()‘ 何か処理

End Sub

返り値のある関数 Function <関数名>() as <返り値の型><関数名> = <なにかオブジェクト>

End Function

<関数名>に代入された値が返り値となる。

*PowerPointのおせっかいで、シングルコーテーションやダブルコーテーションの表示上おかしいので注意

Page 44: VBAで数値計算 01 数値計算の紹介

VBAの文法と用語 2

関数の引数は、ByVal <変数名> As <変数型> または、ByRef <変数名> As <変数型> で渡す。ByValは値渡し,ByRefは参照渡しとなる。「参照渡し」はC言語でいうところのポインタ渡しに近い。以下に引数の例を示す。

44

Function get_tani(ByVal point As Integer) As StringIf point < 60 Then

get_tani = ”不可”Else

get_tani = ”合格”End If

End Function点数から合否を判定してくれる関数の例

Page 45: VBAで数値計算 01 数値計算の紹介

VBAの文法と用語 3

45

内容 文法コメントアウト ‘(シングルコーテーション)複数行コメントアウト 存在しないIntegerなどに対する代入演算子 =オブジェクトに対する代入 Set <変数名> = <代入する変数>比較演算子(等号,略,不等号) =, <=, >=, <, >, <>if文 If <条件文> Then <実行文>論理演算子 And, Or, Not

*PowerPointのおせっかいで、シングルコーテーションやダブルコーテーションの表示がおかしいので注意

Page 46: VBAで数値計算 01 数値計算の紹介

VBAの文法と用語 4

46

内容 文法for文 For <カウント変数> = <初期値>To <終値> Step <ステップ数(省略可)>

‘ 処理Next <カウント変数>

while ググってね変数 明示的に宣言しない場合はバリアント型となり、メモリを食う。

明示する場合は以下の様に書く。Dim <変数名> As <型>

配列 Dim <変数名>(要素数) As <型>

利用例Dim students(6) As Integerstudents(0) = 1 ‘ 要素番号は0から利用する(1からにも調整可)students(1) = 2

セル Cells(行番号, 列番号) ただし、番号は1から数える。Range(”セル名”) こちらはセルの名前で指定する組み込み関数

Page 47: VBAで数値計算 01 数値計算の紹介

VBAの算術演算子演算子 説明 例 得られる結果

+ 足し算 8 + 5 13

- 引き算 10 - 4 6

* 掛け算 3 * 5 15

/ 割り算 8 / 5 1.6

¥ 割り算の商 8 ¥ 5 1

Mod 割り算の余り 8 Mod 5 33

^ べき乗 6 ^ 2 36

& 文字列の結合 ”hage” & ”ta” ”hageta” 47

Page 48: VBAで数値計算 01 数値計算の紹介

VBAの変数の型型名 型指定文字 格納できるデータ

ブール型 Boolean TrueまたはFalse

バイト型 Byte 0~255までの整数

整数型 Integer -32,768~32,767の整数

長整数型 Long -2,147,483,648~2,147,483,647の整数

通貨型 Currency -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807の固定小数点数

単精度浮動小数点数型 Single 負の値:約-3.4×10(38乗)~-1.4×10(-45乗) 正の値:約1.4×10(-45乗)~1.8×10(38乗)

倍精度浮動小数点数型 Double 負の値:約-1.8×10(308乗)~-4.0×10(-324乗) 正の値:約4.9×10(-324乗)~1.8×10(308乗)

日付型 Date 日付:西暦100年1月1日~西暦9999年12月31日 時刻:0:00:00 ~23:59:59

文字列型 String 任意の長さの文字列

オブジェクト型 Object オブジェクト

バリアント型 Variant すべてのデータ48

Page 49: VBAで数値計算 01 数値計算の紹介

関数名と配列名が同じとき

代入していれば、配列とみなされる。明示的に関数として扱いたい場合は、名前空間を明示する。

49

関数名と配列名が同じ

コメントアウトを取るとエラーとなる。

*Call <関数名>(arg)でも行けるかも

Page 50: VBAで数値計算 01 数値計算の紹介

準用した方が良いルール関数と配列を区別するために、関数名の先頭は大文字とする。変数の先頭文字は小文字とする。

読み易い変数名とするために、長い名前はアンダーバーでつなぐか先頭を大文字にする。例えば、 「test_value」「testValue」他のブックに保存されたマクロを呼び出さない下手すると呼び出し構造がループして、何が何だか・・・

ファイルの指定に絶対パスを使わないマクロ入りのExcelファイルを配布した場合、利用者の技量が低いとCドライブ

直下に環境を再現するフォルダ構造を作ることもある。

i, j, k, l, m, nはfor文で使われやすいので他での使用を避ける。50

Page 51: VBAで数値計算 01 数値計算の紹介

練習問題51

Page 52: VBAで数値計算 01 数値計算の紹介

問1

本スライドに記載したjavascriptのコードをVBAに書き換えてください。なお、コンソールへの出力はセルへの出力と読み替えます。

52

Page 53: VBAで数値計算 01 数値計算の紹介

その他53

Page 54: VBAで数値計算 01 数値計算の紹介

参考文献

SAK Streets - VB 開発言語資料 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。

54