多少のVBAができるようになったので、ユーザーフォームに挑戦したの。
で、もうバッチリわかったの?
それが・・。
入門書を読んで、初めの数ページで挫折したの。
ユーザーフォームとエクセル表が、どのように関連しているのかがわからないの
それじゃあ、超簡単な事例で説明してあげよう。
お願いします。
それでは、エクセル表内での命令文やユーザーフォーム内での命令文がどのように紐づけられているかがわかる様に説明していきたいと思います。
ただ、多少のVBAの知識があることを前提としてご説明します。
使用するする画面等
・エクセル表の画面とエクセル表上にボタン
・ユーザーフォームの画面 ・入力ボックス(TextBox)
・コマンドボタン(CommandButton)
*最小限のオブジェクトに絞りました
概要
第1ステップ ユーザーフォームを作り、入力枠に5を入力して、ボタンを押すと エクセル表に5を表示させる
順序として
- ユーザーフォームを作る(見た目の形を作る)
- ユーザーフォームに入力枠とコマンドボタンを作る
- ユーザーフォームに命令文を書く
- 入力枠に5を入力しボタンを押すとエクセル表に5を表示させる
きわめて単純な例ですが、ユーザーフォームを作る過程をイメージしやすいように超シンプルな例にしました。
第2ステップ 順序は逆になりましたが、ユーザーフォームを呼び出すためには、エクセル上にボタンが必要です
- エクセル表にボタンを作る
- ボタンを押すとユーザーフォームを表示されるようにボタンとユーザーフォームを紐づける
第3ステップ これだけでは全く実用的でないので、ちょっとだけ実用的に使えるようなコードを付け加えます
第1ステップ ユーザーフォームを作り、入力枠に5を入力して、ボタンを押すと エクセル表に5を表示させる
つぎの手順でユーザーフォームを呼び出します。(図1)
開発 ⇒ Visual Basic ⇒ (Visual Basic Editor(VBE)が起動)⇒ (VBE)挿入
⇒ユーザーフォーム表示される(UserForm1が起動)
(図1)
このユーザーフォーム上に「TextBox」枠と「CommandButton」を作ります。
まず「TextBox」枠
ツールボックスの「TextBox」をクリックして、カーソルをユーザーフォーム上に持ってくと十字線に変わるので枠を作ります。(図2)
(図2)
次は「CommandButton」ボタン。
ツールボックスの「CommandButton」をクリックして、同じようにユーザーフォーム上で作ると、今度は立体的なボタンになります。(図3)
(図3)
そのCommandButtonをダブルクリックするとコードを書く画面(コードウィンドウ)が出ます。
コードウィンドウには下のコードが表示されます。(図4)
Private Sub CommandButton1_Click() End Sub |
(図4)
自動的にこのコードが表示されるので CommandButtonボタンをクリックしたときに実行したい命令文をその中にコードを書くだけです。
ポイントは自動的に付与され命令文の名前です。CommandButton1_Clickとあります。
左のプロパティウィンドウにも「CommandButton1」というオブジェクト名が書いてあります。
この名前のオブジェクトをクリックすると命令が実行されるということなので、ここでCommandButtonボタンと命令文が紐づけされてます。
そしてその命令文のコードですが、
ボタンをクリックすると、テキストボックスに入力された値をエクセル表に表示させるコードを考えてみます。
例えば、
エクセル表のセルA1に入力した値を表示するには、
Range(“A)= 「テキストボックスに入力された値」と書けばいいですね。
「テキストボックスに入力された値」というのはこのオブジェクト名を書けばよい。
テキストボックス枠をクリックすると、プロパティウィンドウにオブジェクト名が書いてあります。TextBox1と自動的に名前が付与されてます。(*オブジェクト名は変更できます)
なのでRange(“A)= TextBox1.Textというコードを書けばよいだけです。
*テキストボックスの文字列を取得するには、Textプロパティを使用します。
つまり
Private Sub CommandButton1_Click() Range(“A1”) = TextBox1.Text End Sub |
となります。
それではコードが書いてある画面にカーソルを置き、
上のタブの▷印をクリックして実行します。(図5)
(図5)
そうするとエクセル表にユーザーフォームが表示されます。(図6)
テキストボックスに たとえば5を入力してCommandButtonを押すと
エクセル表のセルA1に5が表示されました
これでユーザーフォームのTextBox1 と エクセル表のA1セルが紐づけられました。
(図6)
ポイントは
- テキストボックス枠にも名前(オブジェクト名)が決まっているということ。
- 今の命令文はUserForm1内で命令文のコードが書かれていること
第2ステップ 次ぎに、順序が逆になりましたが、エクセル表上にユーザーフォームを呼び出すためのボタンを作ります。
エクセル表のタブから⇒挿入⇒フォームコントロール⇒右上のボタン(フォームコントロール)をクリッ)クして(図7)⇒カーソルをエクセル表の上に持っていくと十字線に変わるので四角形を作ります。
(図7)
⇒するとマクロの登録というウィンドウが現れる。マクロ名として「ボタン1_Click」と表示されるので
⇒マクロの登録⇒新規作成をクリックすると(図8)コードを書くウィンドウが表示される。
(図8)
予め
Sub ボタン1_Click() End Sub |
が書かれたウィンドウが表示されます。
このコードの中に、ボタンをクリックしたときの命令文を書くだけです。
ボタンを押すとユーザーフォームを呼び出したいので、書くコードは
UserForm1.Show です。
*ユーザーフォーム(オブジェクト)を表示させるには、Showメソッドを使用し、 オブジェクト名.Show とする
つまり
Sub ボタン1_Click() UserForm1.Show End Sub |
これでUserForm1 というユーザーフォーム と エクセルのボタンが紐づけられました。
ではエクセル表のボタンを押してみましょう。
第1ステップで作ったユーザーフォームが出てきます。
入力欄のテキストボックスの中に、例えば 「A」 を入力し、
ボタンを押すと、エクセル表のA1 セルに「A」が表示されます。(図9)
(図9)
エクセル表の命令文とユーザーフォームの命令文を図に表すとこんな感じです。(図10)
- エクセル表上のボタンを押すと標準モジュールのUserForm_1.showの命令が実行されユーザーフォームが起動
- ユーザーフォームのCommandButtonボタンを押すとRange(“A1”) = TextBox1.Textの命令が実行され、エクセル表のセルA1に値が入力表示される
(図10)
第1ステップと第2ステップで、エクセル表とユーザーフォームとの関連付けがイメージできたかと思います。
ただこれだけでは全く実用的でないので、もう少しだけコードを補足しましょう。
第3ステップ これだけでは全く実用的でないので、ちょっとだけ実用的に使えるようなコードを付け加える
今の段階では、ユーザーフォームのテキストボックスに値を入力しても エクセル表のA1セルに上書きされるだけです。
実務的には、A1セルに表示させると 次の入力した値はA2セルに、次に入力した値はその下に表示させたいですね。(図11)
(図11)
次はその命令文のコードを補足します。
結論から言いますと次のようなコードです。
標準モジュール | Sub ボタン1_Click() UeserForm1.Show End Sub | ⇒ | Option Explicit Public NextA As Range ———————————– Sub ボタン1_Click() Set NextA = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) UeserForm1.Show End Sub |
ユーザーフォーム | Private Sub CommandButton1_Click() Range(“A1”) = TextBox1.Text End Sub | ⇒ | Private Sub CommandButton1_Click() NextA = TextBox1.Text Unload Me End Sub |
まず標準モジュールに追加していきます。
エクセル表の最終行の1行下の行を取得して その変数を ユーザーフォームでもその変数を使用したいのでパブリック変数を宣言します。
最終行の1行下の行を
これを仮にNextA というRangeオブジェクトとして
Public NextA As Range と宣言します。
*違うモジュールで同じ変数を使用するときには、初めにPublic変数を宣言する。
そしてSetステートメントを使います。最終行の1行下は、 Cells(Rows.Count,1).End(xlup).Offset(1,0) というコード。
これをNextA に代入するので、
つまり
Set NextA = Cells(Rows.Count,1).End(xlup).Offset(1,0)
となります。
これをSub ボタン1_Click() プロシージャの中
UserForm1.Show
の上に追加します。
Option Explicit Public NextA As Range ——————————————– Sub ボタン1_Click() Set NextA = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) UeserForm1.Show End Sub |
くどいようですが、上のコードは標準モジュール内に記述です。
次はユーザーフォーム内のCommandButtonの命令文の変更です。
Range(“A1”) = TextBox1.Text
となっています。
このままでは、セルA1に上書きされるだけです。
次の行に入力表示させるには
「Range(“A1”)」を 変数宣言をした「NextA」に変更するだけです。
つまり
Private Sub CommandButton1_Click() NextA = TextBox1.Text End Sub |
ついでに、ボタンを押したときにユーザーフォームが閉じるようにしておきたいので
Unload Me
を追加します。
Private Sub CommandButton1_Click() NextA = TextBox1.Text Unload Me End Sub |
今回は ユーザーフォームの初めの段階で、挫折しないよう最低限の項目に絞り、イメージしやすいよう心掛けました。ユーザーフォーム学習のヒントになれば幸いです。
コメント