UPDATE 2003/2/25 NEW 2003/2/24
参考にしました:
  • Visual Basic for Application 入門 (1999)
    http://202.236.222.44/class/old/VBA1999.pdf
    沼津工業高等専門学校,物質工学科,小林美学

VBAつかいませんか

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

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

ところで,電気電子工学を教える立場からBASICのことを考え直すと, かなり良いところがあると思います。 それは,シミュレーションを行う際など,手軽に使える 「超高機能電卓」 として使えるからです。 確かに今の表計算ソフトはかなりのことができますが, BASICを使えば,更に細かいところまで簡単に記述できます。 (BASIC である限り,それなりの学習は必要ですが, Excel と言えども計算機能を究めるにはそれなりの学習が必要です。 C言語への発展を考えているなら,むしろ BASIC を勉強したほうが良いと思います)

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


もくじ:
  1. VBAの起動
  2. VBAの最初のプログラム
    ・・・プログラムの環境作り
    ・・・プログラムの打ち込み
    ・・・プログラムの実行
  3. Excel と VBA の連携(1) … ワークシートで入出力
  4. Excel と VBA の連携(2) … ボタンをワークシートに埋め込む
  5. プログラムの保存
  6. プログラムの再読み込みと,セキュリティ問題
  7. Excel と VBA を連携させる価値
  8. VBA 文法の概要
  9. download サンプルワークシートBook1.xls

VBAの起動

この文章を読んでいるということで,Windowsの起動法と,Excelの起動法は略します。
次の図はExcelが起動したところです。
ファイル名は「Book1.xls」です。

続いて,Excelのメニューバーから,
ツール>マクロ>Visual Basic Editor
を選択します。

下の図は,VBAが起動したところです。

VBAの最初のプログラム

それでは早速プログラムを作ってみましょう。
最初は,元祖 Visual Basic (これもマイクロソフト社の製品です) の作法に乗っ取った,正統派ウインドウ プログラムです。
即ち,小さなウインドウが現れて実行するプログラムとなります。

プログラムの課題は,1 から n までの数の和を求めることにします。 そのためには,
○ n の入力
○ 和を求めるプログラムの起動
○ 結果の表示
が必要です。

プログラムの環境作り

まず最初に,VBAのメニューバーから,
挿入>ユーザーフォーム
を選択します。

すると,UserForm1が作られました。(下図参照)
フォーム(UserForm)を簡単に説明すると,実行時に現れるウインドウのことです。

また,ツールボックスも現れました。

続いて,UserForm1 上に,プログラムに必要なものを幾つか並べます。


課題が1 から n までの数の和を求めることですから,
○ n の入力
○ 和を求めるプログラムの起動
○ 結果の表示
が必要です。そのための環境を一つ一つ作ってゆきます。

ここで1番目に並べるのはテキストボックスです。
テキストボックスは,1行のテキストを書き込むことができます。 プログラム中では n の入力に使います。(使い方は後述)

テキストボックスの作り方は,次の通りです。
1. ツールボックスの中の テキストボックスを,マウスでクリックします。
2. フォーム上の必要な場所で,マウスをドラッグします。
一旦作られたテキストボックスについて,縁の小さな四角をドラッグすることで,サイズが変わります。

ここで2番目に並べるのはコマンドボタンです。
プログラム中では VBAプログラムの起動に使います。(使い方は後述)

作り方は,テキストボックスの時と同様です。

ここでは3番目(最後)に並べるのはリストボックスです。
リストボックスは,複数行のテキストを書き込むことができます。 プログラム中では結果の出力に使います。(使い方は後述)

作り方は,テキストボックスの時と同様です。

プログラムの打ち込み

UserForm1 上の「CommandButton1」 を ダブルクリックすると, 次のような画面になります。

新たに現れた画面は,Book1-UserForm1(コード) というものです。 ここにプログラムを書くことができます。
VBA実行時に「CommandButton1」をクリックすると, ここに書かれたプログラムが実行されます。
なお,この図では,プログラムの開始と終了のみ書かれていますので, もしもこの図のままでは, VBA実行時に「CommandButton1」をクリックしても, 何の処理も行われません。

それではプログラムを書きましょう。
プログラムの解説は,図の後にします

プログラム 解説
全般的に VBA内では,名前は XXXX.YYYYY という風に,ピリオドで区切られるものがあります。 これは,XXXX のうちの YYYYY という特性(操作) と考えてください。
Private Sub CommandButton1_Click()
自動的に作られますから特に気にする必要はありません。
プログラムの最初の行です。
ListBox1.Clear
ListBox1 の 内容を クリアします。
s = 0
変数 s を 0 とします。
VBA では定義しない変数をいきなり使うことができます。
For i = 1 To TextBox1.Value
For は繰返し処理を行います。Next までのプログラムを繰り返します。
繰返しの回数は,i という変数で数えます。
繰返しの回数は,TextBox1.Value で与えます。
    s = s + i
