Excel VBA質問箱 IV

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

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


4352 / 13644 ツリー ←次へ | 前へ→

【57144】Cancelの解除方法 亜矢 08/7/28(月) 20:11 質問[未読]
【57146】Re:Cancelの解除方法 kanabun 08/7/28(月) 20:46 発言[未読]
【57149】Re:Cancelの解除方法 亜矢 08/7/28(月) 22:52 質問[未読]
【57150】Re:Cancelの解除方法 kanabun 08/7/29(火) 0:38 発言[未読]
【57151】Re:Cancelの解除方法 kanabun 08/7/29(火) 0:41 発言[未読]
【57152】Re:Cancelの解除方法 kanabun 08/7/29(火) 0:48 発言[未読]
【57153】Re:Cancelの解除方法 亜矢 08/7/29(火) 6:21 お礼[未読]
【57154】Re:Cancelの解除方法 ichinose 08/7/29(火) 7:34 発言[未読]
【57148】Re:Cancelの解除方法 neptune 08/7/28(月) 22:13 発言[未読]

【57144】Cancelの解除方法
質問  亜矢  - 08/7/28(月) 20:11 -

引用なし
パスワード
   よろしくお願いします。
Private Sub TextBox25_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 ....
 Cancel=True
 .......
End sub
Textbox25に入力したデータが違っていた場合、それを削除して
フォーカスを元のTextbox25にするために上記のプログラムをつくりました。
 予定通りできました。動きました。
 問題はここにデータを完全に入れないと次へ進めなくなりました。
 それを解除する方法を教えて頂きたいと思います。

【57146】Re:Cancelの解除方法
発言  kanabun  - 08/7/28(月) 20:46 -

引用なし
パスワード
   ▼亜矢 さん:

> 問題はここにデータを完全に入れないと次へ進めなくなりました。
> それを解除する方法を教えて頂きたいと思います。

Cancel = True するまえに、メッセージボックスで
再入力するか問い合わせたらどうかしら?

'If 入力データが妥当でないとき

  If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
    Cancel = True
  Else
    Exit Sub
  End If
'End If

【57148】Re:Cancelの解除方法
発言  neptune  - 08/7/28(月) 22:13 -

引用なし
パスワード
   ▼亜矢 さん:
こんにちは
> 問題はここにデータを完全に入れないと次へ進めなくなりました。
> それを解除する方法を教えて頂きたいと思います。
既にアドバイス頂いている方法以外に、もう一つ良くやるのは、全部のデータ入力後
何らかの処理をする前に、全てのデータの正当性をチェックし、問題がある時は
そのTextBoxにフォーカスし、データを選択してやる。+メッセージ
と言うのも有りと思います。

【57149】Re:Cancelの解除方法
質問  亜矢  - 08/7/28(月) 22:52 -

引用なし
パスワード
   ▼kanabun さん:
>▼亜矢 さん:
>
>> 問題はここにデータを完全に入れないと次へ進めなくなりました。
>> それを解除する方法を教えて頂きたいと思います。
>
>Cancel = True するまえに、メッセージボックスで
>再入力するか問い合わせたらどうかしら?
>
>'If 入力データが妥当でないとき
>
>  If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
>    Cancel = True
>  Else
>    Exit Sub
>  End If
>'End If

  If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
    Textbox25="" 
    Cancel = True
  Else
    Exit Sub
  End If
にしましたが、再入力をしますでTextboxのデータを削除しますが、
Textboxにフォーカスが移りません。
フォーカスが出るようにしたいのですが、・・・・・

【57150】Re:Cancelの解除方法
発言  kanabun  - 08/7/29(火) 0:38 -

引用なし
パスワード
   ▼亜矢 さん:

>  If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
>    Textbox25="" 
>    Cancel = True
>  Else
>    Exit Sub
>  End If
> にしましたが、再入力をしますでTextboxのデータを削除しますが、
>Textboxにフォーカスが移りません。

失礼しました。
MsgBoxを表示したとたん、Focusが失われるようです。

再入力するか/再入力をCancelするか をMsgBox風に選んで分岐するようにする
となると、
MsgBoxを自作することしか、ぼくには思いつきませんでした。
非常にいまいちな方法ですが、いちおう紹介しますと、、、、

UserFormに Frame を追加します。(Frame1 とします)
Frameのなかに
  ◆Label  Caption は "入力エラーです.
            再入力しますか?"    とします。
  ◆CommandButton (名前は bInputOK ) --- MsgBoxの[OK]ボタンの替わり
  ◆もうひとつCommandButton
        (名前は bInputCancel )--- MsgBoxの[Cancel]ボタンの替わり

FrameのVisibleプロパティは False にしておきます。

で、対象のTextBoxが TextBox1 という名前だとすると、
以下のようなプロシージャコードをUserFormモジュールに追加してください。

