|
kayu さん、Jaka さん おはようございます。
>
>すみません。説明が足りませんでした。
>入力は1回だけじゃなくて、最低10回ぐらいあり、そのうちどこで起こっても
>中止できるようにしたいのです。この方法だとその都度if…thenをしないと
>いけないので…すみません
>実行エラーでしようとしたのですがフレームモジュールから、標準モジュール
>へうまく連携が取れなくて断念しました。
正直、まだはっきりと仕様が把握出来ません。
よって、想像がかなり入っています。
新規ブックにて
ユーザーフォーム(Userform1)に
テキストボックスを10個作成してください。
テキストボックス名は自動作成されるTextbox1〜Textbox10
を使用します。
以下に示すmainプロシジャーを実行すると
・このUserform1が表示されます。
・Textbox1〜Textbox10のテキストボックスが入力可能になっています。
・このTextbox1〜Textbox10のどのテキストボックスでも「9999」が入力されると
Userform1は初期化表示します。
・プログラムは、ユーザーフォームの「X」ボタンのクリックで終了します。
ではコードです。
まず、クラスモジュール(クラス名は自動作成される「Class1」)
'==================================================================
Private WithEvents txt As MSForms.TextBox
Private id As Long
Private pa_obj As Object
'==================================================================
Private Sub txt_change()
If txt.Text = "9999" Then
pa_obj.hidemode = 0
pa_obj.Hide
End If
End Sub
'====================================================================
Sub set_controls(idx As Long, obj1 As MSForms.TextBox, obj2 As Object)
Set txt = obj1
id = idx
Set pa_obj = obj2
End Sub
次にUserform1のモジュール
'======================================================================
Public hidemode As Long
' 0---9999が入力された 1----閉じるボタンが押された
Private ctrl(1 To 10) As Class1
'======================================================================
Private Sub UserForm_Initialize()
Dim idx As Long
For idx = 1 To 10
Set ctrl(idx) = New Class1
With ctrl(idx)
.set_controls idx, Controls("textbox" & idx), Me
End With
Next
End Sub
'======================================================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
Cancel = True
hidemode = 1
Me.Hide
Else
Erase ctrl()
End If
End Sub
最後に標準モジュールに
'======================================================================
Sub main()
Do
Unload UserForm1
UserForm1.Show
Loop Until UserForm1.hidemode = 1
Unload UserForm1
End Sub
以上です。mainを実行してみて下さい。
上記のようなクラスモジュールの記述を私はもう本来はしませんが、
今回はコードが短くなるので採用しました。
|
|