【ExcelVBA】コントロールを画面に設置するときに覚えておくべきこととは?




こんにちは、ネコ好きフリーランスエンジニアのシロ(@siro3460)です。

前回から、ExcelVBAで簡単なアプリを作ってみようシリーズをお伝えしています。

前回の記事はこちら。

【ExcelVBA入門】ユーザーフォームで画面を新しく作る方法とは?

2018.05.30

ただ、画面に配置するテキストボックス、リストボックス、ボタンなどのコントロールの使い方については説明していなかったですよね。

そこで今回は、新しく作ったユーザーフォームにテキストボックスやボタンなどのコントロールを追加する方法について解説します!

ユーザーフォームの作り方の基礎については説明を除いているので、前回の記事をまだ見ていない方は先に見ることをおすすめします!
>> ユーザーフォームを新しく追加・実行・削除する方法とは?

コントロールとは?

コントロールと聞くとなじみがないかもしれないので、簡単に説明します。

コントロールとは、テキストボックス、リストボックス、チェックボックス、ボタンなどの画面を作るための要素です。

ユーザーフォームを作成後、コントロールを置いてからVBAのコードを書くことでアプリを作っていくことができます。

コントロールを使う上で覚えておくべき基礎知識とは?

次に、初めてコントロールを使う方向けに、簡単な使い方を説明します。

コントロールの配置方法

最初にコントロールを画面に置くための方法です。

直感的な操作なので覚えやすいですが、ツールボックスから画面に置きたいコントロールを選択し画面をクリックすることでコントロールを置くことができます。

例ではテキストボックスを選択していますが、画面に追加したいコントロールを選んでおくことで他のコントロール(ボタンやリストボックスなど)を簡単に置くことができます。

置いたコントロールはクリックしながらマウスを移動すると位置を変更することができます。

※ツールボックスが表示されていない場合は「表示タブ→ツールボックス」で表示することができます。

プロパティで設定値を変えることができる

コントロールを選択した状態で、プロパティウィンドウの値を変えることでコントロールの設定を変更することができます。

プロパティの項目はとても多いので、すべて覚える必要はありません。

ここでは、「コントロールを選択するとプロパティで設定が変更できる」とだけ覚えておきましょう。

※プロパティウィンドウが表示されていない場合は、「表示タブ → プロパティウィンドウ」を選択することで表示することができます。

ユーザーフォーム独自のVBAコードを開く方法

ユーザーフォームには、ボタンのクリック処理やリストボックスの初期値を最初にセットする処理などユーザーフォーム専用のコードを書く場所があります。

ユーザーフォーム専用のVBAコードは、「ユーザーフォームを右クリック → コードの表示」を選択することで表示することができます。

初期値設定用コード

リストボックスなど、初期値をあらかじめ設定する場合は画面起動時の処理を書く必要があります。

作成手順は次の通りです。

1. 右クリックでコードの表示をクリック

2. コードウィンドウの上にある、リストから「UserForm」「Initialize」を選択する

選択すると次のようなコードが自動で生成されます。

Private Sub UserForm_Initialize()

End Sub

・リストボックスに値をセットする場合
・日付など初期値として今日の日付を入力する場合
・Noなど自動で繰り上がる数字を入力する場合

など、初期値を入れる場合は必須です。

後程具体的な使い方を説明するのでここでは、「初期値をセットするコードを書くことができる」とだけ覚えておいてください。

ダブルクリックするとクリックイベントが自動で作成される

これは初めてユーザーフォームを作った時にやってしまいがちな操作なのですが、画面でコントロールをダブルクリックすると「クリック処理のコード」が自動生成されてしまいます。

ボタンのときはそのままクリック処理として使えるのですが、ボタン以外で使うケースは少ないため間違えてダブルクリックしてしまった場合はマクロを消しましょう。

「あれ?なんか急にVBAのコードウィンドウが表示されたぞ?」と思ったときは、大体この操作なので覚えておくと焦らずすみます。

【厳選】これだけは覚えておきたい、各コントロールの使い方とは?

「コントロールを選択してプロパティウィンドウの値を変更すれば、設定値を変えることができる」と説明しましたが、プロパティウィンドウの項目は数が多いので、いきなり全て覚えるのはキツイです。

というか、僕もすべては覚えていません。笑

「よく使うプロパティだけ覚えて、他は使うタイミングで調べて使っていく」方が圧倒的に学習効率が良いですしね。

知識だけ詰め込もうとすると、頭がパンクするか覚えたつもりで全く覚えていない状態になりがちなので、ここではよく使うプロパティだけを厳選して解説します。

といってもそこそこ量はあるので、「こんなことできるんだなー」程度にまずは覚えて、実際に使いながら覚えていってください。

コントロール全体

まず、コントロール全体のプロパティで覚えておくべき設定について説明します。

