|
▼年寄り さん:
こんばんは。
>>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イベントでは出来ません。
これが不満のひとつです。
|
|