※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|ユーザーフォームの作り方とコントロールの配置方法

エクセルVBAのユーザーフォームとは

エクセルVBAのユーザフォームとは

VBAをつかったマクロ開発ではユーザーフォームを作成できます。ユーザーフォームとは、コントロールとよばれるテキストボックスラベルリストボックスコンボボックスなどを自由に配置し、フォームの作成・利用ができるVBAの機能のことです。

エクセルのユーザフォームの例
UserForm_image01

ユーザーフォームを作ることで、マクロを動かすための操作方法や、処理による結果などがユーザーにとって直感的で理解しやすくなる効果があります。

この記事では、VBAでユーザーフォームをつかったマクロ開発をするために、ユーザーフォームに関する基本的な知識や、ユーザーフォームの作り方などについて紹介していきます。

親しみやすく、直感的にわかりやすいユーザーフォームを作ることで、プログラムに関する知識がなくても高度な処理を実行するマクロが操作できるようになります。簡単な操作で高度な処理ができるようになれば、複数人でおこなう作業でも精度を均一にしたり、属人化することの防止効果が期待できます。

ユーザーフォームを作ると誰にでも使いやすいシステムが作れるようになるよ。

エクセルVBAにおけるユーザーフォームの基礎知識

ユーザーフォームの基礎知識

冒頭にも記載したとおり、VBAのユーザーフォームは、ExcelやAccessなどのOfficeアプリケーションにおいて、ユーザーが直感的に操作できるGUI(Graphical User Interface)を実現するためのオブジェクトです。

ユーザーフォームは、テキストボックスやコンボボックスなどのコントロールと呼ばれるパーツを配置することで、ユーザーが入力・選択する情報を収集し、VBAでそれらを処理するためのインターフェースをつくることができます。

ユーザーフォームで実現できること

ユーザーフォームでは、データの入力、編集、削除、検索、表示などの機能を持つフォームが作成できます。また、グラフやチャート、ボタン、メニューなどのコントロールを組み合わせることで、より複雑なUI(User Interface)を作れます。

ユーザーフォームは、VBAの「UserForm」オブジェクトを使用して作成します。これは、ExcelやAccessなどのOfficeアプリケーションに標準で用意されている機能であり、VBAで簡単に利用できます。

次項からは、ユーザーフォームの作成手順を追いながら説明をしていきます。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセルVBAのユーザーフォームの作り方

ユーザーフォームをつくるためには、エクセル(Excel)の初期画面から開発タブをクリックして、VBE(Visual Basic Editor)を選択して起動します。

ユーザーフォームの作り方(VBEの起動からユーザーフォームの作成まで)

具体的な手順としては、以下の画像のように操作します。

エクセル初期画面からVBEを起動するまでの手順画像(開発タブをクリックする)
エクセル初期画面からVBEを起動するまでの手順画像(VBEをクリックする)

上記の手順を行うことでVBEが起動します。
VBEが起動したら以下の画像にしたがってユーザーフォームを作成します。

VBEでユーザーフォームを作成する手順を説明する画像1

ユーザーフォームが作成され、以下のような初期画面が表示されます。

これで、VBEでユーザーフォームを作成する準備が整いましたので、次項からはユーザーフォームの作成手順を説明していきます。(※この画面を起動したときに、上の画像のようにツールボックスが表示されていない場合は、[表示]タブから[ツールボックス]を選択して表示してください。)

ユーザーフォームの作り方(コントロールを配置してフォームをデザインする)

さて、いよいよユーザフォームを作っていく手順となりますが、まずはデザインをつくっていきしょう。

ユーザーフォームはわかりやすく作ることが大切です。いろいろなアプリの操作画面をマネしてみると良いよ!

ユーザーフォームを作成するには大きく分けて3つの手順があります。

コントロールとは、ユーザーフォーム上に配置できるパーツのようなものです。コントロールには、いくつもの種類があり、用途に応じてフォームに配置することで直感的な操作がしやすいフォームが作れます。

コントロールの種類については以下のとおりです。

