
お世話になります。
Excel VBA 2007で質問です。
今、
Label1 ComboBox1 TextBox1
Label2 ComboBox2 TextBox2
・・・
Label100 ComboBox100 TextBox100
のようなフォームがあるとします。
ComboBox1~100は「Any」「is」「is not」のいずれかの値が取れ、初期値はAnyとします。
TextBox の Enabled プロパティの初期値は False とします。
やりたいことは、
ComboBox が「Any」でない場合(is または is not のいずれかの場合)にのみその右隣の TextBox の Enabled プロパティを True にしたいのです。
いま、ComboBox30 を Any から is に切り替えたとします。
すると、TextBox30.Enabled を False から True にしたいのです。
ここで、ComboBox30 を is から is not に切り替えたとします。
TextBox30.Enabled は True のままです。
ここで、ComboBox30 を is not から Any に切り替えたとします。
すると、TextBox30.Enabled を True から False にしたいのです。
ComboBox のイベントハンドラで
Sub ComboBox30_Change ()
If ComboBox30.Value = "Any" Then
TextBox30.Enabled = "False"
Else
TextBox30.Enabled = "True"
End If
End Sub
のように書けばいいことは分かっているのですが、その場合は数字だけ変えたイベントハンドラを100個書かなければなりません。
このイベントハンドラを1個にすることはできるでしょうか。
(コンボボックス100個のうちどれかが変更されたら、変更されたコンボボックスの番号を知りながら呼び出されるハンドラ)
次善の策として、
Sub ComboBox30_Change ()
userSubroutine
End Sub
のように書くこともできるかと思いますが、この場合、どのコンボボックスが変更されたか(どのイベントハンドラが起動されたか)を知って、userSubroutine に渡さなければなりません。
よろしくお願いします!
No.1ベストアンサー
- 回答日時:
こんにちは。
クラスモジュールを挿入して、そこに
Option Explicit
Public WithEvents CBX As MSForms.ComboBox
Public idx As Integer
Private Sub CBX_Change()
If CBX.Value = "Any" Then
UserForm1("TextBox" & idx).Enabled = False
Else
UserForm1("TextBox" & idx).Enabled = True
End If
End Sub
フォームモジュールには、
Option Explicit
Private cls(1 To 100) As New Class1
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 100
Set cls(i).CBX = Me.Controls("ComboBox" & i)
cls(i).idx = i
cls(i).CBX.List = Array("Any", "is", "is not")
Next
End Sub
Private Sub UserForm_Terminate()
Dim i As Integer
For i = 1 To 100
Set cls(i).CBX = Nothing
Next
End Sub
当方、EXCEL2002ですが、2007でもいけるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
エクセルVBAでシートモジュール...
-
標準モジュールを削除したい。(...
-
Excel VBAで、ユーザーフォーム...
-
vba userFormのSubを標準モジュ...
-
Form間の値の渡し方
-
VBAを使用してWordからExcelの...
-
ユーザー定義関数に#NAME?が返...
-
本当にPublicな変数(配列で)
-
グラフのX,Y座標を取得したい
-
VBでグローバル変数を宣言するには
-
エクセルVBA 時間のカウントダ...
-
プログラムでノッチフィルタの...
-
VBAで別モジュールへの変数の受...
-
Excel VBAでリンク切れをチェッ...
-
linux mintで(EE )Failed to lo...
-
モジュールの最大数はいくつな...
-
Excel VBA マクロの実行方法に...
-
vba 標準モジュールインポート...
-
【vba】フォームに書いてあ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAで、ユーザーフォーム...
-
Excel VBA 定義されたプロージ...
-
vba userFormのSubを標準モジュ...
-
標準モジュールを削除したい。(...
-
'Range'メソッドは失敗しました
-
VBAで別モジュールへの変数の受...
-
モジュールからフォームのボタ...
-
モジュールの最大数はいくつな...
-
グラフのX,Y座標を取得したい
-
モジュールとクラスの違いって...
-
【vba】フォームに書いてあ...
-
Form間の値の渡し方
-
VBのフォームモジュールと標準...
-
VBA モジュールで共通に使う変...
-
Excel VBA 『Call』で呼び出す...
-
acwzlibとは?
おすすめ情報