back | サーバ選択 (基本[ 1 , 2 , IP ], ミラー[ 1 , 2 , IP ] |
|
|
ti TMS320C6713 DSK つかいませんか Mathematica つかいませんか Scilabつかいませんか MATLAB つかいませんか SPICE for Windows (NGSPICE) つかいませんか VBA つかいませんか 電気電子工学倶楽部-NQCつかいませんか SPICE つかいませんか |
参考になります: |
|
|
パソコンといえば,
今日ではインターネットとワープロと表計算が殆どではないでしょうか。
これらのソフトは,それほどの習熟無しにそれなりに使えます。そして,ここで話題としている
Excel では,いろいろなことを手軽に計算できます。 (もちろん,全ての機能を使いこなすにはかなりの熟練が必要ですが。)
ずっと昔(1980年代)はパソコンといえばBASICでした。 誤解を恐れずにBASICを一言で表すなら, 超高機能電卓とでも言えるでしょうか。 BASICさえあれば原理的にはかなりの仕事ができるのですが, 使うには,それなりの学習が必要です。 そのため今ではBASICの話題は激減し,かなりの計算が Excel 上で行われるようになってきました。 ところで,電気電子工学を教える立場からBASICのことを考え直すと, かなり良いところがあると思います。 それは,シミュレーションを行う際など,それなりに複雑な計算が必要になるのですが,そうした処理を行うには Excel にこだわっていると記述が非常に面倒になることがあります。こんなとき,BASICをはじめとした「コンピュータ言語」を利用すると,すっきりと記述できることが多いものです。また,細かいところまで記述しようとすると,ますます「コンピュータ言語」の有利さが際立ちます。 そこで,私のお勧めは VBA (Visual Basic for Application)
をマスターすることです。今どきコンピュータ言語と言えば真っ先に
C言語を思い浮かべる人がおおいかもしれませんが,学習の容易さを考えたら明らかに
BASIC がお勧めです。しかも,Excel
を持っているなら,無料で正規ユーザとして利用できるのです。(とっても古いバージョンの
Excel は除く)
|
もくじ: |
|
この文章を読んでいる人は,Windowsの起動法と,Excelの起動法は習得済みとします。
また,Excelの簡単な使い方についても習得済みと考えます。
次の図はExcelで「関数をグラフ化」したところです。下記にシート内容を確認します。
ところで,このグラフは,sin x を1周期表示するとともに,(sin x)^n も1周期表示するものです。 セルB5 の内容を変えると,n を変える事が出来ます。次の図では n=4 の場合を示します。
このウエブページの最終目的は,
1. のグラフをもっとスマートにやりたい(それはVBAで可能)というものです。
以下に,1. のグラフの良い点と悪い点を上げたいと思います。(○は良い点,×は悪い点)
それでは Excel + VBA で問題解決ということなのですが,
先ずは準備から。
次の図は,1. で作った Book1.xls をコピーして Book2.xls とし,
そのファイル(Book2.xls)のうちの セル群 A8:D368 を Delete (Del キーを押した)したものです。
グラフは消去していませんので,セル群 A8:D368 に数値を書き込むとグラフ上に直ぐに反映されます。
それでは VBA の準備を始めましょう。
Excel のメニューバー上から,
表示>ツールバー>コントロール ツールボックス
を選びます。
その結果,下に示すように「コントロール ツールボックス」が現れました。
(マシンによって,コントロールツールボックスの現れ方が変わる可能性があります。)
コントロールツールボックスの最初の3つのボタンは特に重要です。
デザインモード 開始/終了ボタン (デザインモードとは,VBA関連パーツを設定するモードです)
プロパティボタン (今回の説明では使いません)
コードの表示ボタン (プログラムを作成,編集するときに使います。デザインモード時に有効です)
また,次のボタンも以下で使用します。
「コマンドボタン」を作成するボタン
以上で VBA を使うための準備が完了しました。
それでは早速プログラムを作ってみましょう。
前の節までの準備は完了しているものとします。
それでは,早速プログラムを打ち込みましょう。直ぐ下に,今回のプログラムを掲載します。
なお,プログラムを打ち込んだら VBA ウインドウの右上の [×]
ボタンを押して VBA ウインドウを終了します
このプログラムは,一般的な BASIC 言語をカジッたことがあれば,
なんとなく分かるものだと思います。詳しくは後ほど解説します。
Private Sub CommandButton1_Click() Pi = 4 * Atn(1) m0 = Sheet1.Cells(1, 2) m1 = Sheet1.Cells(2, 2) m9 = Sheet1.Cells(3, 2) n = Sheet1.Cells(5, 2) For m = m1 To m9 i = m - m1 Sheet1.Cells(m, 1) = i th = i * Pi / 180 s = Sin(th) Sheet1.Cells(m, 2) = s Sheet1.Cells(m, 3) = s ^ n Sheet1.Cells(m, 4) = th Next m End Sub |
プログラム | 解説 |
全般的に | VBA内では,Sheet1.Cells(行, 列) という変数が自動的に使えます。 行と列で示されたセルの内容を表します。 |
Private Sub CommandButton1_Click() |
自動的に作られますから特に気にする必要はありません。 プログラムの最初の行です。 |
Pi = 4 * Atn(1) |
Atn は アークタンジェントを意味します。 この計算で,Pi という変数に π(=3.14159…) が代入されます。 |
m0 = Sheet1.Cells(1, 2) m1 = Sheet1.Cells(2, 2) m9 = Sheet1.Cells(3, 2) n = Sheet1.Cells(5, 2) |
変数 m0, m1, m9, n に,それぞれのセルの値を代入します。 この場合,m0=7, m1=8, m9=368, n=4 になります。(もともとのワークシート参照) |
For m = m1 To m9 |
For 〜 Next は繰返し処理を行います。 |
i = m - m1 |
繰返しにつれて,i は 0〜360 と変化します。 |
Sheet1.Cells(m, 1) = i |
Aの列 (第1列) の m 行目に,i の値:即ち角度の値を代入します。 |
th = i * Pi / 180 |
変数 th に,ラジアンの値を代入します。 |
s = Sin(th) |
変数 s に sin(x) を代入します。 |
Sheet1.Cells(m, 2) = s Sheet1.Cells(m, 3) = s ^ n Sheet1.Cells(m, 4) = th |
B, C, D の列 (第2, 3, 4 列) それぞれの m 行目に,s,s^n (sのn乗), th を代入します。 |
Next m |
繰返し処理の最後の行です。 |
End Sub |
自動的に作られますから特に気にする必要はありません。 プログラムの最後の行です。 |
プログラムを打ち込んだら VBA ウインドウの右上の [×] ボタンを押して,
VBA ウインドウを終了します
続いて,(デザインモード 開始/終了ボタン)
を押してデザインモードを終了します。
最後に,今回作った「CommandButton1」というボタンをクリックすると,プログラムを実行します。
下図は実行が完了した状態を表します。
一見では 1. で説明した画面と殆ど同じに見えますが,明らかな違いがあります。
それは,今回は,計算したのは VBA であり,Excel の セルは値を記憶するだけだという点です。
下図では,セルカーソルが セルC9 を指しています。
今回はセルC9の内容は単なる数値です。
(1. の場合にはこれらのセルには式が入っていました)
今回のワークシートでは,計算が行われるのは「CommandButton1」というボタンをクリックしたときです。
従って,別の n の時の sin^n のグラフを見たいとき,
セルB5 の値を変えるだけでなく,「CommandButton1」のクリックも必要です。
改めてプログラムを修正するには,
(デザインモード 開始/終了ボタン)
を押してデザインモードに入り,
(コードの表示ボタン)
を押してプログラム修正のモードに入ります。
プログラムを変えれば,様々なグラフを書くことが出来ます。
また,BASIC 言語なので,if 文を含んだかなり複雑な計算でも,
(Excel の機能だけを使うのに比べて)簡単にプログラムすることが出来ます。
例えば,前出のプログラムのうちの一行を変更してみると面白いと思います。
修正前 Sheet1.Cells(m, 3) = s ^ n 修正案1 Sheet1.Cells(m, 3) = cos(th) * sin(th) 修正案2 Sheet1.Cells(m, 3) = exp(-0.1*th) * sin(5*th)等々。
VBAのプログラムは,Excel のワークシート内に埋め込まれます。
従って,ワークシートを保存すると,一緒に保存されます。
下の図の様に,Excel を終了すると,
自動的に,保存するか聞いてくるので,「はい(Y)」と答えて保存します。
今までの説明で,とりあえず VBA の最小限を紹介しました。
改めて,同じファイルを再読み込みすれば,同じプログラムを走らせることができます。
しかし,ちょっと待ってください。セキュリティに関して,重要な問題があるのです。
VBA は非常に多くの機能を持っています。
その気になると,例えば,「ハードディスク内の全てのファイルを消去する」
といった危険なプログラムを作ることも可能です。
そのため,コンピュータ ウイルスが紛れ込む可能性が高いのです。
(余談ですが,あなたは危険な環境でパソコンを使っていませんか?
危険な環境とは, Windwos me 系 (含む 98, 95) だったり,
XP系 (含:2000やNT) でも Administrator 権限で使うことです。
(比較的)安全な環境は,XP系 (含:2000やNT) を用意して Administrator 権限以外でパソコンを使うことです。
その手のウイルスの被害を,自分のファイルだけに留める事ができる可能性が高いです。)
安心してください。Excel には コンピュータ ウイルス対策が施されています。
標準的な設定では,Excel は,「読み込んだ VBA を実行できない」可能性があります。
先ほど保存した自分のプログラムを改めて実行するには,
「読み込んだVBAを実行できる」ようにする必要があります。
まず,Excel のメニューバーから,
ツール>マクロ>セキュリティ
と操作して下さい。
ここで,セキュリティレベルを「中」にして下さい。
★★★絶対に,低 にはしないで下さい★★★
以上の操作で,セキュリティレベルは中にできたと思います。
すると,ファイルを読み込む毎に下記の警告が表示されます。
ここで,「マクロを有効にする」ならば,「読み込んだVBAを実行できる」のです。
ちなみに,セキュリティレベルが高では,読み込んだ VBA のプログラムは実行できません。
セキュリティレベル低は,熟練者だけが使うようにして下さい。
「はじめに」でも触れたように,VBA (BASIC言語) を使うことにより, 表計算ソフトでは返って面倒になるような計算を, 細かいところまで簡単に記述できます。 確かに BASIC の習得にはそれなりの学習は必要ですが, Excel だって計算機能を究めるにはそれなりの学習が必要ですから, 例えば将来 C 言語も勉強したいなら, 今のうちから BASIC も勉強したほうが良いと思います。
更に,Excel ではグラフ書きが大得意ですから,
今回使用したように,
VBA で計算した内容を,Excel でグラフ化するのがうまい使い方です。
Excel の各セルは文字列を使うことが出来ます。
しかし,VBA も文字列を扱えますし,
数ある言語の中でも Basic の文字列の取り扱いやすさは,
それほど悪いものではありません。
ですから,VBA と連携して文字列を扱わせてもよいのです。
・ 改行で文が区切られる。(C言語系では,セミコロン";"で文が区切られる) ・ 最も基本的な文は,代入文であり,変数と"="と式からなる。例: A = B + C ・ 式の中で使える基本的な記号は,+ - * / 等。^ はべき乗。 ・ 式の中で使える基本的な関数は,exp ln sin cos atan(アークタンジェント) sqrt(平方根) abs(絶対値) 等。 ・ 比較に使える基本的な関数は,= > < <> >= <= and or 等。 ・ 文字式の中で使える基本的な記号は,& (結合)である。 例: "あ" & "い" ⇒ "あい" ・ 変数は,定義しなくても使える。 ・ 標準的な変数はバリアブル型であり最初に代入された型になる。(他に,整数型,実数型,文字型などあり) ・ VBA は"型"を気にしなくてもたいてい動くが,うまく動かないときは"型"も気にすべきである。 ・ 配列は必ず宣言してから使用する。もしも ii という名の整数型配列を使いたいなら, Dim ii(10) as integer と記入。これにより,ii(0) 〜 ii(10) を使うことができる。 ・ プログラム実行時の入力には,InputBox を使う。 A=InputBox("繰返し回数の入力") ・ 分岐処理の記述は if 文による。 例1 if a>b then 処理1 endif 例2 if a>b then 処理1 else 処理2 endif ・ 繰返し処理-1 … 繰返しの回数が最初から分かっている場合 例 for i=1 to 10 step 1 処理 next i 注意:step が 1 ならば省略することができる。 ・ 繰返し処理-2 … 繰返しの回数が分かっていない場合 例1 do while a>b 処理 loop 注意:例1では,a>b が成り立つ間,ループを実行します。 従って,処理が繰り返されるのは,条件式が成り立つ間です。 処理は1回も行われない可能性があります 例2 do 処理 loop until a>b 注意:例2では,a>b が成り立ったなら,ループを抜けます。 従って,処理が繰り返されるのは,条件式が成り立たない間です。 条件式はループの最後に判断されるので,処理は1回以上実行されます。 例3 do 処理1 if a>b then 処理4 break endif 処理2 if c>d then 処理4' break endif 処理3 loop 注意:例3内の break 文は「繰返し処理から抜ける」という意味です。 この例では,a>b が成り立ったなら処理 4 実施後にループを抜けます。 また,c>d が成り立ったなら処理 4' 実施後にループを抜けます。 もしも処理4 と 処理4' が同一ならば,loop の後に処理4 を書くことにより, それぞれの if 文から処理4 と 処理4' を省くことができます。 例3は,繰返し処理でやりたいことが全て実施できますが, 逆に,非常に複雑なループですから, プログラムミスが生じないように細心の注意が必要です。 また,可能なら,例1 や 例2 の形式で書けるようにしたいものです。 工事中