Excel VBA質問箱 IV

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

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


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

【64449】TextBoxの入力制限について Matumo 10/2/8(月) 9:32 質問[未読]
【64450】Re:TextBoxの入力制限について ponpon 10/2/8(月) 10:33 発言[未読]
【64451】Re:TextBoxの入力制限について Matumo 10/2/8(月) 11:19 質問[未読]
【64452】Re:TextBoxの入力制限について ponpon 10/2/8(月) 11:31 発言[未読]
【64453】Re:TextBoxの入力制限について Hirofumi 10/2/8(月) 11:58 回答[未読]
【64454】Re:TextBoxの入力制限について ponpon 10/2/8(月) 12:51 発言[未読]
【64455】Re:TextBoxの入力制限について mura 10/2/8(月) 16:56 回答[未読]
【64458】Re:TextBoxの入力制限について Matumo 10/2/9(火) 8:48 お礼[未読]
【64459】Re:TextBoxの入力制限について Hirofumi 10/2/9(火) 11:02 発言[未読]
【64484】Re:TextBoxの入力制限について Matumo 10/2/15(月) 8:41 質問[未読]
【64486】Re:TextBoxの入力制限について Hirofumi 10/2/15(月) 12:10 回答[未読]
【64493】Re:TextBoxの入力制限について Matumo 10/2/15(月) 15:20 質問[未読]
【64495】Re:TextBoxの入力制限について Hirofumi 10/2/15(月) 15:47 回答[未読]
【64514】Re:TextBoxの入力制限について Matumo 10/2/17(水) 10:29 お礼[未読]

【64449】TextBoxの入力制限について
質問  Matumo  - 10/2/8(月) 9:32 -

引用なし
パスワード
   いつもお世話になっています。

TextBox1の入力を
年月日または月日の入力で○○○○/○/○または○/○
(数字は半角、月日は一桁と二桁の場合があります)
の表現以外は、「正しい入力ではありません」のメッセージを
出したいのですが、ご指導・アドバイスお願いします。

If TextBox1 <> xlDate Then
    MsgBox "正しい入力ではありません", vbExclamation
  Exit Sub
End If

【64450】Re:TextBoxの入力制限について
発言  ponpon  - 10/2/8(月) 10:33 -

引用なし
パスワード
   ▼Matumo さん:
こんなことでしょうか?
参考になれば

Sub test()
  
  If Range("A1").Text = Format(Range("A1").Value, "m/d") Or _
    Range("A1").Text = Format(Range("A1").Value, "yyyy/mm/dd") Then
    MsgBox "good"
  Else
    MsgBox "bad"
  End If

End Sub

【64451】Re:TextBoxの入力制限について
質問  Matumo  - 10/2/8(月) 11:19 -

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

早速ご回答頂き有難うございます。

書き方が間違っていました、UserFormのTextBox1に
"m/d"または"yyyy/mm/dd"
以外の入力をすると、
MsgBox に"m/d"または"yyyy/mm/dd
の入力をすること"と表示したいのです。

あるいは、UserFormのTextBox1には、これ以外の入力しか
出来ないようなデフォルト設定をすることは出来るのでしょうか。 

よろしくお願いします。

【64452】Re:TextBoxの入力制限について
発言  ponpon  - 10/2/8(月) 11:31 -

引用なし
パスワード
   ▼Matumo さん:
>"m/d"または"yyyy/mm/dd"
>以外の入力をすると、
> MsgBox に"m/d"または"yyyy/mm/dd
>の入力をすること"と表示したいのです。

↑は、ラベルでテキストボックスの上に表示すればどうでしょう?

>
>あるいは、UserFormのTextBox1には、これ以外の入力しか
>出来ないようなデフォルト設定をすることは出来るのでしょうか。 

デフォルト設定は、わかりませんが、先ほどのサンプルでやったように
msgoboxで注意を喚起し、最初から入力のやり直しをすれば良いと思います。
私なら、両方します。
range("A1").textをtextbox1.textに変えれば意味はわかると思いますが。

【64453】Re:TextBoxの入力制限について
回答  Hirofumi  - 10/2/8(月) 11:58 -

引用なし
パスワード
   「"m/d"または"yyyy/mm/dd"以外の入力をすると」では無く
