Upload
katsuhiro-morishita
View
126
Download
0
Embed Size (px)
Citation preview
2017-01更新 熊本高専森下功啓
VBAで数値計算01
本資料の目次
数値計算の紹介と本資料への導入プログラミングの初歩をおさらいExcelのマクロ作成VBAの解説課題その他
2
数値計算の紹介と本資料への導入
3
シリーズ内容≒数値計算
この講義の内容は、ざっくり言うと数値計算です。
つまり、微分・積分・行列計算・連立方程式などをコンピュータに計算させるために、代表的な解法と実装(コーディング:プログラムを書く行為)を取り扱います。
ついでに、VBA(Visual Basic Application)という、Excelのマクロの使い方も学びます。
4
マクロって?
あるソフトウェアの中で動作させるプログラムをマクロと言います。主に、手動で行っていた作業を自動化させることを目的で使われます。マクロは何らかのプログラミング言語で記述されます。
例えば、LabVIEWやArcGISやQGISや画像処理系ソフトウェアではPythonが使われており、Googleスプレッドシートではjavascript、ExcelやWordではVBAが使われています。
5
VBAって?
プログラミング言語のBasicにGUI操作のためのライブラリを一体化させたVisual Basicをスクリプト化されたものがVBAです。ExcelとWordで利用できます。事務屋さんに大人気です。なお、MacとWindowsとでは操作感が異なるので注意が必要です。
6
数値計算の例
7
図1 太陽電池の等価回路
これは太陽電池のモデルです。このパネルの出力電流Iと出力電圧Vを求めるには、数値計算を利用します。
8
基礎式
*変数はイタリック体、添字やexpなどはイタリック体にしないのが普通だが、この例では守られていないので注意
9
中略
10*一部に誤字がある
11*このプログラムはVisual Basic .NETで記述されている。
12*このプログラムはVisual Basic .NETで記述されている。
13*このプログラムはVisual Basic .NETで記述されている。
もっといい記述がある気がする・・・。
・・・何やっているの?
f(x) = 0という方程式を解くために、解析的に(数学の理論的)微分を行い、ニュートン法により方程式を満たすxを求めました。方程式と解法をプログラムで表現して計算させています。
14
この資料の位置づけ
手計算で数学の問題が解けても、現実的な問題は解けません。複雑な問題ではプログラムを作ります。ところで、今やフルスクラッチ(一から全部書く行為)はバグの温床となりやすいため推奨されていません。この資料の読者はライブラリ(プログラムを機能ごとにまとめたもの)を利用することの方が多いでしょう。それを考えると計算結果が間違っているかどうかをチェックする技術の方が重要かもしれません。しかしながら、本資料で扱う基本的なアルゴリズムと実装方法は様々な計算問題の基礎として重要です。
15
プログラミングの初歩をおさらい
16
コンピュータとは
一つ一つ具体的なことを書かないとだめ人間みたいに雰囲気を読んでくれないアルファベットで英語みたいな文章を書く文法があるコンピュータは複数のことが同時にできない普通は細かな時間でプログラムを切り替えている
17*javascript勉強会@未来会議室より引用
プログラムって何?
コンピュータへの命令足し算や引き算ができる文字を画面に表示できる計算することを評価と呼ぶ
18*javascript勉強会@未来会議室より引用
変数
コンピュータは計算した瞬間に結果を忘れる結果を利用するために一時的に箱なようなものが必要複雑な計算をするためには変数を使う変数を使うために、宣言が必要
19*javascript勉強会@未来会議室より引用
@javascript @Python@C @VBA
いろんな言語の変数宣言例
代入
プログラムではイコール(=)は同じという意味ではなく入れるという意味入れるということを代入と呼ぶここでは変数aに7を代入している
20*javascript勉強会@未来会議室より引用
@VBA
文字列
文字列は文字が並んだもの 例えば "abc"VBAの文字列はダブルコーテーション「”」で囲む
21*javascript勉強会@未来会議室より引用
左は、「BASIC」という文字列を代入しようとしてBASICという変数の代入と認識され正常な動作を期待できない。初心者あるあるの典型例だ。
誤 正 @VBA@VBA
配列
変数は箱配列は箱がつらなったもの配列は英語でarray配列は箱に数字を割り振る数字は0から始まる(0,1,2,3,4,...)VBAは1から始めることもできる・・・。
数字を添字(そえじ)・要素番号・インデックスと呼ぶ
22
@javascript
*javascript勉強会@未来会議室より引用
条件分岐
状況を判断して処理を分ける条件分岐にはifを使う
23
*足し算の結果が10より大きいか小さいかを判断する例@javascript
*javascript勉強会@未来会議室より引用
ループ(繰り返し処理)
繰り返し処理を行うにはforを使う
24
*0から9までの合計を計算する例@javascript
*javascript勉強会@未来会議室より引用
関数
関数を使うことで、繰り返し使える処理を作成できる関数は処理に名前をつけて、再利用ができる
25
*3回’Hello World’を表示するために関数を用いた例@javascript
*javascript勉強会@未来会議室より引用
引数
関数には変数を渡すことができる渡す変数のことを引数と呼ぶ
26
*渡された変数を表示する関数の例@javascript
*javascript勉強会@未来会議室より引用
アルゴリズムとデータ構造
英単語を覚えても英語は話せない英語の文法、言い回しなどの学習が必要問題を解くための手段 →アルゴリズムアルゴリズムはある特定の手順で答えを導き出せるものパターンが有るのである程度は覚える必要がある。例えば、配列の中にある数字をすべて足して、合計を求める方法は?どんな変数をどのように保持するか →データ構造
27*javascript勉強会@未来会議室より引用
EXCELのマクロ作成28
マクロの開発環境立ち上げ
1. 「開発」タブをクリック2. 「Visual Basic」をクリック
29
*タブが表示されていない場合@Windows左上の「ファイル」→「オプション(左メニューの一番下)」→「リボンのユーザ設定」→右側のチェックボックス群にある「開発」を☑→OK
※画像はExcel2010のものです
Visual Basic
開発タブ
開発環境の見方
30
プログラムの実行・一時停止・停止ボタン
プロパティ
プロジェクト(シートなど
の構造)
※画像はExcel2010のものです
エディタ領域(デフォルトではエディタは
開いていない)
SHEET1にマクロを書く準備
31※画像はExcel2016@Win10のものです
Sheet1をダブルクリック 左のエディタが開いて、Sheet1にマクロを書く準備が
できた。
□を押して、最大化しておこう
VBAでHELLO WORLD
以下のコードを書いて、実行してみよう。(F5キーでも実行可)
32
Sub Test()Range("A1") = "Hello World."
End Sub*コピペ用
※画像はExcel2016@Win10のものです
こんな画面が出てきたら
実行したい関数を選択して、実行を押す。
33*カーソルが関数から外れているとこの画面が出ます。
結果
A1セルに”Hello World.”が表示されていれば成功だ。
34※画像はExcel2016@Win10のものです
作成済みマクロの実行方法
開発タブ→「マクロ」クリック→関数選択→「実行」クリック
35※画像はExcel2016@Win10のものです
マクロ付きファイルの保存
「名前を付けて保存」から、拡張子として「.xlsm」を選択する。
36※画像はExcel2016@Win10のものです
デバッグモード
ブレークポイントを設定すると、プログラムの実行をそこで一時停止させることができる。その後、キーボード操作によって一行ずつ実行させることができる。
37※画像はExcel2016@Win10のものです
一時停止後にF8キーを押すと1行ずつ進む
止めたいところでクリック
マウスオーバーで変数の中身を表示してくれる。
ウォッチ式の追加
デバッグモードで一時停止中に変数を監視できる。
38
変数を右クリック→ウォッチ式の追加
監視中の変数の一覧が表示される。
*何かしらのウィンドウが開くが、通常はそのままOKなどをクリック
VBAの解説39
VBAができること
他のExcelブックの処理セルデータの読み込み/書き出し罫線を引くなどの手動で行える操作の全てファイル入出力
40
VBAが苦手なこと
エラー原因の追求エラー処理シリアル通信ネットからデータを取ってくる綺麗なグラフを描く綺麗なコードを短く書く最近の科学的な操作全般
41
VBAができない(困難な)こと
オブジェクト指向プログラミング最近のデータベースサーバとの連携
42
VBAの文法と用語 1
43
内容 文法返り値のない関数(VBでは関数のようなスコープ単位をプロシージャという)
Sub <関数名>()‘ 何か処理。Exit Subで途中脱出が可能である。
End Sub
例:Sub get_tani()‘ 何か処理
End Sub
返り値のある関数 Function <関数名>() as <返り値の型><関数名> = <なにかオブジェクト>
End Function
<関数名>に代入された値が返り値となる。
*PowerPointのおせっかいで、シングルコーテーションやダブルコーテーションの表示上おかしいので注意
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点数から合否を判定してくれる関数の例
VBAの文法と用語 3
45
内容 文法コメントアウト ‘(シングルコーテーション)複数行コメントアウト 存在しないIntegerなどに対する代入演算子 =オブジェクトに対する代入 Set <変数名> = <代入する変数>比較演算子(等号,略,不等号) =, <=, >=, <, >, <>if文 If <条件文> Then <実行文>論理演算子 And, Or, Not
*PowerPointのおせっかいで、シングルコーテーションやダブルコーテーションの表示がおかしいので注意
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(”セル名”) こちらはセルの名前で指定する組み込み関数
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
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
関数名と配列名が同じとき
代入していれば、配列とみなされる。明示的に関数として扱いたい場合は、名前空間を明示する。
49
関数名と配列名が同じ
コメントアウトを取るとエラーとなる。
*Call <関数名>(arg)でも行けるかも
準用した方が良いルール関数と配列を区別するために、関数名の先頭は大文字とする。変数の先頭文字は小文字とする。
読み易い変数名とするために、長い名前はアンダーバーでつなぐか先頭を大文字にする。例えば、 「test_value」「testValue」他のブックに保存されたマクロを呼び出さない下手すると呼び出し構造がループして、何が何だか・・・
ファイルの指定に絶対パスを使わないマクロ入りのExcelファイルを配布した場合、利用者の技量が低いとCドライブ
直下に環境を再現するフォルダ構造を作ることもある。
i, j, k, l, m, nはfor文で使われやすいので他での使用を避ける。50
練習問題51
問1
本スライドに記載したjavascriptのコードをVBAに書き換えてください。なお、コンソールへの出力はセルへの出力と読み替えます。
52
その他53
参考文献
SAK Streets - VB 開発言語資料 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。
54