特集
» 2014年02月21日 10時20分 公開

いつもの設計シートをアプリに簡単変身! Excel VBA活用術これは使える! 設計現場のExcel(3/4 ページ)

[伊藤孝宏,MONOist]

タブオーダーの設定

 エンターキーを押すと、次の入力欄に入力待ちの状態が自動で移動すると、便利です。この順序を設定するのが、「タブオーダー」です。では、タブオーダーを設定してみます。ユーザーフォーム上でマウスを右クリックすると、図11に示すようなコンテクストメニューが表示されるので、一番下のタブオーダーを選択します。

図11 ユーザーフォーム上で右クリック

 すると、図12に示すタブオーダーの設定ウィンドウが表示されます。ここで、TextBox1→TextBox2→TextBox3→CommandButton1となるように、該当するものをクリックした後、「上に移動」や「下に移動」をクリックして、順番を整えてください。

図12 タブオーダーを設定

 CommandButton1以降のタブはTextBox1に戻るように、次に説明するコードで制御させるので、以降の順番はそのままでも構いません。

 ここで、出来上がりを確認してみましょう。ファイルを保存した後、F5キーを押す、ツールバー右向き3角形のアイコンをクリックあるいは、メニューの実行→マクロの実行のいずれかで、図2のようなウィンドウが表示されます。うまく表示されたら、次にGUI部品の動作を指示するコードを作成していきましょう。その前に、ウィンドウ右上の×をクリックしてウィンドウを閉じて、VBA Editorの状態に戻してください。

コードの記述

 GUI部品に、例えば、入力内容をセルに入力などと、動作を記述することで、プログラムが動作します。この作業がコードの記述です。コードを記述するには、プロジェクトウィンドウの左側のアイコン(コードの表示)をクリックし、GUI画面が表示されている右側のウィンドウをエディタ画面に切り替えます。ここに、図13に示すようなコードを記述していきます。

イベントドリブンとは?

 その前に、「イベントドリブン」と呼ばれるプログラム形式について説明します。プログラムを最初の行から順に処理するタイプはコマンドドリブン形式と呼ばれます。コマンドドリブン形式では、入力などの作業はプログラムからの要求に従うことになり、例えば図2のような、自動で設定される入力待ちの欄に入力したり、その前の欄を修正したり、あるいは、必要な欄だけを修正するといった多様な操作には対応できません。

 これに対して、イベントドリブン形式では、例えばTextBox1に変化があったら、指示された内容を行うし、なければ何も行わないという小さなプログラムの集まりを用意して、ユーザーフォームという大きなプログラム動作時には、内部を巡回し、指定された変化があったら、指示された動作を行います。小さなプログラムは、「Private Sub→部品名+変化の内容→動作の指示→End Sub」という流れで記述し、小さなプログラム同士の順番についての指定は必要ありません。

コードを書いていこう

 図13を基に具体的に説明します。

図13 動作設定コードを記述

 「Private Sub TextBox1_Change()」は、「TextBox1」に「Change」すなわち「変化があったら、次の行を処理しなさい」という意味です。次の行の「Sheet1.Cells(3,2)=TextBox1.Text」は、「TextBox1」の表示内容をSheet1の3行2列目のセルに入力しなさいという意味です。VBAでは、部品名.プロパティでその部品の大きさや色あるいは表示されているテキストなどの特徴を表します。また、セルはExcelシートでのA2などの表示とは異なり、「Cells(行,列)」で表します。「=」は等しいという意味ではなく、「右の内容を左に入力しなさい」という意味です。

 では、実際にコードを記述していきます。コードはエディタで直接記述することも可能ですが、GUI画面上で部品をダブルクリックすることで対応するコードを自動で用意させることも可能です。GUI画面とエディタ画面とは、プロジェクトウィンドウの左側(エディタ)と中央(GUI)のアイコンをクリックすることで切り替わります。GUI上でTextBox1をダブルクリックすると、Private Sub TextBox1_Change()とEnd Subの2行が自動で生成され、同時にエディタ画面に切り替わります。1行目と2行目の間に、Sheet1.Cells(3,2)=TextBox1.Textを追加してください。

 TextBox1に対するコードが出来上がったら、F5キーを押すなどで、プログラムを実行させてみてください。TextBox1に入力すると、背後に見えるExcelシートのB3のセルに入力内容が反映されます。うまく動作することを確認したら、TextBox2についても同様に記述します。その前に、ウィンドウ右上の×をクリックしてウィンドウを閉じて、VBA Editorの状態に戻してください。少々面倒ですが、1つずつ動作を確認していくと、デバッグ作業が容易になります。

 TextBox2とTextBox3はTextBox1と内容がほとんど同じなので、出来上がったPrivate Sub TextBox1〜End Subまでをマウスで選択し右クリック→コピーとして、End Subの次の行で右クリック→貼り付けとして、同じものを用意します。次にコピーされたもので、TextBox1をTextBox2に変更し、Cells(3,2)をCells(4,2)に変更といった修正を行うと、TextBox2に対するプログラムが出来上がります。TextBox3についても同様にして作成します。

 次に、「計算」ボタンの動作を記述します。GUI画面で「計算」ボタンをダブルクリックすると、Private Sub CommandButton1_Click()とEnd Subの2行が出来上がり、エディタ画面に切り替わります。この2行の間に、TextBox4.Text=Sheet1.Cells(7,2)と記述します。これは、Sheet1の7行2列目のセルの内容を、TextBox4のテキスト欄に入力しなさいという意味で、結果として、バネ定数の計算結果がTextBox4に表示されます。

 次の行にTextBox1.SetFocusと記述します。TextBox1.SetFocusとは、TextBox1にフォーカスを設定、すなわちTextBox1を入力待ちの状態にしなさいという意味です。部品名.動作でその部品に指定した動作を行わせることができます。これで、フォーカスはTextBox1→TextBox2→TextBox3→CommandButton1と移動し、CommandButton1をクリックすると、TextBox1にフォーカスが戻ります。

 図13の最後にあるPrivate Sub UserForm_Click()は、GUI上でユーザーフォームをクリックすると自動で生成されるもので、そのままにしても問題ありません。もちろん削除してもかまいません。ここまでできたら、F5キーを押すなどで、プログラムを実行させてみてください。入力欄に適当な数値を入力し、計算ボタンをクリックして、正しく計算された値が表示されたら、完成間近です。最後に、Excelファイルを開いたら、自動でウィンドウが表示されるようにコードを追加します。その前に、ウィンドウ右上の×をクリックしてウィンドウを閉じて、VBA Editorの状態に戻してください。

Copyright © ITmedia, Inc. All Rights Reserved.