コントロール名 用途
ラベル フォームにタイトルをつける、ユーザーに簡単な指示を説明するなどの目的で使用することにおすすめ。
テキストボックス フリーライティングのテキスト入力エリアとして使用することがおすすめです。
編集不可にすることでラベルのようにつかうこともできる。
コンボボックス テキストボックスとリストボックスを合わせたようなコントロールです。
フリーライティングで書くも良し、リストから選択するも良い場合なら、こちらの設置がおすすめ。
リストボックス 複数の項目から1つ、または複数の項目を選択してもらうことができるコントロールです。
決まった項目の内からユーザーに選択を促します。
チェックボックス 指定したテキストとともに表示され、チェックのON/OFFの切替をします。
オプションボタン 指定したテキストとともに表示され、ON/OFFの切替をします。
一般的に使いかたとして、オプションボタンの選択肢が2つ以上ある場合、片方がONなら、もう一方はOFFとなる関係に使用することが多いです。
トグルボタン 表示/非表示、編集/閲覧などの状態の切替などで利用する場合に使用します。
フレーム ラベル付きの四角い枠を表示します。
フレーム内に他のコントロールを配置することで、ユーザーに視覚的なグループとして見やすいものとします。
コマンドボタン 処理の実行や、キャンセルなど実行の契機として使われることが一般的です。
タブ ストリップ タブを配置します。
特徴としては、タブに設置したコントロールは、それぞれのタブで共有されます。
マルチページ タブ ストリップと同じようなコントロールですが、異なる点として設置したコントロールは、ページごとの個別のあつかいです。
スクロールバー 両端の矢印か、スクロールボックスをドラッグすることでページ内の移動ができます。
また、数値を入力するテキストボックスなどと連動させることで、数値の増減を直感的に操作できます。
スピンボタン 両端の矢印で増減の調整が可能です。
スクロールバーとの違いはスクロールボックスがなく、ドラッグができない点です。
イメージ ビットマップ、JPEG、GIF などの画像を埋め込み表示できます。
フォームにロゴや、ヘッダなどを埋め込むことでフォームのデザイン性が向上したい場合におすすめです。
RefEdit ワークシートからセル範囲を選択する機能が実行できます。範囲を指定したセル範囲を返します。

上記のコントロールより、フォームの上に設置したいコントロールを組み合わせることで、オリジナルのユーザーフォームを作成していきます。

2.コントロールの位置や大きさを調整する

ユーザーフォーム上に設置するコントロールの位置や大きさを調整します。マウスを使ってドラッグ操作などで調整していきます。

まずは、ベースのユーザーフォームの大きさを調整する。

イメージとしては画用紙の大きさを調整する感じです。後から調整が可能なので、大きめにしておくとコントロールの設置などの作業がしやすくなります。

サンプルユーザーフォーム
ユーザーフォーム作成時のベースとなるフォームの大きさを調整する手順を視覚的に説明する画像

ベースの上にコントロールを設置し、位置や大きさを調整する。

ベースにパーツを設置していくイメージです。ユーザーフォームは、使用者にとって直感的に操作しやすいものとなるようにつくることが大切ですが、ひとまずはそれぞれのコントロールがどういったものかを確認する上でも、ベース上に好みのコントロールを設置してみましょう。

サンプルユーザーフォーム
ユーザーフォーム作成時のコントロールの位置や大きさを調整する手順を視覚的に説明する画像

本記事では、できるだけたくさんの種類のコントロールをつかってフォームを作りたいと考えましたので、以下のようなユーザーフォームを作成してみました。

サンプルユーザーフォーム

今回のサンプルフォームとして、ラベル、スピンボタン、スクロールバー、イメージ、テキストボックス、コンボボックス、チェックボックス、オプションボタン、コマンドボタン、トグルボタン、フレーム、リストボックスのコントロールをユーザーフォーム上に設置しています。

※それぞれのコントロールをひと目でわかりやすくため、ラベルやコントロールの一部のプロパティを初期値から書きかえています。

前項までの手順で、ユーザーフォームのベースとなる領域の大きさの指定と、コントロールの選定と設置が完了したかと思います。ここからは、コードを書いて設置したコントロールに動きを加えていきます。

