back サーバ選択 (基本[ 1 , 2 , IP ], ミラー[ 1 , 2 , IP ]
Last Update 2006/2/27 言い回しの修正 Update 2004/1/7 ミラーサーバの整備(サーバ不調時への備え) Update 2003/2/26(全面的修正) Update 2003/2/25 NEW 2003/2/24
前のバージョン(03/3/25開発終了)
参考にしました: 望月の、 便利なツールを「つかいませんか」
ti TMS320C6713 DSK つかいませんか
Mathematica つかいませんか
Scilabつかいませんか
MATLAB つかいませんか
SPICE for Windows (NGSPICE) つかいませんか
VBA つかいませんか
電気電子工学倶楽部-NQCつかいませんか

SPICE つかいませんか
参考になります:

VBAつかいませんか (望月のVBA入門)

はじめに:
パソコンといえば, 今日ではインターネットとワープロと表計算が殆どではないでしょうか。 これらのソフトは,それほどの習熟無しにそれなりに使えます。そして,ここで話題としている Excel では,いろいろなことを手軽に計算できます。 (もちろん,全ての機能を使いこなすにはかなりの熟練が必要ですが。)

ずっと昔(1980年代)はパソコンといえばBASICでした。 誤解を恐れずにBASICを一言で表すなら, 超高機能電卓とでも言えるでしょうか。 BASICさえあれば原理的にはかなりの仕事ができるのですが, 使うには,それなりの学習が必要です。 そのため今ではBASICの話題は激減し,かなりの計算が Excel 上で行われるようになってきました。

ところで,電気電子工学を教える立場からBASICのことを考え直すと, かなり良いところがあると思います。 それは,シミュレーションを行う際など,それなりに複雑な計算が必要になるのですが,そうした処理を行うには Excel にこだわっていると記述が非常に面倒になることがあります。こんなとき,BASICをはじめとした「コンピュータ言語」を利用すると,すっきりと記述できることが多いものです。また,細かいところまで記述しようとすると,ますます「コンピュータ言語」の有利さが際立ちます。

そこで,私のお勧めは VBA (Visual Basic for Application) をマスターすることです。今どきコンピュータ言語と言えば真っ先に C言語を思い浮かべる人がおおいかもしれませんが,学習の容易さを考えたら明らかに BASIC がお勧めです。しかも,Excel を持っているなら,無料で正規ユーザとして利用できるのです。(とっても古いバージョンの Excel は除く)

このページでは,Windowsの時代に即したBASIC である VBA について, その入門といえるところまで紹介します。
なお,私が使うソフトは,以下のバージョンですが, バージョンが少々前後しても同様に使えるはずです。
1. Windows2000 Professional
2. MS-Excel2000
3. VBA (Visual Basic for Application)
注意:VBAは,Excelに添付されているため,実際に私が購入したソフトは2本です。
ここで使用したソフトウエアはマイクロソフト社の製品です。


もくじ:
  1. 課題とするワークシート(関数をグラフ化)
  2. 1.のやり方の問題点
  3. VBAの準備(ただし図表はExcelに任す)
  4. VBAのプログラムを作る
  5. VBAプログラムの解説
  6. VBAプログラムの実行
  7. VBAプログラムの修正
  8. VBAプログラムの保存
  9. VBAプログラムの再読み込みと,セキュリティ問題
  10. Excel と VBA を連携させる価値
  11. VBA 文法の概要
  12. download サンプルワークシート
    Excel 機能のみ使って関数をグラフ化Book1.xls ←VBAもマクロも含んでいませんがダウンロードするなら注意してください。
    Excel 機能 + VBA で関数をグラフ化Book2.xls ←VBAが含まれていますのでダウンロードするなら注意してください。
    ウエブ管理人はウイルスに注意はしていますが,念には念を入れてください。

  1. 課題とするワークシート(関数をグラフ化)

    この文章を読んでいる人は,Windowsの起動法と,Excelの起動法は習得済みとします。 また,Excelの簡単な使い方についても習得済みと考えます。

    次の図はExcelで「関数をグラフ化」したところです。下記にシート内容を確認します。

    1. ファイル名は「Book1.xls」です
    2. 画面は上下2つに分けて表示しています。操作は,メニューバーから「ウィンドウ>画面の分割」です
    3. セル A1 の内容は"標題行"です。 7行目に「degree, sin x, (sin x)^3, th」と標題がかかれていることと対応はしていますが, 特にセル A1 が空白だったとしても特に問題はありません
    4. セル B1 の内容は 7 です。セルが空白だったとしても特に問題はありません
    5. 同様に,セル群A2:B3 (図中,色が変わったセル)について, セルが空白だったとしても特に問題はありません
    6. セル A5 の内容は"n="です セル B5 との対応上記入しました。 ただし,セルA5が空白だったとしても特に問題はありません
    7. セル B5 の内容は今のところ 3 です。計算に必要です
    8. 7行目のセルは左から 「degree, sin x, (sin x)^3, th」 という文字が入っています
    9. A列の 8 行目から 368 行目までの各セルには,0 〜 360 の数値が入っています
    10. 順序は飛びますが,D列の同行には,ラジアンの値が入っています。
      セルD8の内容は,"=A8*PI()/180" です。その他のセルは,セルD8 からコピーしたものです
    11. B列の同行には,sin x の値が入っています。
      セルB8の内容は,"=SIN(D8)" です。その他のセルは,セルB8 からコピーしたものです
    12. C列の同行には,(sin x)-3 の値が入っています。
      セルC8の内容は,"=B8^$B$5" です。その他のセルは,セルC8 からコピーしたものです。 なお,$の付いた指定は「絶対指定」と呼ばれ,コピーしても不変です
    13. グラフのデータ領域は A7:C378 (ただし,最初の行は「タイトル」) です。
      グラフの形式は,散布図 です。
      配色等は少々変更しましたのでデフォルトとは多少異なります
    14. このワークシートのファイルサイズは,60.5kBです。

    ところで,このグラフは,sin x を1周期表示するとともに,(sin x)^n も1周期表示するものです。 セルB5 の内容を変えると,n を変える事が出来ます。次の図では n=4 の場合を示します。

  2. 1.のやり方の問題点

    このウエブページの最終目的は, 1. のグラフをもっとスマートにやりたい(それはVBAで可能)というものです。

    以下に,1. のグラフの良い点と悪い点を上げたいと思います。(○は良い点,×は悪い点)

    1. ○ 簡単にグラフが書けた。(Visual Basic などでは,軸を書くだけでも疲れてしまう)
    2. ○ n を変更すると直ぐにグラフ全体が変わる
    3. × sin や sin^n とは別の関数を書きたい場合,関数の打ち込みと,そのコピーが必要である。 いちいち2つの操作が必要なのは面倒である。(一度の操作で済ませたい)
    4. × もしも複雑な関数を扱いたいなら,一つのセルに数式を書ききれないかもしれない。

    以上の良い点は,Excelがグラフ作成能力が高いということです。 一方,問題点は,セルで計算することでした。 そこで,計算を VBA (Visual Basic for Application) に任せ, Excel 自身はグラフ作成のみに専念させることにしましょう。

  3. VBAの準備(ただし図表はExcelに任す)

    それでは Excel + VBA で問題解決ということなのですが, 先ずは準備から。

    次の図は,1. で作った Book1.xls をコピーして Book2.xls とし, そのファイル(Book2.xls)のうちの セル群 A8:D368 を Delete (Del キーを押した)したものです。
    グラフは消去していませんので,セル群 A8:D368 に数値を書き込むとグラフ上に直ぐに反映されます。

    それでは VBA の準備を始めましょう。
    Excel のメニューバー上から,
    表示>ツールバー>コントロール ツールボックス
    を選びます。

    その結果,下に示すように「コントロール ツールボックス」が現れました。 (マシンによって,コントロールツールボックスの現れ方が変わる可能性があります。)


    コントロールツールボックスの最初の3つのボタンは特に重要です。
    デザインモード 開始/終了ボタン (デザインモードとは,VBA関連パーツを設定するモードです)
    プロパティボタン (今回の説明では使いません)
    コードの表示ボタン (プログラムを作成,編集するときに使います。デザインモード時に有効です)

    また,次のボタンも以下で使用します。
    「コマンドボタン」を作成するボタン

    以上で VBA を使うための準備が完了しました。

  4. VBAのプログラムを作る

    それでは早速プログラムを作ってみましょう。
    前の節までの準備は完了しているものとします。

    1. (デザインモード 開始/終了ボタン) を押してデザインモードに入ります。
      (この操作では,のボタンが "押された状態になる" だけで,特に何か変化したようには見えません。)
    2. コントロールツールボックス内の (「コマンドボタン」を作成するボタン)を押します。
    3. ワークシート上の好きな場所でマウスをドラッグします。 ドラッグした場所にコマンドボタンが現れます。

    注1:コマンドボタンは,最初は自動的に「CommandButton1」という名前になります。
    注2:コマンドボタンは,今から作るプログラムを格納する場所です。
    注3:また,コマンドボタンは,一旦作ったプログラムを実行するための起動スイッチになります。

    1. (コードの表示ボタン) を押してプログラム作成のモードに入ります。

    ここで現れたのが,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

  5. VBAプログラムの解説

    プログラム 解説
    全般的に 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
    自動的に作られますから特に気にする必要はありません。
    
    	プログラムの最後の行です。

  6. VBAプログラムの実行

    プログラムを打ち込んだら VBA ウインドウの右上の [×] ボタンを押して, VBA ウインドウを終了します

    続いて,(デザインモード 開始/終了ボタン) を押してデザインモードを終了します。

    最後に,今回作った「CommandButton1」というボタンをクリックすると,プログラムを実行します。

    下図は実行が完了した状態を表します。 一見では 1. で説明した画面と殆ど同じに見えますが,明らかな違いがあります。 それは,今回は,計算したのは VBA であり,Excel の セルは値を記憶するだけだという点です。 下図では,セルカーソルが セルC9 を指しています。 今回はセルC9の内容は単なる数値です。 (1. の場合にはこれらのセルには式が入っていました)

    今回のワークシートでは,計算が行われるのは「CommandButton1」というボタンをクリックしたときです。 従って,別の n の時の sin^n のグラフを見たいとき, セルB5 の値を変えるだけでなく,「CommandButton1」のクリックも必要です。

  7. VBAプログラムの修正

    改めてプログラムを修正するには, (デザインモード 開始/終了ボタン) を押してデザインモードに入り, (コードの表示ボタン) を押してプログラム修正のモードに入ります。

    プログラムを変えれば,様々なグラフを書くことが出来ます。 また,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)
    
    等々。

  8. VBAプログラムの保存

    VBAのプログラムは,Excel のワークシート内に埋め込まれます。
    従って,ワークシートを保存すると,一緒に保存されます。

    下の図の様に,Excel を終了すると,

    自動的に,保存するか聞いてくるので,「はい(Y)」と答えて保存します。

  9. VBAプログラムの再読み込みと,セキュリティ問題

    今までの説明で,とりあえず VBA の最小限を紹介しました。
    改めて,同じファイルを再読み込みすれば,同じプログラムを走らせることができます。
    しかし,ちょっと待ってください。セキュリティに関して,重要な問題があるのです。

    VBA は非常に多くの機能を持っています。 その気になると,例えば,「ハードディスク内の全てのファイルを消去する」 といった危険なプログラムを作ることも可能です。
    そのため,コンピュータ ウイルスが紛れ込む可能性が高いのです。
    (余談ですが,あなたは危険な環境でパソコンを使っていませんか? 危険な環境とは, Windwos me 系 (含む 98, 95) だったり, XP系 (含:2000やNT) でも Administrator 権限で使うことです。 (比較的)安全な環境は,XP系 (含:2000やNT) を用意して Administrator 権限以外でパソコンを使うことです。 その手のウイルスの被害を,自分のファイルだけに留める事ができる可能性が高いです。)
    安心してください。Excel には コンピュータ ウイルス対策が施されています。
    標準的な設定では,Excel は,「読み込んだ VBA を実行できない」可能性があります。
    先ほど保存した自分のプログラムを改めて実行するには, 「読み込んだVBAを実行できる」ようにする必要があります。

    まず,Excel のメニューバーから,
    ツール>マクロ>セキュリティ
    と操作して下さい。

    ここで,セキュリティレベルを「中」にして下さい。
    ★★★絶対に,低 にはしないで下さい★★★

    以上の操作で,セキュリティレベルは中にできたと思います。
    すると,ファイルを読み込む毎に下記の警告が表示されます。 ここで,「マクロを有効にする」ならば,「読み込んだVBAを実行できる」のです。
    ちなみに,セキュリティレベルが高では,読み込んだ VBA のプログラムは実行できません。
    セキュリティレベル低は,熟練者だけが使うようにして下さい。

  10. Excel と VBA を連携させる価値

    「はじめに」でも触れたように,VBA (BASIC言語) を使うことにより, 表計算ソフトでは返って面倒になるような計算を, 細かいところまで簡単に記述できます。 確かに BASIC の習得にはそれなりの学習は必要ですが, Excel だって計算機能を究めるにはそれなりの学習が必要ですから, 例えば将来 C 言語も勉強したいなら, 今のうちから BASIC も勉強したほうが良いと思います。

    更に,Excel ではグラフ書きが大得意ですから, 今回使用したように, VBA で計算した内容を,Excel でグラフ化するのがうまい使い方です。


    Excel の各セルは文字列を使うことが出来ます。 しかし,VBA も文字列を扱えますし, 数ある言語の中でも Basic の文字列の取り扱いやすさは, それほど悪いものではありません。 ですから,VBA と連携して文字列を扱わせてもよいのです。

  11. 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 の形式で書けるようにしたいものです。
    
    工事中