SlideShare a Scribd company logo
1 of 29
Download to read offline
2017-01更新 熊本高専
森下功啓
VBAで
数値計算06
本資料の目次
プログラムの良さの指標
型と精度を意識した計算
VBA TIPS
観測データの処理
練習問題
その他
2
VBAの配列につ
いて学びます
プログラムの良さの
指標
数値計算的に
3
良いプログラムとは
4
動かないプログラム動くプログラム >>
動くと言っても、レベルは色々ある。。。
5
文法エラーがない
必要な処理速度が出る
論理的に正しい
*上は下を
満たすこと
処理速度が遅すぎる
一定の条件下で必要な精度が
保証された結果を出力する
良い
読みやすい
コード量が少ない
転用と拡張がしやすい
論理的に正しいプログラムを
書くには?
論理的に正しいプログラムを書くには、「論理的に
間違っていることを確認できる」ことが大前提です。
プログラムがどの様に振舞えば「バグがある」と言
えるか考える必要があります。
6
プログラムを良くするには?
次の事柄を試しましょう。
実行して、動くこと
単純なケースでの計算結果が正しいこと
あとは、沢山プログラムを書いて練習あるのみです。
英語と同じです。練習しなければ身につきません。
7
型と精度を意識した計算
8
変数は実数ではない
変数は数学でいう実数ではない。有限の値しか取れないし、
離散的で、浮動小数点型の分解能は状況によって変わる。こ
れを考慮しなければ複雑な数値計算はできない。
9
桁あふれ(オーバーフロー)
VBAの整数は有限の桁数しか表現できない。例えば、integer
型であれば-32,768~32,767の範囲である。プログラマは、プ
ログラムが利用する数値の範囲を意識しなくてはならない。
10
大に小を足すと精度が悪化しやすい
浮動小数点は「符号」,「仮数」,「指数」で表現される。
64bitで浮動小数点を表現する場合、桁数が17桁以上異なる数
値の足し算・引き算は意味がない。
11
@Python
1を足しているが、反映されていない例
EXPの例
expをマクローリン展開した式を以下に示す。xが負の時、各項は正
と負が交互に並ぶ。まず、足しては引くを繰り返すので収束が遅い。
さらに、絶対値は高次であるほど急速に小さくなるため計算精度が
悪化する。xが負の時は、exp(x)を計算して、1/exp(x)を求めるべ
きである。
12
http://w3e.kanazawa-it.ac.jp/math/category/suuretu/maclaurin/henkan-
tex.cgi?target=/math/category/suuretu/maclaurin/maclaurin_ex.html
VBA TIPS
13
VBA TIPS –配列の要素数変更
VBAにおいて、変数を用いて配列の要素数を変更する方法を
以下に示す。
14
Function test(b) ‘ 例えば、bは100
Dim a() as Double ' 最大インデックスは書かない
ReDim a(b) ' aの要素数がb+1で初期化される
a(b) = 100 ‘ bまでアクセスできる
End Sub
@VBA
観測データの処理
15
観測データとは
例えば、ArduinoでAD変換した結果など、センサー
を使ったり、アンケートで収集した数値情報のこと
を観測データという。観測データは、大きく分けて
時系列データとそうでないものに分類できる。
16
観測データの例
とある実験で得られた電
流の観測結果を示す。
Aは観測時刻
BはAD変換値
Cは平均を0に加工した値
Dは移動実効値
である。
17
観測データの例 グラフ
先のD列と時刻の線付き散布図を描くと以下の図を得る。電流
が2段階で変化した様子を見てとれる。
18
19
観測データの処理では、列からデータを取得したり、
配列を処理することが多々ある。
以降は配列内の値の処理方法に着目する。
よく使う操作
最大
最小
合計
平均
標準偏差
移動平均
スケーリング(縮尺を変更する)
20
最大
リテラルで宣言された
数値に注意しなくては
ならない。
21
Function get_max(array_data)
max_ = -3000000000# ' negative large enough
For i = 0 To UBound(array_data)
If max_ < array_data(i) Then
max_ = array_data(i)
End If
Next i
get_max = max_
End Function
Sub test()
Const max_index As Integer = 2
Dim arr(max_index) As Integer
arr(0) = 10 ' set test data
arr(1) = 15
arr(2) = 17
Cells(1, 1) = get_max(arr) ' show value
End Sub
*変数名が予約語だった場合は別名に変えて下さい
**シングルコーテーションがおかしいかも
@VBA
最小
リテラルで宣言された数
値に注意しなくてはなら
ない。
22
Function get_min(array_data)
min_ = 3000000000# ' very big enough
For i = 0 To UBound(array_data)
If min_ > array_data(i) Then
min_ = array_data(i)
End If
Next i
get_min = min_
End Function
Sub test()
Const max_index As Integer = 2
Dim arr(max_index) As Integer
arr(0) = 10 ' set test data
arr(1) = 15
arr(2) = 17
Cells(1, 1) = get_min(arr) ' show value
End Sub
*変数名が予約語だった場合は別名に変えて下さい
**シングルコーテーションがおかしいかも
@VBA
合計
23
Function get_total(array_data)
total_ = 0
For i = 0 To UBound(array_data)
total_ = total_ + array_data(i)
Next i
get_total = total_
End Function
Sub test()
Const size As Integer = 10
Dim arr(size) As Integer
arr(0) = 10 ' set test data
arr(1) = 15
arr(2) = 17
Cells(1, 1) = get_total(arr) ' show value
End Sub
*変数名が予約語だった場合は別名に変えて下さい
@VBA
ここで、UBoundは配列の最
大インデックスを返す関数で
ある。
get_total関数は、様々な型の
配列に対応するために型の宣
言を省略している。ただし、
メモリと動作速度は消費する。
練習問題
24
問1 平均
以下のリンクよりデータをダウンロードし、C列の平均を求め
るプログラムを作成せよ。ただし、データは全て一旦配列に
入れた後に処理すること。
https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%B
B%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl
=0
25
問2 標準偏差
以下のリンクよりデータをダウンロードし、C列の標準偏差を
求めるプログラムを作成せよ。ただし、データは全て一旦配
列に入れた後に処理すること。
https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%B
B%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl
=0
26
問3 移動平均
以下のリンクよりデータをダウンロードし、C列の移動平均を
E列に保存するプログラムを作成せよ。ここで、スライド量は
1とし、移動平均に用いるデータ数は50とする。また、移動平
均のアルゴリズムは2つ以上考えられるが実装方法は任意であ
る。
https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%B
B%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl
=0
27
その他
28
参考文献
SAK Streets - VB 開発言語資料
 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm
 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。