まずは、作成したユーザーフォームを選択した状態で右クリックをして、表示されるメニューから”コードの表示”を選択して、コードエディター画面を起動します。

サンプルユーザーフォーム

標準モジュールでVBAのコードを書く画面と同じように、ユーザーフォームのコードを書く画面が起動します。(初回起動では何も書いていない状態の画面が表示されているはずです。)

それでは、ユーザーフォームにコードを書いていきますが、まずはユーザーフォームの初期化をしていくことから書いていきます。ユーザーフォームの初期化をする場合は以下のようにコードを書きます。

Private Sub UserForm_Initialize()
    'ここにそれぞれのコントロールで処理したいことをかいていきます。
End Sub

英単語のつづりを覚えるのが大変だという人は、こちらからコピペしてもらっても良いですが、プルダウンから選択できる便利な方法もありますので、以下の画像の手順を行ってください。

サンプルユーザーフォーム

画像のマーカーがついた場所が2カ所ありますが、左側をクリックすると、オブジェクトが選択できます。ここで選択できるオブジェクトは、ベースとなるユーザーフォームと、その上に設置したコントロールです。ここではUserformを選択します。

次に、右側のマーカー部分をクリックすると、プロシージャを選択できるので、任意のものを選択していくのですが、ここでは起動時に実行する”Initialize“を選択していきます。

ここでの選択ですが、オブジェクトを選択する時は、処理(コード)を書きたい対象物を選択し、プロシージャを選択する場面では、マクロが実行される契機(イベント)を選択するようなイメージを持っておくと分かりやすいでしょう。

例えば、オブジェクトで”CommandButton1″を選択して、プロシージャより”Click”を選択した場合は、コマンドボタン1をクリックしたときに実行するマクロを作れます。実際にそれらを選択してみるとコードを入力する画面に以下が自動で追記されます。

ユーザーフォームのコードを書いていく上では、とても重宝する機能なので積極的につかっていくと良いでしょう。

Private Sub CommandButton1_Click()

End Sub

マクロをつくる人にとって便利な機能はどんどん使っていこうね!

実際にサンプルユーザーフォームに、コードを書いたものと、コードを書いた後でマクロを実行したときに表示されるユーザーフォームを確認してみます。

Private Sub UserForm_Initialize()

'コンボボックス1への処理
ComboBox1.AddItem "オムライス"
ComboBox1.AddItem "カレーライス"
ComboBox1.AddItem "アヒージョ"

'イメージの表示
Image1.Picture = LoadPicture("C:\XXXX\XXXX\Desktop\nekomusume_01A.jpg")

'リストボックス1への処理
ListBox1.AddItem "ローズマリー"
ListBox1.AddItem "タイム"
ListBox1.AddItem "バジル"
ListBox1.AddItem "オレガノ"
ListBox1.AddItem "ミント"
ListBox1.AddItem "セージ"
ListBox1.AddItem "パセリ"
ListBox1.AddItem "カモミール"
ListBox1.AddItem "ラベンダー"
ListBox1.AddItem "カレーリーフ"

'スピンボタン1への処理
SpinButton1.Max = 12
SpinButton1.Min = 1

SpinButton1.Value = 1
TextBox2.Text = SpinButton1.Value

'スクロールバーへの処理
ScrollBar1.Max = 12
ScrollBar1.Min = 1

ScrollBar1.Value = 6
TextBox3.Text = ScrollBar1.Value

End Sub

各オブジェクト(コントロール)のコードを書く順番はありませんので、どのコントロールから書きはじめても問題ないです。サンプルコードでは、コンボボックス1、イメージ1、リストボックス1、スピンボタン1、スクロールバー1、テキストボックス3の順番で上から書いています。

コントロールのプロパティやメソッドについては、いずれ別の記事でまとめたいと思いますので、本記事では詳しく紹介するのは控えますが、それぞれをざっくり紹介していきます。

コントロールのことを書くといっぱいになるから、よく使いそうなものだけ紹介ね。

ComboBox(コンボボックス)に項目を追加する

コンボボックスに項目を追加する方法は、AddItemメソッドを使います。

オブジェクト.AddItem [ item [, varIndex ]]

