| 
    
     |  | ▼年寄り さん: こんばんは。
 >>Exitイベントは、便利にみえますが、仕様によっては、問題も多々あります。
 >この辺のことをもう少し具体的に教えていただけたら。またそれに対する対応策を。
 これについて言い出すと大変なことになってしまうのですが・・・。
 
 Exitイベントを取り上げて申し上げましたが、
 Excelのユーザーフォームで一般のアプリのような画面操作を
 行おうと思うとサポートされているイベントでは
 「帯に短し、襷に長し」だなあ というのが私の正直な感想です。
 
 アルゴリズムを駆使して(複雑な事をして)やりたいことを行うか、
 
 サポートされている機能で可能な仕様にするか・・・。
 
 それはともかく
 
 >Exitイベントは、便利にみえますが、仕様によっては、問題も多々あります
 
 の事情として私が思ったことは、
 
 1いくつかのバグがあること。
 角田さんサイトから、
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips03.htm
 こんなの始めとして、角田さんのサイトに他にも「油断のならないシリーズ?」
 がありますから、これも参考にして下さい。
 他にも細かい???はありますよ!!
 
 2本家VBとの格差なのかコントロール配列がないこと
 似たようなことは出来ますけど、完全ではないこと。
 これも角田さんの
 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=51;id=FAQ
 これを参考にして下さい。
 
 3Exitイベントでは物足りない・・・
 VBにはExitイベントではなく、Lostfocusイベントというのが
 あるのですが、Exitイベントはこれほど使いやすくないこと。
 
 バグの長期放置は論外です(MS社の怠慢に他なりません)から、置いといて、
 
 2について
 
 例えば、Userform1に
 
 Textbox1〜Textbox6までの6個のテキストボックスを配置して下さい。
 この6個のテキストボックスで全て同じように日付が入力されたか否かの
 チェックを行う事を考えます。
 Userform1のモジュールに
 '==================================================================
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 With TextBox1
 If IsDate(.Text) Then
 .Text = Format(.Text, "yyyy/m/d")
 Else
 MsgBox "no good"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 End If
 End With
 End Sub
 '==================================================================
 Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 With TextBox2
 If IsDate(.Text) Then
 .Text = Format(.Text, "yyyy/m/d")
 Else
 MsgBox "no good"
 .SelStart = 0
 .SelLength = Len(.Text)
 Cancel = True
 End If
 End With
 End Sub
 ・
 ・
 ・
 ・
 
 
 とTextbox1〜Textbox6まで似たようなExitイベントプロシジャーを記述しなければ
 なりません。
 6個ならまだ我慢できますか?でもこれが10とか20だったら???
 
 
 これを以下のようにする事が出来ます。
 クラスモジュール(Class1)に(VBEにて「挿入」---「クラスモジュール」で作成)
 
 '====================================================
 Public WithEvents txt As MSForms.TextBox
 '====================================================================
 Private Sub txt_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = 13 Or KeyCode = 9 Then
 With txt
 If IsDate(.Text) Then
 .Text = Format(.Text, "yyyy/m/d")
 Else
 MsgBox "no good"
 .SelStart = 0
 .SelLength = Len(.Text)
 KeyCode = 0
 End If
 End With
 End If
 End Sub
 
 'Userform1のモジュールに
 '=====================================
 Private txt_cls(1 To 6) As New Class1
 Private Sub UserForm_Initialize()
 For g0 = 1 To 6
 With txt_cls(g0)
 Set .txt = Controls("textbox" & g0)
 End With
 Next g0
 End Sub
 
 
 クラスは初めてだとちょっと難しいですが、とりあえず
 上記の通り操作してください。
 
 こうすると、日付チェックのコードは一回で済みますし、
 イベントプロシジャーもいくつも記述する必要がありません。
 
 しかし、ご覧の通り、使用しているのはKeyDownイベントです。
 このような記述方法がExitイベントでは出来ません。
 
 これが不満のひとつです。
 
 
 |  |