29

More Related Content

Similar to VBAで数値計算 06 観測データの処理

【ストアカ】ExcelVBA(マクロ)サンプル
【ストアカ】ExcelVBA(マクロ)サンプル【ストアカ】ExcelVBA(マクロ)サンプル
【ストアカ】ExcelVBA(マクロ)サンプルTakazumi Yamaguchi
 
初心者がまなぶExcel vba
初心者がまなぶExcel vba初心者がまなぶExcel vba
初心者がまなぶExcel vba安藤 良人
 
プログラミングを早くする方法
プログラミングを早くする方法プログラミングを早くする方法
プログラミングを早くする方法kazukiTakahashi18
 
Psp概説(エッセンス)
Psp概説(エッセンス)Psp概説(エッセンス)
Psp概説(エッセンス)Asako Yanuki
 
Webライティング11のルール
Webライティング11のルールWebライティング11のルール
Webライティング11のルールTsutomu Sogitani
 

Similar to VBAで数値計算 06 観測データの処理 (9)

Excel vba講座
Excel vba講座Excel vba講座
Excel vba講座
 
【ストアカ】ExcelVBA(マクロ)サンプル
【ストアカ】ExcelVBA(マクロ)サンプル【ストアカ】ExcelVBA(マクロ)サンプル
【ストアカ】ExcelVBA(マクロ)サンプル
 