日付と認められる入力は全て認めて、その後Text.Boxの値を必要な型に変更したら?

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

  With TextBox1
    If .Value = "" Then
      Exit Sub
    End If
    If Not IsDate(.Text) Then
      Cancel = True
      MsgBox "入力が日付として認められません"
    Else
      .Text = Format(DateValue(.Text), "m/d")
    End If
  End With
  
End Sub

【64454】Re:TextBoxの入力制限について
発言  ponpon  - 10/2/8(月) 12:51 -

引用なし
パスワード
   ▼Hirofumi さん:
>「"m/d"または"yyyy/mm/dd"以外の入力をすると」では無く
>日付と認められる入力は全て認めて、その後Text.Boxの値を必要な型に変更したら?

ホントだ。って、自分の時はそうしてました。
こっちの方が、わかりやすいですね。

【64455】Re:TextBoxの入力制限について
回答  mura  - 10/2/8(月) 16:56 -

引用なし
パスワード
   >TextBox1の入力を
>年月日または月日の入力で○○○○/○/○

まったく別のアプローチですが、
TextBoxでは無く 日付入力なら定番のDTPickerを用いられたらどうでしょう。
外見はコンボボックスのようで[▼]をクリックするとカレンダーが表示され日付を選択して入力出来ます。
DTPickerコントロールを用いなくても利用出来るクラスが提供されています。
ht tp://www.vector.co.jp/soft/win95/business/se426717.html

【64458】Re:TextBoxの入力制限について
お礼  Matumo  - 10/2/9(火) 8:48 -

引用なし
パスワード
   ▼ponpon さん Hirofumi さん mura さん:

有難うございました。
お陰さまで解決しました。
With TextBox1の構文を活用させていただきました。
ただ、Cancel=Trueでエラーが発生し、コメントにして
います。

muraさんの別のアプローチは一寸今回の他のコードとの
関連から断念しました。

今後ともよろしくお願いします。

【64459】Re:TextBoxの入力制限について
発言  Hirofumi  - 10/2/9(火) 11:02 -

引用なし
パスワード
   >With TextBox1の構文を活用させていただきました。
>ただ、Cancel=Trueでエラーが発生し、コメントにして
>います。

イベントが違うのでは?

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

に書けば?

【64484】Re:TextBoxの入力制限について
質問  Matumo  - 10/2/15(月) 8:41 -

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

ご指導有難うございます。かなり時間がかかっていますが、また質問です、よろしくお願いします。

>イベントが違うのでは?
>Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

その通りです。現在Private Sub CommandButton2_Click()の中に、頂いたコードを入れて、Cance=Trueをコメントで問題なく動作しています。ただ、Clickするまで反応が得られませんが・・・

頂いたイベントでTextBox1から次の動作をさせると、日付以外は
MsgBoxでメッセージが出て便利ですが、UserForm表示時に表示をキャンセル
する右上の「×」を押してもこのMsgBoxが二回表示されその都度OKを押さなくてはなりません。・・・何かが災いしているのだと思いますが。
コードの動き見たいのですが、
UserFormでのステップイン(F8)のような方法は無いのでしょうか?

【64486】Re:TextBoxの入力制限について
回答  Hirofumi  - 10/2/15(月) 12:10 -

引用なし
パスワード
   >ご指導有難うございます。かなり時間がかかっていますが、また質問です、よろしくお願いします。
>
>>イベントが違うのでは?
>>Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
>
>その通りです。現在Private Sub CommandButton2_Click()の中に、頂いたコードを入れて、
>Cance=Trueをコメントで問題なく動作しています。ただ、Clickするまで反応が得られませんが・・・
>
>頂いたイベントでTextBox1から次の動作をさせると、日付以外は
>MsgBoxでメッセージが出て便利ですが、UserForm表示時に表示をキャンセル
>する右上の「×」を押してもこのMsgBoxが二回表示されその都度OKを押さなくてはなりません。
>・・・何かが災いしているのだと思いますが。

色々なイベントが重なって起こる事が有りえると思いますが?

「Sub CommandButton2_Click()」の中にだけ書いて有るならば
この様には成らないと思います
別に、TextBox1のイベントが有って、其処にも書かれているのでは?
UserFormのコードをUpして見て下さい

また、このコードは以下の様に使う事を想定しています

