Excel VBA質問箱 IV

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

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


4647 / 13646 ツリー ←次へ | 前へ→

【55344】TextBoxが1つのユーザフォーム よちよち 08/4/29(火) 21:01 質問[未読]
【55345】Re:TextBoxが1つのユーザフォーム ponpon 08/4/29(火) 21:30 発言[未読]
【55348】Re:TextBoxが1つのユーザフォーム よちよち 08/4/29(火) 22:02 回答[未読]
【55350】Re:TextBoxが1つのユーザフォーム ponpon 08/4/29(火) 23:32 発言[未読]
【55355】Re:TextBoxが1つのユーザフォーム よちよち 08/4/30(水) 7:53 お礼[未読]
【55357】Re:TextBoxが1つのユーザフォーム Yuki 08/4/30(水) 8:35 発言[未読]
【55358】Re:TextBoxが1つのユーザフォーム ponpon 08/4/30(水) 13:07 発言[未読]
【55436】Re:TextBoxが1つのユーザフォーム よちよち 08/5/4(日) 10:25 お礼[未読]
【55354】Re:TextBoxが1つのユーザフォーム ichinose 08/4/30(水) 7:34 発言[未読]

【55344】TextBoxが1つのユーザフォーム
質問  よちよち  - 08/4/29(火) 21:01 -

引用なし
パスワード
   久し振りの質問です。お知恵を拝借させて下さい。
ユーザフォームの中に、入力可能項目(TextBox)が1つだけあります。
他にタイトルやコマンドボタンもありますが、Enable=falseやLocked=true等の
状態で、1つのTextBoxからの入力のみ[AfterUpdate]で待っています。
テストの結果、1つだけのTextBoxからの入力はできない事に気付きました。
文字入力後、Enterを押しても、次の移動先項目が無いため[AfterUpdate]とならないのではないか?と推測していますが、回避方法(TextBox1つだけの場合の入力方法)をどなたかご教示お願いできませんでしょうか。宜しくお願いします。

【55345】Re:TextBoxが1つのユーザフォーム
発言  ponpon  - 08/4/29(火) 21:30 -

引用なし
パスワード
   こんばんは。
詳しい仕様がわかってないので、TextBoxに入力した後
どうするのかがわからないので、何ともいえませんが、
Change()イヴェントではダメなんでしょうね・・・

【55348】Re:TextBoxが1つのユーザフォーム
回答  よちよち  - 08/4/29(火) 22:02 -

引用なし
パスワード
   ▼ponpon さん:
>こんばんは。
>詳しい仕様がわかってないので、TextBoxに入力した後
>どうするのかがわからないので、何ともいえませんが、
>Change()イヴェントではダメなんでしょうね・・・

Change()では、1文字入力毎にSUBROUTINに制御が移りますが、
入力の終了を検知できません。
なお、TextBoxに入力後は、簡単な入力チェック後、入力内容に応じ
複数のコマンドボタンを選びEnable=Trueとして次の処理の選択を待ちます。

【55350】Re:TextBoxが1つのユーザフォーム
発言  ponpon  - 08/4/29(火) 23:32 -

引用なし
パスワード
   いろいろネットで調べましたが、
私には、わかりません。何か方法があるかもしれません。
識者の回答をお待ちください。

ちなみに、Lockを使えば 何とかなりました。

Private Sub UserForm_Initialize()
 With Me.CommandButton1
    .Caption = "入力不可"
    .Locked = True
 End With
End Sub

Private Sub TextBox1_AfterUpdate()
  
  If IsNumeric(Me.TextBox1.Value) Then
   With Me.CommandButton1
     .Caption = "入力可"
     .Locked = False
   End With
  End If
End Sub

【55354】Re:TextBoxが1つのユーザフォーム
発言  ichinose  - 08/4/30(水) 7:34 -

引用なし
パスワード
   おはようございます。

>テストの結果、1つだけのTextBoxからの入力はできない事に気付きました。
>文字入力後、Enterを押しても、次の移動先項目が無いため[AfterUpdate]とならないのではないか?と推測していますが、回避方法(TextBox1つだけの場合の入力方法)をどなたかご教示お願いできませんでしょうか。宜しくお願いします。


他にフォーカスが移るコントロールがない場合、対象テキストボックスの入力終了が確認できる仕様にしなければなりませんね!!

例1

入力確定のコマンドボタンを設けて、ここにAfterUpdateイベントに記述した
コードを記述する という仕様に変更する。


例2

他にフォーカスが移るコントロールがないのですから、Keydownイベントで
判断する。

新規ブックにて、ユーザーフォーム(Userform1)に
  Textbox1(テキストボックス)
  Commandbutton1〜CommandButton4(4つのコマンドボタン)

を配置してください(TabIndexも上記の順序とします)。


Userform1のモジュールに

'==========================================================
Option Explicit
'==========================================================
Private Sub CommandButton1_Click()
  cbtn 1
End Sub
'==========================================================
Private Sub CommandButton2_Click()
  cbtn 2

End Sub
'==========================================================
Private Sub CommandButton3_Click()
  cbtn 3

End Sub
'==========================================================
Private Sub CommandButton4_Click()
  cbtn 4

End Sub
'==========================================================
Private Sub TextBox1_Enter()
  Dim g0 As Long
  For g0 = 1 To 4
    Controls("commandbutton" & g0).Enabled = False
    Next