i の値を s に加えてゆきます。
    ListBox1.AddItem ("項" & i & " 和" & s)
ListBox1.AddItem という処理は,ListBox1 に対して行を付け加えることです。 本来,何行目に付け加えるか指定することも可能ですが, 今回の様に使う場合は,新しい行は最後に付け加えられます。
ListBoxに付け加えるのは文字列です。今回は,文字列は,
"項" & i & " 和" & s
という演算から作りました。
ここで,i という数字を,& という演算していますが, VBA が自動的に変数 i の内容を表す文字列を作り, 文字列同士の継ぎ合わせをしてくれます。 結果は次の次の図を見よう!!
Next i
繰返し処理の最後の行です。
End Sub
自動的に作られますから特に気にする必要はありません。
プログラムの最後の行です。

プログラムの実行

プログラムを実行させるには,VBAのメニューバーから,
実行>Sub/ユーザーフォームの実行
を選びます。

Book1 上に,先ほど作った UserForm1 が現れました。
UserForm1 上には,TextBox1, CommandButton1, ListBox1 もあります。

それでは,実際に動かしましょう。
まず TextBox1 内に,n の値を打ち込み,
続いて CommandButton1 をクリックします。
すると ListBox1 に結果が表示されます。
今回は,1〜11 の和を求めましたら,答えは 66 です。

Excel と VBA の連携(1) … ワークシートで入出力

先ほどのプログラムでは,VBA だけで独立してプログラムを走らせました。
しかし,それではもったいない。 せっかく Excel を使っているのだから,Excel の各セルを入出力に使いたいものです。

そこで,Sheet1.Cells というキーワードを覚えてください。
このキーワードを使うと,Excel の任意のセルの値を VBA で使えます。

使用例を次に載せます。赤い色が,先ほどから修正した点です。 解説と実行例が後ろに続きます。

実行前に,A の列のセルに値を設定しています。

「CommandButton1」をクリックした後の画面です。計算結果が C の列のセルに現れました。

v = Sheet1.Cells(i, 1) により, i 行 1列 即ち,A列の i 番目のセルの値を参照し,変数 v に書き込みます。

Sheet.Cells(i, 3) = s により, i 行 3列 即ち,C列の i 番目のセルの値に 変数 s の値を書き込みます。

Excel と VBA の連携(2) … ボタンをワークシートに埋め込む

更に VBA と Excel の連携を強めたいと思います。
ボタンをワークシートに埋め込みましょう。 そうすれば,全てワークシート上で処理が可能です。

そのためには,ワークシート上で VBA のパーツを使う準備が必要です。
Excel のメニューバー上から,
表示>ツールバー>コントロール ツールボックス
を選びます。

続いて,コントロール ツールボックス から コマンドボタンを選び出し,
そのコマンドボタンをクリックし,
ワークシート上でドラッグしてコマンドボタンを作ります。

すると,先ほども見た VBA のウインドウが現れます。

ところで,先ほども CommandoButton1 を作り, 今回も同じく CommandoButton1 を作ってしまったのですが, 名前が同じだと不都合は無いのでしょうか?
このページで作ってきたコマンドボタンは,実は,
1回目(以前):Book1.UserForm1.CommandButton1
2回目(今回):Book1.Sheet1.CommandButton1
となりますので,厳密には区別されているのでした。
また,どちらかで新たなボタンを作ろうとすると, CommandButton2 というふうに,自動的に別の数字が割振られます。 また,希望があるなら手動で CalcSubButton というふうに変更しても良いのです。

それではプログラムを打ち込みましょう。

実行させると,下の図の様に答えが現れます。

Excel の各セルの内容は,数値でも文字列でも可能です。
今回,A と C の列は 数値として,D の列は文字列として計算しました。

プログラムの保存

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

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

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

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

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

VBA は非常に多くの機能を持っています。 その気になると,例えば,「ハードディスク内の全てのファイルを消去する」 といった危険なプログラムを作ることも可能です。
そのため,コンピュータ ウイルスが紛れ込む可能性が高いのです。

安心してください。Excel には コンピュータ ウイルス対策が施されています。
標準的な設定では,Excel は,「読み込んだ VBA を実行できない」可能性があります。
先ほど保存した自分のプログラムを改めて実行するには, 「読み込んだVBAを実行できる」ようにする必要があります。

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

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

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

Excel と VBA を連携させる価値

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

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

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

工事中