オブジェクト名を設定する

オブジェクト名は、設置したコントロールのID名です。

コントロールを置いた後、最初に設定するプロパティですね。

コントロールを選択後プロパティを見ると一番上にオブジェクト名があります。

VBAのコードから「オブジェクト名.〇〇」のように値を変更したり、取得したりするためわかりやすい名前に変更してください。

ラベル       :lbl〇〇〇
テキストボックス  :txt〇〇〇
コンボボックス   :cmb〇〇〇
チェックボックス  :chk〇〇〇
オプションボックス :opb〇〇〇
ボタン       :btn〇〇〇

のように、先頭3文字で何かわかるような名前にしておくのがおすすめです。

Captionで表示名を変えることができる

主にラベル、オプションボタン、ボタンなどで使うのですが、Captionで表示する文字を変更することができます。

Fontで書式を変えることができる

Fontでフォント名、文字サイズ、太字化など文字の書式を変更することができます。

Fontの右側に表示されるボタンをクリックしてください。

クリックすると、書式を変更するウィンドウが表示されるので、変更したい箇所を変更することで変えることができます。

ラベル

ラベルは全体で説明した、オプションのCaption、Fontなどの表示する文字に関しての設定方法を覚えておけば基本的に問題ありません。

文字の表示名をVBAのコードから変えたい場合は、「オブジェクト名.Caption = “表示する文字”」で変えることができるので合わせて覚えておきましょう。

テキストボックス

テキストボックスは値の取得方法、入力時に設定するオプションなどを覚えておきましょう。

値の取得・設定方法

オブジェクト名.Value」で値を取得、設定することができます。

テキストボックスのオブジェクト名は「txtName」にしています。

テキストボックスを置いた画面のサンプル:

VBAのサンプルコード:

Sub Test()

  '入力された値の確認
  MsgBox "名前に入力された値は【" & txtName.Value & "】です。"

  '値の変更方法
  txtName.Value = "変更した値"
  MsgBox "変更後の値は【" & txtName.Value & "】です。"

End Sub

【オプション】IMEMode:入力モード

IMEModeを変更することで、入力モードを変更することができます。

数値や文字など予め入力するタイプが決まっている場合は、変更しておくと便利です。

選択する項目はいろいろありますが、以下で変更できることだけ覚えておけばOKです。

初期値:0 – fmIMEModeNoControl
文字列:4 – fmIMEModeHiragana
数値 :8 – fmIMEModeAlpha

※初期値にすれば、指定なしの状態に戻すことができます。

【オプション】MaxLength:入力最大文字数

MaxLengthを設定することで、最大で入力できる文字数を設定しておくことができます。

数値を入力する項目などで、入力ミスをなくすためにも設定しておくと便利ですね。

コンボボックス(リストボックス)

コンボボックスと聞くとなじみがないかもしれませんが、いわゆるリストボックスのことです。

コンボボックスは最低限の設定、初期値の追加方法、値を取得方法などを覚えておきましょう。

【オプション】Style:コンボボックスの選択タイプ変更

初期状態だと「テキストボックスのように入力可能かつ選択もできるリスト」になっていて、少し使いづらいです。

Styleを変更すると、コンボボックスをリストボックスのように使うことができるので、最初に「2」に変更しましょう。

初期状態        :0 – fmStyleDropDownCombo
リストボックスにする場合:2 – fmStyleDropDownList

リストの初期値を追加

コンボボックスは、プロパティからリストの初期値を設定することができません。

コントロール全体で説明した「UserForm_Initialize」内にリストの初期値を追加する処理を書いておく必要があります。

オブジェクト名.Additem リストで選択する値」でリストを追加することができます。

オブジェクト名がcmbStatusだった場合の、初期値設定コードは次の通りです。

Private Sub UserForm_Initialize()
  
  cmbStatus.AddItem "未対応"
  cmbStatus.AddItem "対応中"
  cmbStatus.AddItem "遅延"
  cmbStatus.AddItem "完了"

End Sub

設定後は、実行ボタンまたはF5キーで画面を実行し、リストの値を確認してみてください。

リストで選択した値を取得する方法

オブジェクト名.Value」でリストで選択した値を取得することができます。

Sub Test()

  MsgBox "選択した値は【" & cmbStatus.Value & "】です。"

End Sub

チェックボックス/オプションボタン

使い方が似ているため、チェックボックスとオプションボタン(ラジオボタン)は一緒に覚えると便利です。

表示名についてはラベル同様Captionで変えることができるので、ここではチェック状態の取得・変更方法を覚えておきましょう。

チェック状態を変更・取得する方法

プロパティからValueを変更することで、画面実行時のチェック状態を変えることができます。

True :チェック
False:チェックなし

