| 
    
     |  | > 3Exitイベントでは物足りない・・・ >  VBにはExitイベントではなく、Lostfocusイベントというのが
 >  あるのですが、Exitイベントはこれほど使いやすくないこと。
 3について例題を作成したのですが、
 仕様が悪かったのかExitイベントの悪い箇所が目立たない・・・。
 後述しますが、「そんなにたいした事では無い」なんて思われるかもしれませんが、
 でも私は厄介だと思っています。
 
 では、例題の仕様から・・・。
 
 ユーザーフォームで足し算の問題を出題し、ユーザーに回答してもらうプログラムを
 考えます。
 
 Userform1に
 
 ラベルコントロールを8個配置して下さい。
 名前は、自動作成される Label1〜Label8
 問題を表示するために使います
 
 テキストボックスを2個配置して下さい。
 名前は自動作成される Textbox1とTextbox2
 回答入力用に使います。
 
 コマンドボタンを2個配置して下さい。
 名前は自動作成される Commandbutton1とCommandbutton2
 Commandbutton1----次の問題を表示
 Commandbutton2----プログラムの終了
 
 
 ではコードです。
 
 標準モジュールに
 '================================================================
 Sub main()
 UserForm1.Show
 End Sub
 
 
 Userform1のモジュールに
 '=================================================================
 Private seikai(1 To 2) As Boolean
 '=================================================================
 Private Sub UserForm_Initialize()
 Dim lbl_lt As Variant
 Dim lbl_ht As Variant
 Dim lbl_wd As Variant
 Dim btn_lt As Variant
 Dim btn_cap As Variant
 Dim txt_ht As Variant
 lbl_lt = Array(36, 90, 126, 180, 36, 90, 126, 180)
 lbl_ht = Array(54, 54, 54, 54, 90, 90, 90, 90)
 lbl_wd = Array(54, 36, 54, 36, 54, 36, 54, 36)
 txt_ht = Array(54, 90)
 btn_lt = Array(48, 174)
 btn_cap = Array("次の問題", "終了")
 With Me
 .Caption = "足し算問題"
 .Height = 263
 .Width = 350
 End With
 For g0 = 1 To 8
 With Controls("label" & g0)
 .Caption = ""
 .BackColor = &HFFFFFF
 .SpecialEffect = fmSpecialEffectSunken
 .Font.Size = 16
 .TextAlign = fmTextAlignRight
 .Left = lbl_lt(g0 - 1)
 .Top = lbl_ht(g0 - 1)
 .Height = 20.5
 .Width = lbl_wd(g0 - 1)
 End With
 Next g0
 For g0 = 1 To 2
 With Controls("textbox" & g0)
 .Text = ""
 .Font.Size = 16
 .TextAlign = fmTextAlignRight
 .Left = 216
 .Top = txt_ht(g0 - 1)
 .Height = 20.5
 .Width = 66
 End With
 Next g0
 For g0 = 1 To 2
 With Controls("commandbutton" & g0)
 .TabStop = False
 .Caption = btn_cap(g0 - 1)
 .Font.Size = 16
 .Left = btn_lt(g0 - 1)
 .Top = 180
 .Height = 30
 .Width = 90
 End With
 Next g0
 Call disp_ques
 End Sub
 '=================================================================
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 With TextBox1
 If (Not IsNumeric(.Text)) And .Text <> "" Then
 MsgBox "答えは数字です"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 ElseIf .Text <> "" Then
 If Val(Label1.Caption) + Val(Label3.Caption) = Val(.Text) Then
 seikai(1) = True
 Else
 MsgBox "不正解"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 End If
 End If
 End With
 End Sub
 '=================================================================
 Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 With TextBox2
 If (Not IsNumeric(.Text)) And .Text <> "" Then
 MsgBox "答えは数字です"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 ElseIf .Text <> "" Then
 If Val(Label5.Caption) + Val(Label7.Caption) = Val(.Text) Then
 seikai(2) = True
 Else
 MsgBox "不正解"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 End If
 End If
 End With
 End Sub
 '=================================================================
 Private Sub CommandButton1_Click()
 For g0 = 1 To 2
 If seikai(g0) = False Then
 MsgBox "正解するまで次の問題にはいけません"
 With Controls("textbox" & g0)
 .SelStart = 0
 .SelLength = Len(.Text)
 .SetFocus
 End With
 Exit Sub
 End If
 Next g0
 Call disp_ques
 End Sub
 '=================================================================
 Private Sub CommandButton2_Click()
 Unload Me
 End Sub
 '=================================================================
 Private Sub disp_ques() '問題表示
 For g0 = 1 To 7 Step 2
 Controls("label" & g0).Caption = _
 Int(Rnd() * 10000) + 1
 Next g0
 For g0 = 2 To 8 Step 4
 With Controls("label" & g0)
 .TextAlign = fmTextAlignCenter
 .Caption = "+"
 End With
 With Controls("label" & g0 + 2)
 .TextAlign = fmTextAlignCenter
 .Caption = "="
 End With
 Next g0
 For g0 = 1 To 2
 seikai(g0) = False
 Controls("textbox" & g0).Text = ""
 Next g0
 End Sub
 
 
 ちょっと例題に懲りすぎてしまったかな??
 因みにこのプログラム正解の記述がないと「次の問題」ボタンを押しても
 エラーになります。
 
 ここで問題の個所は、
 一度に出題される問題数は2問ですが、たとえば
 
 8715+563= という問題に対して 不正解である50と入力した後、
 
 プログラムの終了ボタンであるCommandbutton2をクリックしたとき
 終了できない事なのです。
 (これだけの事のために例題が長すぎました)
 
 一般のアプリでは終了するんですよ、こういう場合・・・。
 
 Exitイベントでは、フォーカスが次に移るコントロールが何なのか
 Exitイベント内ではわからないという問題があります。
 
 よって、私は、Keydownイベントを使用することが多いのですが、
 これはこれでコードの記述が面倒なところもあります。
 
 結論の割に記述が長すぎました。反省。
 
 よって、Excelのユーザーフォームで一般のアプリのような画面操作を
 行おうと思うとサポートされているイベントでは
 「帯に短し、襷に長し」だなあ というのが私の正直な感想です。
 
 
 |  |