初心者がまなぶExcel vba
初心者がまなぶExcel vba初心者がまなぶExcel vba
初心者がまなぶExcel vba
 
プログラミングを早くする方法
プログラミングを早くする方法プログラミングを早くする方法
プログラミングを早くする方法
 
楽天エンジニアライフ
楽天エンジニアライフ楽天エンジニアライフ
楽天エンジニアライフ
 
Psp概説(エッセンス)
Psp概説(エッセンス)Psp概説(エッセンス)
Psp概説(エッセンス)
 
Webライティング11のルール
Webライティング11のルールWebライティング11のルール
Webライティング11のルール
 
VBAで数値計算 編集後記
VBAで数値計算 編集後記VBAで数値計算 編集後記
VBAで数値計算 編集後記
 
Force.com開発基礎
Force.com開発基礎Force.com開発基礎
Force.com開発基礎
 

More from Katsuhiro Morishita

数ページの卒業論文作成のためのwordの使い方
数ページの卒業論文作成のためのwordの使い方数ページの卒業論文作成のためのwordの使い方
数ページの卒業論文作成のためのwordの使い方Katsuhiro Morishita
 
Pythonのパッケージ管理ツールの話@2020
Pythonのパッケージ管理ツールの話@2020Pythonのパッケージ管理ツールの話@2020
Pythonのパッケージ管理ツールの話@2020Katsuhiro Morishita
 
オトナのpandas勉強会(資料)
オトナのpandas勉強会(資料)オトナのpandas勉強会(資料)
オトナのpandas勉強会(資料)Katsuhiro Morishita
 
SIgfox触ってみた in IoTLT in 熊本市 vol.3
SIgfox触ってみた in IoTLT in 熊本市 vol.3SIgfox触ってみた in IoTLT in 熊本市 vol.3
SIgfox触ってみた in IoTLT in 熊本市 vol.3Katsuhiro Morishita
 
Excelでのグラフの作成方法re
Excelでのグラフの作成方法reExcelでのグラフの作成方法re
Excelでのグラフの作成方法reKatsuhiro Morishita
 
Pythonスクリプトの実行方法@2018
Pythonスクリプトの実行方法@2018Pythonスクリプトの実行方法@2018
Pythonスクリプトの実行方法@2018Katsuhiro Morishita
 
Pythonで始めた数値計算の授業@わんくま勉強会2018-04
Pythonで始めた数値計算の授業@わんくま勉強会2018-04Pythonで始めた数値計算の授業@わんくま勉強会2018-04
Pythonで始めた数値計算の授業@わんくま勉強会2018-04Katsuhiro Morishita
 
マークシート読み込みプログラムを作ってみた@2018-04-04
マークシート読み込みプログラムを作ってみた@2018-04-04マークシート読み込みプログラムを作ってみた@2018-04-04
マークシート読み込みプログラムを作ってみた@2018-04-04Katsuhiro Morishita
 
オトナの画像認識 2018年3月21日実施
オトナの画像認識 2018年3月21日実施オトナの画像認識 2018年3月21日実施
オトナの画像認識 2018年3月21日実施Katsuhiro Morishita
 
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001Katsuhiro Morishita
 
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルーシリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルーKatsuhiro Morishita
 
シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰Katsuhiro Morishita
 
シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰Katsuhiro Morishita
 
シリーズML-05 ニューラルネットワーク
シリーズML-05 ニューラルネットワークシリーズML-05 ニューラルネットワーク
シリーズML-05 ニューラルネットワークKatsuhiro Morishita
 
