VBAでユーザーフォーム上に設置されたコントロールを、すべて操作出来ないように設定する方法をご説明します。
ユーザーフォームを使用していると、結構コントロールの制御をしたい場面に直面します。
複数のユーザーフォームを開いて処理を行う場合等、アクティブではないフォーム上のコントロールをアクティブにせずにクリック出来てしまうため、予期せぬ挙動やエラーの発生原因となる場合があります。
また、表示させたいリストの再生成や、データの読み込み中はコントロールを無効にしたい時があります。
そんな時はユーザーフォーム上のコントロールをロックして、処理が終わったらロックを解除するという方法で回避することが可能です。
ユーザーフォームにコントロールを追加する方法については「ユーザーフォームにコントロールを追加する方法」をご覧ください。
1.コントロールの操作のロックを設定、解除する方法
コントロールの操作のロックを設定、もしくは解除するには「Enabled」プロパティを使用します。
「Enabled」プロパティは対象となるコントロール(オブジェクト)を一時的に操作の有効/無効を指定することが出来ます。
また、ロックではなく非表示にする場合は「Visible」プロパティを使用します。
「Enabled」プロパティの指定は次のように記述します。
Object.Enabled = True(もしくはFalse)
非常に簡単ですね。
操作出来ないようにするには、「False」を指定します。
また、操作できるようにするには「True」を指定します。
2.ロックしないとエラーになるケースとサンプルコード
ロックしないとエラーとなるケースの例です。
文頭でも記載しましたが、複数のユーザーフォームを扱う際にコントロールはアクティブになっていなくてもクリック出来てしまいます。
そのようなケースで押されてしまった、コントロール内に組み込まれている処理がエラーを引き起こしたり、想定しない処理をする可能性があります。
次のようなテキストボックス3つ設置した、足し算をする単純なユーザーフォーム2つ用意して検証してみます。
本来なら数値を入力したフォーム上にある「計算」ボタンを押して計算します。
ですが、この時もう一つのフォームの「計算」ボタンを押せてしまうのです。
今回は意図的にエラーが出るような作りになっていますが、実務で使う場合にはエラーが出ては困るのでユーザーフォームがアクティブでない場合はロックをする事で回避できるケースもあります。
まずは2つのユーザーフォームを表示します。
Sub Sample1()
UserForm1.Show vbModeless
UserForm2.Show vbModeless
End Sub
次に、UserForm2に数字を入れます。
次にUserForm1のコマンドボタンを押します。
どちらのユーザーフォームのコマンドボタンにも次のような単純な足し算のコードが書かれいます。
どちらもコントロールが設置されている親オブジェクトを参照しています。
Private Sub CommandButton1_Click()
With Me
TextBox3.Value = CLng(.TextBox1) + CLng(.TextBox2)
End With
End Sub
UserForm1は各テキストボックスが空白のため、エラーになります。
ちなみにUserForm2のコマンドボタンを押すと普通に計算されます。
このようなエラーを回避するためにアクティブではないユーザーフォームのコントロールをロックします。
ロックするサンプルコード
あとから開いた方がアクティブなりますので、先に開くUserForm1のコントロールをロックします。
「For Each In Next」で指定したユーザーフォームのコントロールをループして「Enabled」をFalseに指定して、ロックします。
Sub Sample1()
Dim ctrl As Object
With UserForm1
.Show vbModeless
For Each ctrl In .Controls
ctrl.Enabled = False
Next
End With
UserForm2.Show vbModeless
End Sub
少しわかりづらいですが、色が薄くなりUserForm1のコントロールがロックされています。
これでUserForm1のロックを解除しない限り、間違えて違うユーザーフォームのコントロールを押しても実行されません。
ロックを解除するサンプルコード
戻す場合は次のように、逆にTrueに指定します。
Sub Sample2()
Dim ctrl As Object
With UserForm1
For Each ctrl In .Controls
ctrl.Enabled = True
Next
End With
End Sub
UserForm1のコントロールの色がはっきりとなり、ロックが解除されました。