わんくま同盟 熊本勉強会 #04
VBAとPythonで始める数値計算教育
ver. 0.999
2017-03-18 14:40-15:30
森下
わんくま同盟 熊本勉強会 #04
自己紹介
属性
• 熊本高専建築社会デザイン工学科助教
• 専門は衛星測位や電子回路
• センサーでデータ集めたり
• 機械学習歴6年ほど
• 言語
– Python, C/C++, C#, VB, VB.NET, 後はかじった位
2
わんくま同盟 熊本勉強会 #043
が大好きです
わんくま同盟 熊本勉強会 #04
目次
• 背景
• 評価をどう実現する問題
• 採点をどうする問題
• 実際の採点
• まとめ
• 付録
わんくま同盟 熊本勉強会 #04
背景
熊本高専建築社会デザイン工学科では、4年次に数値
計算を学びます
数値計算・・・数値微分
とか、数値積分とか、
ニュートン法とか、掃き
出し法とか。工学的な
問題を計算機で解くた
めに必要な技術。
①𝑥"の初期値𝑥#
更新値𝑥$
②𝑓 𝑥# を計算
③𝑥#における接線の傾き(微分値)を求める
④接線とy = 0の交点の𝑥座標で𝑥"を更新
⑤以下、解が収束するまで繰り返す
O
𝑥
𝑦
図 ↑ニュートン法
わんくま同盟 熊本勉強会 #04
使用言語を何にするか・・・?
私「Pythonを使いたいと思うんですがどうでしょうか?」
同僚「現場はExcelだからね〜。VBAでしょ。」
私「わかりました。ちょっとやってみます。」
わんくま同盟 熊本勉強会 #04
VBA
• Microsoft Office用マクロ言語
• MacのVBA開発画面は超貧弱
• WinではOKでもMacではエラーとなったり
Macではエラーになる例 左の修正例
開発環境@Mac
わんくま同盟 熊本勉強会 #04
数値計算そのものをVBAででやっている現場はないと
思う。そもそも、VBAで業務用のマクロを組むだけなら、
1000円で本を買ってくればなんとかなる。
それでも教育現場でVBAというのは、モダンな言語を
扱える教員が少ないということに原因が在ると思う。
「VBは習得が簡単な言語である」という神話もある*。
ちなみに、C言語は低学年でやるが死屍累々らしい。
どうしてこうなった!?
*うちの学校だけだったらスミマセンw
わんくま同盟 熊本勉強会 #04
設定した受講生のゴール
到達目標
理想的な到達レベル
の目安(優)
標準的な到達レベル
の目安(良)
未到達レベル
の目安(不可)
Excelのマクロを
記述し、実行でき
る。
例えば成績表において赤点
者のチェックができるなど、
繰り返しと関数を含む処理
を実装できる。
セルの値を読み込み、そ
の値を用いた四則演算の
結果をセルに表示できる。
いかなるマクロも書
けない。
数値微分・積分
について理解し、
利用できる。
任意の関数について、微分
と積分の推定値を求めるこ
とができる。
微分および積分の数値計
算方法について説明でき、
プログラムで表現できる。
微分および積分の
数値計算方法につ
いて説明できない。
連立方程式を解
くプログラムを作
成し、利用できる。
掃き出し法をプログラムで表
現でき、任意の問題を解くこ
とができる。
掃き出し法を説明できる。 掃き出し法を説明で
きない。
わんくま同盟 熊本勉強会 #04
評価をどう実現する問題
わんくま同盟 熊本勉強会 #04
森下は、プログラミング能力を測る指標としての
ペーパー試験結果を全く信じていません
プログラムは動いてなんぼです
わんくま同盟 熊本勉強会 #04
つまり、評価指標は・・・・
「結果の正しい関数を書けたかどうか?」だ!!
わんくま同盟 熊本勉強会 #04
出題例
引数で渡された配列の平均値を返す関数を実装せよ。
ここで、引数に渡される配列は「Dim a(リテラル) as
Double」の様にして宣言されているものとする。
Function get_mean(arr)
'ここに解答する。
End Function
わんくま同盟 熊本勉強会 #04
解答例
Function get_mean(arr)
total_ = 0
For i = 0 To UBound(arr)
total_ = total_ + arr(i)
Next i
get_mean = total_ / (UBound(arr) + 1)
End Function
わんくま同盟 熊本勉強会 #04
学生が解答した関数の出力が正しいことを
確認する必要がある
わんくま同盟 熊本勉強会 #04
方法1 VBAで関数を呼出&Sheetをチェック
• 学生の書いた関数を呼び出し、返り値を評価したい
• 他のブックから呼び出すことはできるが、Sheetに記
述された関数からは返り値が返ってこない
• そこで、ワークシートに出力させて、それを確認
Excel VBA code
on 学生作成ブック
Excel VBA code
on 評価用ブック
Sheet
Function hoge()
Sheet
Function test()
ワークシート
①
②③
④
わんくま同盟 熊本勉強会 #04
学生に変な癖がつきそうなので却下
わんくま同盟 熊本勉強会 #04
方法2 VBAで関数を呼出&学生はModule内に記述
• 学生には標準Module内に解答してもらう
• 外部からの呼び出しに返り値が返る
• ・・・だが、学生の作った関数はライブラリではない
• Moduleの使い方を間違えている
Module
Function hoge()
Sheet
Function test()
Excel VBA code
on 学生作成ブック
Excel VBA code
on 評価用ブック
①
②
わんくま同盟 熊本勉強会 #04
これも、学生に変な癖がつきそうなので却下
わんくま同盟 熊本勉強会 #04
方法3 Pythonで関数を呼出&学生はSheet内に記述
• 学生にはSheet内に解答してもらう
• Pythonから呼び出すと、返り値が返ってくる
• ・・・これで良い気がする
Sheet
Function hoge()
Python
Function test()
Excel VBA code
on 学生作成ブック
Python code
①
②
わんくま同盟 熊本勉強会 #04
VBAを呼び出すPythonコード例
*Windows OS上でしか動作しません。orz
わんくま同盟 熊本勉強会 #04
PythonとVBA間で渡せるデータ型
• PythonからVBAへ渡す引数
– str, int, floatとこれらを格納したlistを渡せることを確認
– numpyのndarrayやnumpyが定義する変数型は渡せない
– intの値がint32の範囲を超えた場合は未確認
• VBAからPythonへ返される返り値
– String, Double, Integerとこれらを格納した配列はOK
– Array型オブジェクトは渡せなかった
わんくま同盟 熊本勉強会 #04
最終形態
Sheet
Function hoge()
Python
Function test()
Excel VBA code
on 学生作成ブック
Python code
①
②
Sheet
Function hoge()
Excel VBA code
on 教員作成ブック
③
④
双方の解の一致を確認する
わんくま同盟 熊本勉強会 #04
採点をどうする問題
わんくま同盟 熊本勉強会 #04
解答のパターン
• 文字列
• 数値(整数・浮動小数点)
• None(nullみたいなやつ)
• 複素数
• 文字列 or 数値を格納した配列
• 2次元配列
わんくま同盟 熊本勉強会 #04
課題
• 個々人の計算条件により、模範解答と解答が一致しない
– アルゴリズム
– 微分や積分に使う微小幅
– 解の収束条件
– 初期条件
• 文法・論理上のエラーはないが、実用的な計算速度でない
• 見かけ上の誤差小への対応
– 特定の変数範囲では相対的な誤差が小さいこともある
• 模範解答と学生の解答とで返り値の型が異なる場合がある
– 正解は”解なし”なのに数値を返してきたとか
わんくま同盟 熊本勉強会 #04
対策
• 初期条件
– 問題文に明示
• 実用的な計算時間でない
– 動かないのだから、不可
• 見かけ上誤差小
– 問題文に変数範囲を明示するのが妥当
– その上で、複数回関数を呼び出して、確認する
• 型が異なる
– 「解なしの場合は”解なし”を返す」など、予め定めておく
– 型が異なる場合は、不可とする
わんくま同盟 熊本勉強会 #04
誤差に対する対応
• 微積場合、微小変化量を妥当に設定する必要がある
• 妥当な実装ならば、誤差は1%もない
わんくま同盟 熊本勉強会 #04
行きついた評価プログラム
Download:
https://gist.github.com/Katsuh
iroMorishita/ffa12a1b0791d3
5f49632596862610a3
わんくま同盟 熊本勉強会 #04
注意
• Excelが開いたままになったりするので、採点作業後
は再起動が必要になる・・・orz
– 採点プログラムが悪かったかな?
• 学生40人分もあると、プログラムは絶対にクラッシュ
するので、Python側はtry構文が必須
• タイムアウト処理も必要
わんくま同盟 熊本勉強会 #04
実際の採点
時間が余れば
わんくま同盟 熊本勉強会 #04
エラーメッセージと原因
• 'パラメーターの数が無効です。’
– 引数の数が一致しない。呼び出される関数側で引数の数が少ないと出る。渡す引数が
多いと出る。
• unsupported operand type(s) for / 'NoneType' and 'float'
– 返り値がなかったなどして演算エラー
• 'パラメーターはオプションではありません。’
– 呼び出される関数側の引数の数が多かった。渡す引数の数が少なかった。
• <unknown>.関数名
– 関数が存在しなかった。
• math domain error
– 宣言されていない変数が使われるなど
• 'アプリケーション定義のエラーです。’
– 文法エラー。変数の2重宣言や単独のEnd Subなど。また、関数内でCells()を使ってい
るとたまにエラーになる。なんでやねん。
• スタックなんちゃら
– 再帰構造によるスタックオーバーフロー
わんくま同盟 熊本勉強会 #04
採点の様子
*学生の名前が出てくるので、録画を止めてお見せしました
わんくま同盟 熊本勉強会 #04
まとめ
わんくま同盟 熊本勉強会 #04
まとめ
• 数値計算をVBAを使って教えてみました
• ライブラリが存在しないので、フルスクラッチ
• VBAのテキトウなエラーメッセージが最低
• ベクトルの計算あたりから、脱落者が続出
– 関数が3つ以上・行数10行以上で危ないようだ
– データ構造の理解が課題
• 関数を使って計算を続けることと、引数と返り値の
データ構造を一般化しておくことが重要であることは
伝わったと思う
• 問題に合わせた採点は大変だった
わんくま同盟 熊本勉強会 #04
来年度はPythonで全部やります
わんくま同盟 熊本勉強会 #04
専攻科の学生(大学のB3に相当)から「VBAで2ヶ月か
かって作り続けているのだが、デバッグできない。デバッグ
して欲しい。」という相談を受け、30分考えたが全く分から
なかったので2時間でPythonに書き換えた上で機能的に
グレードアップした。
結局はオブジェクト内部で使っている変数が独立しておら
ず、他のオブジェクト内の処理により変更されていたのが
直接の原因だったのだが、そんなのVBAでデバッグするの
は大変だ・・・。
これにより、更に強くPythonにしようと決心したのでしたw
わんくま同盟 熊本勉強会 #04
付録
わんくま同盟 熊本勉強会 #04
PyCon mini Kumamotoをヨロシク!!
https://pycon-mini-kumamoto.connpass.com/event/45063/
39
わんくま同盟 熊本勉強会 #04
PyCon mini Kumamoto プログラム
時間 大ホール 教室
9:30 - 10:00 受付 –
10:00 - 10:15 オープニング –
10:15 - 11:00 キーノート
Ian Lewis
–
11:10 - 11:40 まだ見ぬバグゼロという未来(初級)
新井 正貴
kivyの利便性や有用性(初級)
齋藤 大輔
11:40 - 12:10 PythonとBI基盤ではじめるPyData入門〜福岡ソフトバ
ンクホークスを添えて(初級)
Shinichi Nakagawa(野球の人)
DjangoのDB migrationがどういうしくみで動いているか
(初級)
野中 哲
12:20 - 13:50 ランチディスカッション
14:00 - 14:30 すぐ始められる、Pythonの環境構築(初級)
寺田 学
ボイスインターフェースの現状(仮)と、pythonを使ったフ
レームワーク(flask)でAmazon Echoがレスポンスを返
すまで。
堀田 直孝
14:40 - 15:10 Pythonでできる数理最適化(仮)(中級)
岩永 二郎
Pythonistaの使いかた
jbking
15:20 - 15:50 科学技術計算用言語としてのPython&Webアプリ作ろう
(中級)
矢野 高宏
データ分析現場におけるPython活用事例の紹介
真嘉比 愛
15:50 - 16:00 記念撮影 –
16:00 - 16:30 クロージングLT 1枠5分x5枠。当日、受付にて募集 –
16:30 - 16:45 クロージング –
40
わんくま同盟 熊本勉強会 #04
参考リンク
• VBAによる数値計算解説スライド(1-10)
– https://www.slideshare.net/katsuhiromorishita/vba-01-71493565
• VBAによるニュートン法実装例
– https://gist.github.com/KatsuhiroMorishita/54fee36290911d7c225
7ffe467efed04
• VBAによるベクトル演算関数群実装例
– https://gist.github.com/KatsuhiroMorishita/16a2da253a8afbf60ec8
3a721309dcac
• VBAによる行列計算関数群実装例
– https://gist.github.com/KatsuhiroMorishita/16578b870d705731a88
94222a486f065
わんくま同盟 熊本勉強会 #04
PythonからVBAを呼び出すときの参考サイト
• http://stackoverflow.com/questions/15897371/how-to-call-
vba-sub-from-python#
• http://stackoverflow.com/questions/14732340/how-to-call-
excel-vba-functions-and-subs-using-python-win32com#
• https://sites.google.com/site/pythoncasestudy/home/pywi
n32kara-comwo-tsuka-tsu-te-excelwo-sousa-suru-houhou

VBAとPythonで始める数値計算教育