EXCELマクロを作ろう

Download Report

Transcript EXCELマクロを作ろう

プログラミングの宿題をしよう
4405019 小尾雅人
1
目次
1.
2.
3.
4.
5.
6.
7.
目的
要求分析
設計方針
DFD
プログラム
事後課題
諸注意というかコラム
2
目的
• 課題を処理する。
• なるべくわかりやすいソース作りをする。
↓
構造化プログラミング
3
課題
隣接行列を入力し、プログラムを実行させると、
各頂点間の距離を出力する。
0 1 0
1 0 1
0 1 0
0 1 2
1 0 1
2 1 0
4
言語の選択
使うことの出来る言語
• C++
• Excel VBA
C++にすると入力や配列の演算が面倒なので
Excel VBAでプログラムする
5
利用者からの要求
• 簡単に使える。
• わかりやすい。
• エラーを起こさない。
6
要求を考慮して
• 簡単に使える
– ボタン一つで実行
• ボタンのスペースのセルに入力できるか?
– 面倒ですがツールバーから利用するように。
• わかりやすい
– 初期のワークシートを入力用1枚にする。
• エラーを起こさない
– 条件を厳しく定義する。
7
その他
• 誰でも使えるように
– Excelぐらいインストールしてください。
• 行列のサイズに因らない
– 100もあれば十分だと思うけど・・・。
• パクりやすい
– 明日のテストもがんばりましょう。
8
9
10
11
基本方針
• 到達したかどうかの判断する
– 隣接行列の乗算で値が変化したところをチェック。
• 到達できるかどうかの判断する
– 出力データ内で頂点数より大きな値のとき到達不可能
と判断。
• 距離を判断する
– 乗算するごとに変数countを+1する。
• 終了を判断する
– 乗算して変化しなくなったら終了。
• 変化するごとに変数flagを+1、最終的に0なら終了。
12
処理構造を判断する
• 初期化フェイズ
– 頂点数の把握
– 作業する行列の作成
• 反復試行フェイズ
– 頂点間距離の把握
– 出力データの更新
13
DFDを描いてみよう(1)
接続行列
(入力データ)
入力データ
1
初期化する
何らかの
データ
2
反復試行する
出力データ
頂点間
距離行列
14
DFDを描いてみよう(2)
入力データ
1.1
頂点数nを
求める
入力データ
n
n
1.2
(n×n)
単位行列
の作成
1.3
全要素がn+1の
(n×n)行列を作る
1.2で作成
した行列
Sheet2、Sheet3
1.3で作成
した行列
1.4
対角成分を
0にする
1.4で作成
した行列
Sheet4
15
DFDを描いてみよう(2)
入力
データ
Count
2.1
接続行列の乗算
Count+1
計算用行列
データ
Sheet3
出力データ
2.3
出力データ更新
Flag+1?
更新された
行列データ
2.2
データを比較する
比較用行列
データ
Sheet2
更新された
行列成分 更新前
出力
データ
Sheet4
更新後
出力
データ
Sheet4
更新された
行列データ
Sheet2,Sheet3
16
プログラム(1)
Dim n As Integer
Dim i As Integer
Dim j As Integer
Worksheets("sheet1").Activate
If Cells(1, 1).Value <> "" Then
n=1
1.1
If Range("a2").Value <> "" Then
n = Range("a1").End(xlDown).Row
End If
While Application.Worksheets.count < 4
Worksheets.Add after:=Worksheets(Worksheets.count)
Wend
17
プログラム(2)
For i = 1 To n
For j = 1 To n
If i = j Then
Worksheets("sheet2").Cells(i, j) = 1
Worksheets("sheet3").Cells(i, j) = 1
Worksheets("sheet4").Cells(i, j) = 0
Else
Worksheets("sheet2").Cells(i, j) = 0
Worksheets("sheet3").Cells(i, j) = 0
Worksheets("sheet4").Cells(i, j) = n + 1
End If
Next j
Next i
1.2
1.3
1.4
18
プログラム(3)
•
•
•
•
•
•
Dim flag As Integer
Dim count As Integer
Dim k As Integer
Do
count = count + 1
flag = 0
ループ回数 1回目 2回目 3回目
Count
1
2
3
19
プログラム(4)
For i = 1 To n
For j = 1 To n
If Worksheets("sheet2").Cells(i, j) = 0 Then
For k = 1 To n
Worksheets("sheet3").Cells(i, j) = _
Worksheets("sheet3").Cells(i, j) + _
Worksheets("sheet2").Cells(i, k) * _
Worksheets("sheet1").Cells(k, j)
Next k
If Worksheets("sheet3").Cells(i, j) > 0 Then
flag = flag + 1
If Worksheets("sheet4").Cells(i, j) = n + 1 Then
Worksheets("sheet4").Cells(i, j) = count
End If
End If
End If
Next j
Next i
2.1
2.2
2.3
20
プログラム(5)
For i = 1 To n
For j = 1 To n
Worksheets("sheet2").Cells(i, j) = Worksheets("sheet3").Cells(i, j)
Next j
Next i
Loop While flag > 0
Worksheets("sheet4").Activate
End If
End Sub
21
プログラム記述途中の変更箇所
• 1.2,1.3,1.4
– 行列をforループで作ったため一緒にしたほうが
作りやすかった。
• 2.1,2.2
– データの比較を容易にするため、もともと0の部
分のみ計算して、値を取るかどうかで判定。
• そのほか
– 2.2のデータ更新は最後に(プログラム(5))
22
これからの展望
• プログラムのスリム化
• エラー発生を抑えるための改良
• 解説レポートの作成
23
コラム ワークシートが4枚の理由
• 3枚だと不具合が出る
可能性がある!
0 1 0
1 0 1
0 1 0
0 1 0
0 1 0
0 0 1
1 0 0
0 1 0
0 0 1
0 1 0
0 1 1
0 0 1
0 1 0
0 1 1
0 1 1
0 1 0
実際は 1 0 1
0 1 0
24