'------------------------------------------
Private Sub TextBox1_Enter()
  NoControl = False
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If NoControl Then Exit Sub  '再入力Cancelモードのときは再チェックしない
 With TextBox1
  If .Text > Day(Date) Then '← ここにあなたの入力値 _
                  チェック条件を書いてください
    With Frame1      '自作MsgBoxを表示します
      .Top = TextBox1.Top
      .Left = TextBox1.Left
      .Visible = True
    End With
  End If
 End With
End Sub

Private Sub bInputCancel_Click()
  Frame1.Visible = False
  NoControl = True
  CommandButton1.SetFocus  '← ここをTextBox1のExitイベントが _
           発生したときにClickされたControl に直してください
End Sub

Private Sub bInputOK_Click()
  Frame1.Visible = False
  NoControl = True
  With TextBox1
    .Text = ""
    .SetFocus
  End With
End Sub

※とりあえず、MsgBoxの代替手段で Focus を維持するには
 こんな方法しか思いつきませんでした。

どうもすみません m(__)m

【57151】Re:Cancelの解除方法
発言  kanabun  - 08/7/29(火) 0:41 -

引用なし
パスワード
   忘れ物です

モジュールの先頭(宣言部)に以下の共有変数を宣言してください。

Private NoControl As Boolean

【57152】Re:Cancelの解除方法
発言  kanabun  - 08/7/29(火) 0:48 -

引用なし
パスワード
   なんどもすみません。訂正です

> Private Sub bInputOK_Click()
>   Frame1.Visible = False
  NoControl = False     '◆ ここ
>  With TextBox1
>    .Text = ""
>    .SetFocus
>  End With
>End Sub

【57153】Re:Cancelの解除方法
お礼  亜矢  - 08/7/29(火) 6:21 -

引用なし
パスワード
  
>なんどもすみません。訂正です
>
>> Private Sub bInputOK_Click()
>>   Frame1.Visible = False
>  NoControl = False     '◆ ここ
>>  With TextBox1
>>    .Text = ""
>>    .SetFocus
>>  End With
>>End Sub
kanabun さん
いろいろとお手数をお掛けしてすみませんでした。
おかげで解決しました。
今後もよろしくお願いします。

【57154】Re:Cancelの解除方法
発言  ichinose  - 08/7/29(火) 7:34 -

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

>>'If 入力データが妥当でないとき
>>
>>  If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
>>    Cancel = True
>>  Else
>>    Exit Sub
>>  End If
>>'End If
> にしましたが、再入力をしますでTextboxのデータを削除しますが、
>Textboxにフォーカスが移りません。
>フォーカスが出るようにしたいのですが、・・・・・

この現象Excel2002(2000でも)ではユーザーフォームがモードレスで
表示された場合でないと再現できません。

モーダルで表示した場合は、きちんとTextboxにフォーカスが戻ります。
もし、モーダルでもフォーカスが戻らない という現象なら、ExcelやWinのバージョンも
教えてください。

で、
「ユーザーフォームがモードレスで表示された場合」の現象だとして・・・。

新規ブックのユーザーフォーム(Userform1)に
  テキストボックス(TextBox1)
  コマンドボタン(Commandbutton1)

を配置してください。
 
Userform1のモジュールに

'===============================================================
Option Explicit
Private focus_obj As Object 'フォーカスを当てるコントロール
Private ev As Long '0--イべントを実行 その他--イベントを実行しない
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If ev <> 0 Then Exit Sub
 With TextBox1
   If IsNumeric(.Text) And (Val(.Text) Mod 3 = 0 Or InStr(.Text, "3") > 0) Then
    If MsgBox("3の倍数か3の付く数字は、馬鹿になるから駄目。再入力しますか?", vbOKCancel) = vbOK Then
      ev = 1
      .Visible = False
      .Text = ""
      Set focus_obj = TextBox1
      Me.Hide
      Me.Show vbModeless
      .Visible = True
      ev = 0
      Cancel = True
      End If
    End If
 End With
End Sub
'===================================================================
Private Sub UserForm_Activate()
  If Not focus_obj Is Nothing Then
    focus_obj.SetFocus
    Set focus_obj = Nothing
    End If
End Sub


標準モジュールに

'=====================================================================
Sub main()
  UserForm1.Show vbModeless
End Sub


これでmainを実行して、テキストボックスに「世界のナベアツが馬鹿になる数字」を
入力して試してみてください。


***************************************


このExitイベントは、色んな面で扱いが面倒です。
バグも多いし、配列の実現も難しいことをしないとできないし・・・。

私も実際には、neptuneさんの

>全部のデータ入力後何らかの処理をする前に、全てのデータの正当性をチェックし、問
>題がある時はそのTextBoxにフォーカスし、データを選択してやる

という方法で対処できるような仕様にしてしまいます。
つまり、Exitイベントでのエラーチェックを行わない方向で検討します。

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