Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


52234 / 76732 ←次へ | 前へ→

【29339】Re:TextBoxの入力値制限
発言  ichinose  - 05/10/1(土) 19:39 -

引用なし
パスワード
   ▼年寄り さん:
こんばんは。
>>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イベントでは出来ません。

これが不満のひとつです。
2 hits

【29331】TextBoxの入力値制限 年寄り 05/10/1(土) 9:58 質問
【29332】Re:TextBoxの入力値制限 ichinose 05/10/1(土) 10:52 発言
【29333】Re:TextBoxの入力値制限 年寄り 05/10/1(土) 11:13 発言
【29339】Re:TextBoxの入力値制限 ichinose 05/10/1(土) 19:39 発言
【29340】Re:TextBoxの入力値制限 ichinose 05/10/1(土) 20:34 発言
【29392】Re:TextBoxの入力値制限 年寄り 05/10/4(火) 12:04 お礼

52234 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free