itemには、任意の文字列を記入、varIndexには0以上の記入することで項目の位置を指定します。
itemvarIndexともに省略が可能で、varIndexを省略するとitemを末尾に追加します。

ComboBox1.AddItem "オムライス"
ComboBox1.AddItem "カレーライス"
ComboBox1.AddItem "アヒージョ"

サンプルコードでは、3つの料理名を項目を追加しています。それぞれの値をAddItemメソッドで1つずつ追加する方法以外にも、追加したい項目が大量にある場合は、繰り返し文や、セル範囲を指定してコントロールに項目を追加する方法があります。

繰り返し文(For)でコントロールに項目を追加する方法

Private Sub UserForm_Initialize()から、End Subの間に以下のコードを追加します。

'項目を代入するための変数を宣言する
Dim combo_list

'繰り返し文用のカウンタ変数を宣言する
Dim i As Integer

'Array関数をつかって"おでん"、"たこ焼き"、"餃子"の配列をつくる
combo_list = Array("おでん", "たこ焼き", "餃子")

'For Next文とAddItemメソッドで配列の値をコンボボックスに追加する
For i = 0 To UBound(combo_list)
  ComboBox1.AddItem combo_list(i)
Next i

まずは、要素を代入する目的で宣言します。
※サンプルコードでは、combo_listという名前にしています。

その後、Array関数をつかって“おでん”、”たこ焼き”、”餃子の要素を持つ配列にします。

つぎに、繰り返し文で配列の要素数分の回数を指定します。処理については、コントロール(ComboBox)にAddItemメソッドで追加します。

同じ方法でリストボックスへの応用もできるので、コントロールに追加したい要素がたくさんあるときに使えるテクニックとして覚えておきましょう。

なお、サンプルコードでつかった繰り返し文や、配列の基本の使いかたについては、以下の記事で詳しく取り扱っていますので、気になる人はぜひご覧ください。

繰り返し文の書き方はこちら/
UBound関数や、配列の書き方はこちら/

ListBox(リストボックス)に項目を追加する

同じくリストボックスに項目を追加するときも、AddItemメソッドを使います。

ListBox1.AddItem "ローズマリー"
ListBox1.AddItem "タイム"
ListBox1.AddItem "バジル"
ListBox1.AddItem "オレガノ"
ListBox1.AddItem "ミント"
ListBox1.AddItem "セージ"
ListBox1.AddItem "パセリ"
ListBox1.AddItem "カモミール"
ListBox1.AddItem "ラベンダー"
ListBox1.AddItem "カレーリーフ"

AddItemメソッドで追加する方法以外にも、それぞれの値をAddItemメソッドで1つずつ追加する方法以外にも、追加したい項目が大量にある場合は、繰り返し文や、セル範囲を指定してコントロールに項目を追加する方法があります。

セル範囲でコントロールに項目を追加する方法

セル範囲を指定して、項目を追加する方法を紹介します。セル範囲を指定するときは、Rowsourceプロパティをつかって範囲を指定します。

オブジェクト.RowSource [= String ]

指定するのは文字列(String)である点に注意が必要です。

それでは、このRowsourceプロパティをつかってセル範囲の値を、リストボックスに項目として追加しますが、ここではExcelのワークシートに、以下の画像のような”リスト(表)”があると想定します。このリスト(表)の、2行目から13行目の値をリストボックスの項目として追加していきます。

VBAで作成したユーザーフォームのリストボックスに、セル範囲を指定して項目を追加するためのサンプルワークシート画像

Private Sub UserForm_Initialize()から、End Subの間に以下のコードを追加します。

ListBox1.RowSource = "Sheet1!A2:A13"

文字列で指定するため、ダブルクォーテーションをつけることを忘れないようにしてください。

また、Addressプロパティをつかって指定もできます。以下はAddressプロパティをつかったパターンでコードを書いています。

ListBox1.RowSource = Worksheets("Sheet1").Range("A2:A13").Address(External:=True)

RangeオブジェクトのAddressプロパティの戻り値は、文字列型です。こちらの方法でも、セル範囲を直接指定した場合と同じ結果が得られます。ただし、引数の”External:=True“の指定がない場合は、アクティブシートのセル範囲を参照してしまう点に注意が必要です。