End Sub
'==========================================================
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Dim g0 As Long
  If KeyCode = 13 Then
    With TextBox1
     If IsNumeric(.Value) Then
       If Val(.Value) = 1 Then
        CommandButton1.Enabled = True
        CommandButton2.Enabled = True
       ElseIf Val(.Text) = 2 Then
        CommandButton3.Enabled = True
        CommandButton4.Enabled = True
       Else
        KeyCode = 0
        End If
     Else
       KeyCode = 0
       End If
     End With
    End If
End Sub
'==========================================================
Sub cbtn(id As Long)
  MsgBox id
End Sub


上記の例では、

Textbox1に1が入力されEnterキーが押されると、
Commandbutton1、Commandbutton2が使用可能になり、
Textbox1に2が入力されEnterキーが押されると、
Commandbutton3、Commandbutton4が使用可能になります。

AfterUpdateを選択した理由があるのでしょうから、
Keydownイベントではまかないきれない箇所はあります。
(移るコントロールが存在する場合、Keydownイベントではマウスを使った移動では、
イベントが発生しない等)。

その場合、上記のふたつのイベントを組み合わせる方法も考えられますが、
入力コードが複雑になってしまいますね!!


例3
例2のUserform1の仕様で既定値をEnabled=True(Commandubutton1〜Commandbutton4)に設定しておく。

Exitイベントを使って、条件によって、使用不可にボタンを設定する

Option Explicit
'==========================================================
Private Sub CommandButton1_Click()
  cbtn 1
End Sub
'==========================================================
Private Sub CommandButton2_Click()
  cbtn 2

End Sub
'==========================================================
Private Sub CommandButton3_Click()
  cbtn 3

End Sub
'==========================================================
Private Sub CommandButton4_Click()
  cbtn 4

End Sub
'==========================================================
Private Sub TextBox1_Enter()
  Dim g0 As Long
  For g0 = 1 To 4
    Controls("commandbutton" & g0).Enabled = True
    Next
End Sub
'==========================================================
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Dim g0 As Long
  With TextBox1
    If IsNumeric(.Value) Then
     If Val(.Value) = 1 Then
       CommandButton3.Enabled = False
       CommandButton4.Enabled = False
     ElseIf Val(.Text) = 2 Then
       CommandButton1.Enabled = False
       CommandButton2.Enabled = False
     Else
       For g0 = 1 To 4
        Controls("commandbutton" & g0).Enabled = False
        Next
       End If
    Else
     For g0 = 1 To 4
       Controls("commandbutton" & g0).Enabled = False
       Next
     End If
    End With
End Sub
'==========================================================
Sub cbtn(id As Long)
  MsgBox id
End Sub


この場合も、AfterUpdateとExitイベントの仕様の違いを検討をしてみてください。

【55355】Re:TextBoxが1つのユーザフォーム
お礼  よちよち  - 08/4/30(水) 7:53 -

引用なし
パスワード
   ▼ponpon さん:
>いろいろネットで調べましたが、
>私には、わかりません。何か方法があるかもしれません。
>識者の回答をお待ちください。
>
>ちなみに、Lockを使えば 何とかなりました。
>
>Private Sub UserForm_Initialize()
> With Me.CommandButton1
>    .Caption = "入力不可"
>    .Locked = True
> End With
>End Sub
>
>Private Sub TextBox1_AfterUpdate()
>  
>  If IsNumeric(Me.TextBox1.Value) Then
>   With Me.CommandButton1
>     .Caption = "入力可"
>     .Locked = False
>   End With
>  End If
>End Sub
ponponさん 夜遅くに回答頂き、有難う御座います。
上例の場合はうまく動作しますが、CommandButton1.Enable=falseの状態にすると
 AfterUpdateに制御が渡ってきません。
何か1つ制御が移る先がないとだめなようです。
連休明けまで期間があるので、どなたかの助言を待ってみます。

【55357】Re:TextBoxが1つのユーザフォーム
発言  Yuki  - 08/4/30(水) 8:35 -

引用なし
パスワード
   ▼よちよち さん:

>何か1つ制御が移る先がないとだめなようです。
小さなTextBoxを作ります。
そしてその上に使用するTextBoxをかぶせます。
すると小さなTextBoxは見えなくなりますので
それを利用します。
TextBox1 使用する
TextBox2 使用しない。

Private Sub TextBox2_Enter()
  TextBox1.SetFocus
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  Debug.Print "Before"
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If TextBox1.Value = "aaa" Then
    CommandButton1.Enabled = True
    CommandButton1.SetFocus
  Else
    CommandButton1.Enabled = False
  End If
  Debug.Print "Exit"
End Sub

こんな風でどうでしょう。

【55358】Re:TextBoxが1つのユーザフォーム
発言  ponpon  - 08/4/30(水) 13:07 -

引用なし
パスワード
   ▼Yuki さん:
>>何か1つ制御が移る先がないとだめなようです。
>小さなTextBoxを作ります。
>そしてその上に使用するTextBoxをかぶせます。
>すると小さなTextBoxは見えなくなりますので
>それを利用します。
>TextBox1 使用する
>TextBox2 使用しない。

なるほどね!!
アイデアですね。

【55436】Re:TextBoxが1つのユーザフォーム
お礼  よちよち  - 08/5/4(日) 10:25 -

引用なし
パスワード
   ▼ponpon さん:
>▼Yuki さん:
折角のご指摘を、拝見するのが遅くなりました。
夕べ遅く、実家から帰ってきました。
何とかなりそうです。また困ったら投稿させて頂ますので、
その時は宜しくお願いします。

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