シリーズML-03 ランダムフォレストによる自動識別
シリーズML-03 ランダムフォレストによる自動識別シリーズML-03 ランダムフォレストによる自動識別
シリーズML-03 ランダムフォレストによる自動識別Katsuhiro Morishita
 
シリーズML-01 機械学習の概要
シリーズML-01 機械学習の概要シリーズML-01 機械学習の概要
シリーズML-01 機械学習の概要Katsuhiro Morishita
 
Pandas利用上のエラーとその対策
Pandas利用上のエラーとその対策Pandas利用上のエラーとその対策
Pandas利用上のエラーとその対策Katsuhiro Morishita
 

More from Katsuhiro Morishita (20)

数ページの卒業論文作成のためのwordの使い方
数ページの卒業論文作成のためのwordの使い方数ページの卒業論文作成のためのwordの使い方
数ページの卒業論文作成のためのwordの使い方
 
Pythonのパッケージ管理ツールの話@2020
Pythonのパッケージ管理ツールの話@2020Pythonのパッケージ管理ツールの話@2020
Pythonのパッケージ管理ツールの話@2020
 
オトナのpandas勉強会(資料)
オトナのpandas勉強会(資料)オトナのpandas勉強会(資料)
オトナのpandas勉強会(資料)
 
SIgfox触ってみた in IoTLT in 熊本市 vol.3
SIgfox触ってみた in IoTLT in 熊本市 vol.3SIgfox触ってみた in IoTLT in 熊本市 vol.3
SIgfox触ってみた in IoTLT in 熊本市 vol.3
 
Google Colaboratoryの使い方
Google Colaboratoryの使い方Google Colaboratoryの使い方
Google Colaboratoryの使い方
 
Excelでのグラフの作成方法re
Excelでのグラフの作成方法reExcelでのグラフの作成方法re
Excelでのグラフの作成方法re
 
Pythonのmain関数
Pythonのmain関数Pythonのmain関数
Pythonのmain関数
 
Pythonスクリプトの実行方法@2018
Pythonスクリプトの実行方法@2018Pythonスクリプトの実行方法@2018
Pythonスクリプトの実行方法@2018
 
機械学習と主成分分析
機械学習と主成分分析機械学習と主成分分析
機械学習と主成分分析
 
Pythonで始めた数値計算の授業@わんくま勉強会2018-04
Pythonで始めた数値計算の授業@わんくま勉強会2018-04Pythonで始めた数値計算の授業@わんくま勉強会2018-04
Pythonで始めた数値計算の授業@わんくま勉強会2018-04
 
マークシート読み込みプログラムを作ってみた@2018-04-04
マークシート読み込みプログラムを作ってみた@2018-04-04マークシート読み込みプログラムを作ってみた@2018-04-04
マークシート読み込みプログラムを作ってみた@2018-04-04
 
オトナの画像認識 2018年3月21日実施
オトナの画像認識 2018年3月21日実施オトナの画像認識 2018年3月21日実施
オトナの画像認識 2018年3月21日実施
 
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001
LoRa-WANで河川水位を計測してみた@IoTLT@熊本市 vol.001
 
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルーシリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー
シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー
 
シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰
 
シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰
 
シリーズML-05 ニューラルネットワーク
シリーズML-05 ニューラルネットワークシリーズML-05 ニューラルネットワーク
シリーズML-05 ニューラルネットワーク
 
シリーズML-03 ランダムフォレストによる自動識別
シリーズML-03 ランダムフォレストによる自動識別シリーズML-03 ランダムフォレストによる自動識別
シリーズML-03 ランダムフォレストによる自動識別
 
シリーズML-01 機械学習の概要
シリーズML-01 機械学習の概要シリーズML-01 機械学習の概要
シリーズML-01 機械学習の概要
 
Pandas利用上のエラーとその対策
Pandas利用上のエラーとその対策Pandas利用上のエラーとその対策
Pandas利用上のエラーとその対策
 

VBAで数値計算 06 観測データの処理