それでは、上記のRowsourceプロパティをつかったコードで、リストボックスに値を追加したユーザーフォームを起動してみましょう。

指定したセル範囲に書かれた値が、項目としてリストボックスに追加されたね。

Rowsourceプロパティでセル範囲に含まれる値を、項目として追加した場合は、AddItemメソッドでの項目の追加処理はできません。項目を追加したい場合は、ワークシートのリストに項目を追加した後、Rowsourceプロパティで指定するセル範囲を修正する方法でおこないます。

AddItemメソッドで項目(item)を追加はできない。
ListBox1.RowSource = "Sheet1!A2:A13"
'AddItemで項目の追加をするとエラーが発生します。
ListBox1.AddItem "蛇つかい座"
セル範囲を更新する方法であれば、項目が追加できる
ListBox1.RowSource = "Sheet1!A2:A14"

Rowsourceプロパティでセル範囲を指定する場合は、ワークシートのリスト(表)に項目を追加した後で、セル範囲を書きかえる方法で対応しましょう。

Rowsourceで範囲を指定した場合は、AddItemメソッドの追加はできないよ。

Image(イメージ)に表示する画像を指定する

Imageに写真を表示するには、Pictureプロパティに値を設定します。

オブジェクト.Picture = LoadPicture(pathname)

pathnameは、画像が格納されている完全なファイルパスを文字列で指定します。

Image1.Picture = LoadPicture("C:\XXXX\XXXX\Desktop\nekomusume_01A.jpg")

※文字列なので、ダブルクォーテーションをつけて忘れずに書きましょう。また、JPEGイメージ(*.jpg)以外にも、GIFイメージ(*.gif)やビットマップ(*.bmp)ファイルの表示が可能です。

この記事のサンプルフォームでは、わたしの画像を表示してみるよ。

SpinButton(スピンボタン)の最大値と最小値を指定する

SpinButton(スピンボタン)の最大値と最小値に、MaxプロパティMinプロパティに値を設定します。

オブジェクト.Max [Long]

オブジェクト.Min [Long]

※最大値はMaxプロパティで指定、最小値はMinプロパティで指定します。Longには長整数型の数値を入力します。

SpinButton1.Max = 12
SpinButton1.Min = 1

これでスピンボタンで選択できる数値は最小が1で、最大が12の範囲で制限できます。

TextBox(テキストボックス)にSpinButton(スピンボタン)の値を表示する

スピンボタンでは、Valueプロパティをつかって値を指定しており、右側のテキストボックスに値を表示するようにします。該当する部分のサンプルコードは以下のとおり。
※スピンボタン自体に値を表示する機能がないため、ラベルやテキストボックスなど、別のコントロールを使って、スピンボタンの現在値を表示する処理を追加することで、ユーザーに分かりやすいフォームとして品質が向上します。

SpinButton1.Value = 1
TextBox2.Text = SpinButton1.Value

このコードにより、スピンボタンを含むフォームを起動したときの初期値は”1″です。ユーザーフォーム上のテキストボックス(厳密に言えば、TextBox2)に1を表示します。

ScrollBar(スクロールバー)の最大値と最小値を指定する

スピンボタンと同じように、MaxプロパティMinプロパティに値を設定します。

ScrollBar1.Max = 12
ScrollBar1.Min = 1

ここでのサンプルフォームでは、スピンボックスと同じく1~12の範囲で指定しています。

TextBox(テキストボックス)にScrollBar(スクロールバー)の値を表示する

こちらもスクロールバー自体に表示する機能がないため、右側に設置したテキストボックスに現在の値を表示するように指定します。(ユーザーが現在値を見ながら数値の選択ができるようにするため)

ScrollBar1.Value = 6
TextBox3.Text = ScrollBar1.Value

スクロールバーの初期値は”6″に指定。ユーザーフォームを起動した時点で、テキストボックス(厳密に言えば、TextBox3)に6を表示します。

PR

残業はしたくない!PCやExcelのスキルアップであなたのプライベート時間を奪わせない!
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。