Private Sub CommandButton2_Click()

  If TextBox1.Value = "" Then
    MsgBox "TextBox1の入力が有りません"
    Exit Sub
  End If
  
  '以下処理
  
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

  With TextBox1
    If .Value = "" Then
      Exit Sub
    End If
    If Not IsDate(.Text) Then
      Cancel = True
      MsgBox .Value & "は入力が日付として認められません" '★変更
      .Value = "" '★追加
    Else
      .Text = Format(DateValue(.Text), "m/d")
    End If
  End With

End Sub

TextBox1の動きは、
 値が書き変わった場合、値をチェックし日付と認められる時は書式を変更して表示
 認められない場合、フォーカスをTextBox1の戻して、MsgBoxを表示
 値が無かった場合は、チェックをせず次にフォーカスを移す
と成ります

なぜ、値が無い("")場合にチェックをしないのかと言いますと
今回の様に、UserFormを開いて何もせず閉じた場合、常にチェックしていると
入力チェックに引っ掛かり直ぐに閉じられません
其処で、TextBoxのイベントでは、値が無い("")場合のチェックをせず
TextBoxの値を使って処理を行うCommandButtonのイベントの方で値の有無のチェックを行います
(既に、TextBoxのイベントで値の整合性は確保されていますので)

>コードの動き見たいのですが、
>UserFormでのステップイン(F8)のような方法は無いのでしょうか?

F8は、UserFormでも使えますよ?
もし、「×」ボタンを押した時からと言う意味なら、
「×」ボタンが押されると「Sub UserForm_QueryClose」のイベントが起きますので
例えば、その中に以下の様なダミーの処理を書いて、此れに(i = 1)ブレークポイントを設定します

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  Dim i As Long
  
  i = 1
  
End Sub

そうすれば観られるでしょ?

【64493】Re:TextBoxの入力制限について
質問  Matumo  - 10/2/15(月) 15:20 -

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

丁寧な解説を頂き有難うございます。じっくりと読ませていただきました。
本当に有難うございました。感謝しています。
少しずつ理解ができました。
整合性を確保する意味も分かりましたが、未だ表面的なレベルと思います。
これを機会に身に付ける努力をしたいと思います。

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
の最終コードに
TextBox1.SetFocus '←
End Sub
Focusさせたいので上記コードを入れたのですが、効きません。
何か方法は無いでしょうか?

【64495】Re:TextBoxの入力制限について
回答  Hirofumi  - 10/2/15(月) 15:47 -

引用なし
パスワード
   >丁寧な解説を頂き有難うございます。じっくりと読ませていただきました。
>本当に有難うございました。感謝しています。
>少しずつ理解ができました。
>整合性を確保する意味も分かりましたが、未だ表面的なレベルと思います。
>これを機会に身に付ける努力をしたいと思います。
>
>Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
>の最終コードに
>TextBox1.SetFocus '←
>End Sub
>Focusさせたいので上記コードを入れたのですが、効きません。
>何か方法は無いでしょうか?

何故、「TextBox1.SetFocus」が必要なのですか?

    If Not IsDate(.Text) Then
      Cancel = True

「Sub TextBox1_BeforeUpdate」のコードの中に上記の記述が有ります
この、「Cancel = True」は、このイベントをキャンセルさせると言う事で、
キャンセルにTrueを入れると、自動的にフォーカスは、TextBox1に戻ってきますし
整合チェックがOKなら次のコントロールにフォーカスが移ります
其れに、「TextBox1.SetFocus」を入れる意味が有りません
現状このコードが実行される時点で、フォーカスはTextBox1に有りますので利かないのだと
思います

尚、前のレスのMsgBoxが2回出てくる問題は如何なったのでしょうか?

【64514】Re:TextBoxの入力制限について
お礼  Matumo  - 10/2/17(水) 10:29 -

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

>何故、「TextBox1.SetFocus」が必要なのですか?

月日以外の例えば5555のような数字や文字を入れると、MsgBoxで
「日づけと認められません」が表示され、OKを押すと、再度正しい月日を
入れなおすために、TextBox1にカーソルがちかちかさせることが
出来ないか? の方が便利なので、質問しました。

>尚、前のレスのMsgBoxが2回出てくる問題は如何なったのでしょうか?
美味く行きました。有難うございます(書くのを忘れていました、失礼しました)

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