UserForm_Initializeとは
以前から何度かUserForm_Initializeをいじってきましたね。そもそもUserForm_Initializeとは何なのかを考えてみましょう。
UserFormは今いじっているユーザーが操作しやすいように作り上げるツールの事ですね。Initialize(イニシャライズ)とは「初期化」の事です。
つまり、UserFormを初期化して最適な状態にするものです。これはUserFormが立ち上がる前に実行されるプログラムなので実際にInitialize処理が走った後の状態でUserFormが表示されます。このプログラムを走らせる事により面倒な手入力作業は省いたり、仮に項目名などが変わっても対応させる事が出来るようになるんです。
どんな時にInitializeで最適化するのか
例えばこのような表があったとします。
仕入先は最大10件登録出来る表ですね。しかし、現在は仕入先は4件しか登録されていません。この場合はご入力を防ぐ為に仕入先が登録してある箇所だけ入力出来るようにしたいですよね?こういった時にUserForm_Initializeで最適化します。
UserFormのパーツを作りましょう
仕入先名にはLabelを、仕入金額はTextBoxを使用していきましょう。登録件数は10件なのでそれぞれ10個ずつ作って行きます。
Label1~Label10とTextBox1~TextBox10が出来上がりました。
UserForm_Initializeの準備
では実際にUserForm_Initializeする為の準備をしましょう。右クリック→コードを表示でコードを開きましょう。コードを開いたらUserFormのInitializeを選択しましょう。
Initializeのコードを記述
では、先程の手順で出来たUserForm_Initialize内にプログラムを書いていきましょう。必要な変数はカウンタ変数くらいですね。後は念の為上限が増えた時や開始番号が変わっても良い様にConstで一番小さい部品の番号と一番大きい部品の番号を定義しておきましょう。後は表の開始位置が変わっても良い様に開始の行番号と列番号をConstで定義しておきましょう。このフォームの部品にループで処理をして行くのでControlsを使用して最適化していきます。ループする際はLabelとTextBoxの開始番号が1からなのでセル番号は-1しながらループしていきます。
Private Sub UserForm_Initialize() Const minNum As Long = 1 ' 最小値 Const maxNum As Long = 10 ' 最大値 Const strRow As Long = 3 Const strCol As Long = 2 Dim i As Long ' カウンタ変数 For i = minNum To maxNum If Not Cells(strRow + i - 1, strCol).Value Like "" Then Me.Controls("Label" & i).Caption = Cells(strRow + i - 1, strCol).Value Else Me.Controls("Label" & i).Visible = False Me.Controls("TextBox" & i).Visible = False End If Next End Sub
これを実行するとこうなります。
10個あったはずのLabelとTextBoxがリストに登録された分だけになりましたね。UserFormのパーツにある「Visible」というプロパティをFalseにすると非表示にする事が出来ます。Visibleとは「見える」という意味ですね。これをFalseにする事により「見えない」という風に設定する事が出来ます。UserFormの場合「見えない=操作不可」となります。
まとめ
このようにUserFormは便利なツールなだけにご入力を防ぐ為の工夫が必要です。意外といつも気にしていないプロパティでも有用なものがあります。
Initializeの際にこのプロパティ達をいじってあげる事により、ユーザーが使いやすくご入力を防ぐ設定が出来ますので是非使ってみて下さい。