詳しくは以下のリンクをクリック

ユーザーフォームを起動して状態を確認する

ユーザーフォームとコントロールに対するコードの記入が完了したら、マクロを実行してみましょう。実行方法は他のプロシージャと同じで、VBEの画面の上部に表示されている”“をクリックするか、F5キー(キーボードにFnキーがあるタイプなら、Fnキーを押しながら)で実行します。

サンプルで作成したフォームとコードを表示すると以下の画像のように表示されました。

ユーザーフォーム(サンプル画像)
VBEで作成したユーザーフォームを起動した初期値を確認するための画像

コントロールのImageは、企業のロゴや、マスコットキャラクターなどを表示したりすると、オリジナルシステムみたいでカッコいいよね♡

詳しくは以下のリンクをクリック(別のページに移動します。)

ユーザーフォームが表示されたら、コンボボックス、リストボックスなどをクリックしてコードを書いて指定した項目(item)が追加されているかを確認してみてください。
※サンプルコードどおりにコードを書かれてるのであれば、以下の選択ができるようになっています。

コントロール名 追加した項目(item)
ComboBox1 オムライス
カレーライス
アヒージョ
※ComboBox1の選択可能な項目(item)
コントロール名 追加した項目(item)
ListBox1 ローズマリー
タイム
バジル
オレガノ
ミント
セージ
パセリ
カモミール
ラベンダー
カレーリーフ
※ListBox1の選択可能な項目(item)

ここまでの時点では、スピンボタンと、スクロールバーの▲▼を操作しても、横に設置したテキストボックスの値は切り替わりません。

上記は、ユーザーフォームの初期化をするプロシージャ『Private Sub UserForm_Initialize()』とは別の部分でコードを書く必要があります。

それでは、ユーザーフォームの初期化プロシージャの作成のときと同じように、オブジェクトとプロシージャを選択して作成していきます。

SpinButton(スピンボタン)が操作された時に処理する内容をプロシージャに書く

VBEのコード入力画面で、オブジェクトリストから、スピンボタン(SpinButton1)を、プロシージャリストから(Change)を選択してください。(※操作方法がわからなくなった人は、この記事で紹介しているこちらで確認できます。)

プロシージャが作成された後は「TextBox2.Text = SpinButton1.Value」を追記します。

Private Sub SpinButton1_Change()
    
    TextBox2.Text = SpinButton1.Value

End Sub

このコードを書くことでスピンボタンが変わるたびに、テキストボックスのテキストをスピンボタンの値に更新します。これで操作するたびに、テキストボックス(TextBox2)の数値が連動します。

ScrollBar(スクロールバー)が操作された時に処理する内容をプロシージャに書く

VBEのコード入力画面で、オブジェクトリストから、スクロールバー(ScrollBar)を、プロシージャリストから(Change)を選択してください。(※操作方法がわからなくなった人は、この記事で紹介しているこちらで確認できます。)

プロシージャが作成された後は「TextBox3.Text = ScrollBar1.Value」を追記します。

Private Sub ScrollBar1_Change()
    
    TextBox3.Text = ScrollBar1.Value

End Sub

このコードを書くことでスクロールバーが変わるたびに、テキストボックスのテキストをスクロールバーの値に更新します。これで操作するたびに、テキストボックス(TextBox3)の数値が連動します。

上記のChangeプロシージャにコードが書き込めたら、改めてユーザーフォームを起動し、スピンボタンと、スクロールバーの▲▼を操作をしてください。それぞれのコントロールの横に設置したテキストボックスの値が連動して、値が切り替わることが確認できます。

ユーザーフォームのサンプルマクロ

それでは、これまで説明した内容をつかってサンプルマクロを作ってみます。作成するマクロの内容は、本記事の冒頭の画像でおみせした以下の占いフォームとなります。

サンプルマクロで利用するユーザフォームの画像
UserForm_image01

フォームの作成方法はこれまでの説明で進められるかと思いますので、ユーザーフォーム上のそれぞれのコントロールに書きこんだVBAコードを紹介します。

作成したユーザーフォームに書きこむマクロは以下のとおり。