また、VBAのコードでも同じように「オブジェクト名.Value」でチェック状態を確認、変更することができます。

チェックボックスのオブジェクト名がCheckBox1、オプションボタンのオブジェクト名がOptionButton1だった場合のサンプルはコチラ

Sub Test()
  'チェックボックスの値をメッセージで確認する場合
 Msgbox "チェックボックス1の値は:" & CheckBox1.Value
  Msgbox "オプションボタン1の値は:" & OptionButton1.Value

  'チェックボックスに値を入れる場合
  CheckBox1.Value = False
  OptionButton1.Value = False

End Sub

コマンドボタン

登録ボタン、削除ボタン、検索ボタン、実行ボタンなどクリック処理を実行するためのボタンを作る場合は、コマンドボタンを使います。

ボタンの表示名、フォントなどはラベル同様変更することができるので説明は割愛し、ここではクリック処理の作り方を覚えておきましょう。

クリック処理の作り方

ボタンを設置後にボタンをダブルクリックすることで、クリック処理「ボタンのオブジェクト名_Click()」を自動生成することができます。

この中に処理を書くことで、ボタンクリック時の処理を書いていくことができるわけですね。

【総復習】簡単なサンプルを作ってみよう!

最後に、今までの説明の総復習の意味もかねてサンプルを作ってみたいと思います。

今回は次のようなExcelシートにデータを登録するサンプルを用意しました。

1. 画面に必要なコントロールを配置
最初に画面を作ります。

今回は簡単な登録画面を以下のように用意しました。

オブジェクト名はそれぞれ以下のように設定しています。

Noのテキスト       :txtNo
ステータスのコンボボックス:cmbStatus
タスク名のテキスト    :txtTask
納期のテキスト      :txtDerivary

2. リストの初期値を追加
ステータスのリストに初期値をセットするため、初期値を追加する処理を書きます。

「右クリック→コードを表示」を選択して、コードウィンドウで以下追加します。

Private Sub UserForm_Initialize()
  
  cmbStatus.AddItem "未対応"
  cmbStatus.AddItem "対応中"
  cmbStatus.AddItem "遅延"
  cmbStatus.AddItem "完了"

End Sub

追加後は一旦実行してリストに追加されているか確認します。

3. ボタンクリック処理を作成
ユーザーフォームのボタンをダブルクリックして、クリック処理を追加します。

4. ボタンクリック処理にデータを登録する処理を書く
クリック処理に、シートに入力した項目を書き込む処理を追加します。

Private Sub btnRegist_Click()

  '1. 画面から入力した値を格納するための変数を宣言
  Dim intNo As Integer       'No
  Dim strStatus As String    'ステータス
  Dim strTask As String      'タスク
  Dim intDelivery As String  '納期

  '2. 画面から入力した値を取得
  intNo = txtNo.Value
  strStatus = cmbStatus.Value
  strTask = txtTask.Value
  intDelivery = txtDelivery.Value
  
  '3. セルに値を書き込む位置を取得
  Dim intWriteRow As Integer
  intWriteRow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1 '「2列目の最大行数 + 1」で書き込む行を取得
  
  '4. セルに値を書き込む
  Cells(intWriteRow, 2).Value = intNo
  Cells(intWriteRow, 3).Value = strStatus
  Cells(intWriteRow, 4).Value = strTask
  Cells(intWriteRow, 5).Value = intDelivery
  
  '5. 登録完了メッセージを表示
  MsgBox "新しいデータを登録しました。"

End Sub

処理はコメントの通りですが、「3」のセルに書き込む位置を取得する処理についてはいきなりだとよくわからないと思うので、少し解説します。

「表示しているシートの2列目で、一番下のセル(B1048576)から一番上に移動して最初にヒットした行に1を足した行数」を取得しています。

なんのこっちゃという感じですが、画像で見るとイメージしやすいです。

こうしておくことで、「データが登録されている次の行に新しくデータを追加する処理」にすることができるわけですね。

5. 画面を実行して動作を確認する
最後に、動作を確認します。

ユーザーフォームを選択し、F5キーで画面を実行してからすべての項目を入力して登録ボタンをクリックしてください。

「新しいデータを登録しました。」のメッセージが表示されたら、メッセージと画面を閉じてExcelシートにデータが登録されていることを確認してください。

これで作成完了です。

まとめ

今回は、ユーザーフォームに設置するコントロールの使い方に関して使い方を徹底的に解説しました!

シートからボタンをクリックして実行する方法ユーザーフォームを新規作成する方法→今回の記事

の流れで作っていけば、簡単なツールを作れるようになると思います。

ぜひ、実際に手を動かして作ってみてくださいね!

The following two tabs change content below.

Siro

ネコ好きフリーランスエンジニア。
開発、技術、働き方、ツールなどについて発信しています。
楽しく、開発しようぜ!