サンプルマクロ

Option Explicit

Private Sub UserForm_Initialize() 'ユーザフォームの初期化処理
    
    'リストボックスの幅を設定
    占いフォーム.年数リスト.ColumnWidths = 20
    占いフォーム.月数リスト.ColumnWidths = 10
    占いフォーム.日数リスト.ColumnWidths = 10
    
    '年を代入する変数を宣言
    Dim Y As Long
    
    'くり返し用の変数を宣言
    Dim i As Long
    
    '現在の日付の年を変数Yに代入する
    Y = Year(Date)
    
    '現在から150年前までを年数リストボックスの選択項目として追加する
    For i = -150 To 0
        占いフォーム.年数リスト.AddItem Y + i
    Next i
    
    '1~12を月数リストボックスの選択項目として追加する
    For i = 1 To 12
        占いフォーム.月数リスト.AddItem i
    Next i
    
    '1~31を日数リストボックスの選択項目として追加する
    For i = 1 To 31
        占いフォーム.日数リスト.AddItem i
    Next i

End Sub

Private Sub 年数リスト_Change() '年数リストが切り替えられた場合の処理
    
    '年・月・日のリストボックスがすべて選択されていた場合は生年月日テキストに選択した年月日が表示される
    If 年数リスト.Value <> "" And 月数リスト.Value <> "" And 日数リスト.Value <> "" Then
        生年月日テキスト.Text = 年数リスト.Value & " 年 " & 月数リスト.Value & " 月 " & 日数リスト.Value & " 日"
    End If

End Sub

Private Sub 月数リスト_Change() '月数リストが切り替えられたときの処理

    '年・月・日のリストボックスがすべて選択されていた場合は生年月日テキストに選択した年月日が表示される
    If 年数リスト.Value <> "" And 月数リスト.Value <> "" And 日数リスト.Value <> "" Then
        生年月日テキスト.Text = 年数リスト.Value & " 年 " & 月数リスト.Value & " 月 " & 日数リスト.Value & " 日"
    End If

End Sub

Private Sub 日数リスト_Change() '日数リストが切り替えられたときの処理
    
    '年・月・日のリストボックスがすべて選択されていた場合は生年月日テキストに選択した年月日が表示される
    If 年数リスト.Value <> "" And 月数リスト.Value <> "" And 日数リスト.Value <> "" Then
        生年月日テキスト.Text = 年数リスト.Value & " 年 " & 月数リスト.Value & " 月 " & 日数リスト.Value & " 日"
    End If

End Sub

Private Sub 占いボタン_Click() '占うボタンクリックがされたときの処理
    
    '生年月日テキストボックスの値を代入する変数を宣言する
    Dim UserDate As String
    
    UserDate = Replace(生年月日テキスト.Text, " ", "")
    
    If UserDate = "" Then '生年月日が空白の場合の処理
        MsgBox "生年月日が未選択です。", vbCritical + vbOKOnly, "選択エラー"
        
    Else '生年月日が空白ではない
        If IsDate(UserDate) = False Then '生年月日が実在しない日の場合の処理
            MsgBox "存在しない日付です。", vbCritical + vbOKOnly, "選択エラー"
        ElseIf CDate(UserDate) > Date Then '生年月日が未来の日の場合の処理
            MsgBox "生年月日が未来の日付です。", vbCritical + vbOKOnly, "選択エラー"
        Else '生年月日が正常に入力された場合の処理
            
            'ランダム関数で出力される値を代入する変数を宣言する
            Dim Num As Integer
            
            '運勢という名前のコレクションを宣言する
            Dim 運勢 As Collection
            Set 運勢 = New Collection
            
            'コレクションに値を代入する
            運勢.Add "大吉"    '1のとき
            運勢.Add "吉"      '2のとき
            運勢.Add "中吉"    '3のとき
            運勢.Add "小吉"    '4のとき
            運勢.Add "末吉"    '5のとき
            運勢.Add "凶"      '6のとき
            運勢.Add "大凶"    '7のとき
            
            'Rnd関数で1~7の数値を出力して変数に代入する
            Num = Int(7 * Rnd + 1)
                        
            'Select Case文によって処理を分岐する
            
            Select Case Num
                Case 1 'Rnd関数の結果が1のとき
                    MsgBox "あなたの運勢は 『" & 運勢(Num) & "』 です。" & vbCrLf & _
                    "今のあなたは絶好調です。", vbInformation, "結果通知"
                Case 2 To 5 'Rnd関数の結果が2~5のとき
                    MsgBox "あなたの運勢は 『" & 運勢(Num) & "』 です。", vbInformation, "結果通知"
                Case 6 'Rnd関数の結果が6のとき
                    MsgBox "あなたの運勢は 『" & 運勢(Num) & "』 です。" & vbCrLf & _
                    "すこし気を付けて過ごしましょう。", vbInformation, "結果通知"
                Case 7 'Rnd関数の結果が7のとき
                    MsgBox "あなたの運勢は 『" & 運勢(Num) & "』 です。" & vbCrLf & _
                    "かなり気を付けて過ごしましょう。", vbInformation, "結果通知"
            End Select
        End If
    End If
End Sub

Private Sub キャンセルボタン_Click() 'キャンセルボタンがクリックされたときの処理

    Unload 占いフォーム
    
End Sub

ユーザーフォームを起動した時点で発生する初期化処理

年数リストボックスに年数を表示する
現在の年より150年前までをリストに表示するコード
※例:現在が2024年なら1874年~2024年が選択肢に表示される

月数リストボックスに月数を表示する
1月から12月までの項目を表示するコード

日数リストボックスに日数を表示する
1日から31日までの項目を表示するコード

テキストボックスの表示に関する処理

生年月日テキストボックスにリストボックスで選択された年月日を表示する
ただし、リストボックスが3つとも選択されていない場合は空白にしておく。例えば、年、月、日のリストボックスがそれぞれ1900、12、31と選択されたら、「1900年12月31日」と表示する。

占うボタンをクリックしたときの処理

生年月日テキストボックスが空白であった場合はエラーメッセージを表示する
全てのリストボックスが選択された状態でなければ表示されないため、生年月日として成立しない状態で、占うボタンをクリックされた場合は、ユーザーにエラーメッセージを通知する。

生年月日テキストボックスの日付が実在しない日であった場合はエラーメッセージを表示する
生年月日に表示された日付が現実には存在しない日になっている状態で占うボタンをクリックされた場合は、ユーザーにエラーメッセージを通知する。(例:2023年2月29日や2023年4月31日など)

生年月日テキストボックスが空白であった場合はエラーメッセージを表示する
生年月日に表示された日付が現在の日付より、未来であった場合は、ユーザーにエラーメッセージを通知する。

生年月日が正常であった場合の処理

リストボックスで選択された生年月日が正常値であった場合は、Rnd関数によって1~7の範囲で数値が出力されます。その数値をインデックスとして大吉から大凶まで7つの結果を返します。

なお、インデックスから値を呼び出す処理には、コレクションオブジェクトを利用しています。
コレクションオブジェクトはオブジェクトをまとめられるオブジェクトです。コレクションを使えば、複数のコントロールをまとめて制御することもできます。

コレクションについては以下の記事で紹介していますので、詳しくは以下のリンクより記事をご覧ください。

\データの追加や削除がカンタンなコレクションの使いかたについては以下をクリック/

エクセルVBAでユーザーフォームをつくる方法のさいごに

VBAで身近な作業で使えるマクロが作れるようになると、作業を効率的にすすめたり、処理を自動的に実行するなどで効力を感じられます。自分で作ったマクロの効力を感じることができたら、つぎは自分以外の使用者に共有するためのステップを考えていきましょう。

ここで紹介したユーザーフォームは、あなたが作ったマクロによる効果を共有するための手段として有効な方法だと言えます。こちらで紹介した方法をつかって直感的な操作であつかうことができるシステムを作ることにチャレンジしてみると良いでしょう。

今回はエクセルVBAでユーザーフォームをつくる方法でした。ここで紹介したのは、ほんの一部なので紹介できなかった部分はいずれ他の記事でも紹介するよ。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました