Excel VBA質問箱 IV

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

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


6099 / 13645 ツリー ←次へ | 前へ→

【46901】テキストボックスを使った日付入力 初心者 07/2/21(水) 11:40 質問[未読]
【46902】Re:テキストボックスを使った日付入力 ひげくま 07/2/21(水) 11:50 発言[未読]
【46903】Re:テキストボックスを使った日付入力 初心者 07/2/21(水) 12:47 回答[未読]
【46904】Re:テキストボックスを使った日付入力 Blue 07/2/21(水) 13:02 回答[未読]
【46905】Re:テキストボックスを使った日付入力 Blue 07/2/21(水) 13:10 発言[未読]
【47227】Re:テキストボックスを使った日付入力 初心者 07/3/5(月) 17:25 質問[未読]
【47228】Re:テキストボックスを使った日付入力 Blue 07/3/5(月) 17:36 発言[未読]
【47230】Re:テキストボックスを使った日付入力 Blue 07/3/5(月) 17:48 回答[未読]
【47233】Re:テキストボックスを使った日付入力 初心者 07/3/5(月) 18:31 お礼[未読]

【46901】テキストボックスを使った日付入力
質問  初心者 E-MAIL  - 07/2/21(水) 11:40 -

引用なし
パスワード
   すいません、以下のことがやりたいのですが・・。

1.テキストボックスを表示し、日付をyyyy/mm/ddの形式で
入力してもらう。

2.この時に形式チェックをする。日付以外ならエラーにする。
また、mm/ddで入力されたらyyyy/mm/ddに直す。

3.次に入力された日付をsheet1のa1のセルに書き込む。

【46902】Re:テキストボックスを使った日付入力
発言  ひげくま  - 07/2/21(水) 11:50 -

引用なし
パスワード
   ▼初心者 さん:
こんにちは。

A1を、入力規則で、「入力値の種類」を「日付」にするだけでは駄目ですか?

テキストボックスを表示することが重要だったりしますか?

【46903】Re:テキストボックスを使った日付入力
回答  初心者 E-MAIL  - 07/2/21(水) 12:47 -

引用なし
パスワード
   ▼ひげくま さん:
>▼初心者 さん:
>こんにちは。
>
>A1を、入力規則で、「入力値の種類」を「日付」にするだけでは駄目ですか?

シートのクリアをしたり、列を削除したりしているので
日付をセルに入れると前の日付が違うセルに残ってしまうので
テキストボックスにしようとしています。

>
>テキストボックスを表示することが重要だったりしますか?

【46904】Re:テキストボックスを使った日付入力
回答  Blue  - 07/2/21(水) 13:02 -

引用なし
パスワード
   Like演算子とIsDateをつかってチェックするとか。

Sub test()
  Dim s As String
  
  s = "2007/02/29" ' NGな日付
  
  ' 形式チェック
  If Not s Like "####/##/##" Then
    MsgBox "NG Date Format"
    Exit Sub
  End If
  
  ' 日付の妥当性のチェック
  If Not IsDate(s) Then
    MsgBox "NG Date Validity"
    Exit Sub
  End If
  
  MsgBox "OK"
End Sub

【46905】Re:テキストボックスを使った日付入力
発言  Blue  - 07/2/21(水) 13:10 -

引用なし
パスワード
   >mm/ddで入力されたらyyyy/mm/ddに直す。
の yyyy はナニを基準にするのでしょうか?
今年の西暦でしょうか?

そうであれば、
>  ' 形式チェック
>  If Not s Like "####/##/##" Then
>    MsgBox "NG Date Format"
>    Exit Sub
>  End If

  ' 形式チェック
  If s Like "##/##" Then
    s = Format(Date, "yyyy/") & s
  ElseIf Not s Like "####/##/##" Then
    MsgBox "NG Date Format"
    Exit Sub
  End If
とすればいいでしょう。

【47227】Re:テキストボックスを使った日付入力
質問  初心者 E-MAIL  - 07/3/5(月) 17:25 -

引用なし
パスワード
   ▼Blue さん:
返事がおそくなりました。


-------------------------------------------------------------------------
'主プロで日付を入力させる
UserForm1.Show
-------------------------------------------------------------------------

'ユーザフォームでボタンの定義をする
Private Sub CommandButton1_Click()

'sheet1のd1に日付を入れる       
  Sheets("sheet1").Select
  Range("d1").Select
  Selection.ClearContents
  Range("d1") = UserForm1.TextBox1.Text
  Unload Me
 
  
End Sub
-------------------------------------------------------------------------

'キャンセルボタンを押したらsheet2をクリアする
Private Sub CommandButton2_Click()
  Unload Me
  Sheets("sheet2").Select
  Cells.Select
  Selection.ClearContents
  Rows("3:65536").Select
  Selection.Delete Shift:=xlUp
  Range("a3").Select
  End
End Sub
-------------------------------------------------------------------------

'入力値のチェックをする
Private Sub kijyunbi()

'日付の妥当性のチェック
If Not IsDate(Range("d1")) Then
    MsgBox "有効な日付ではありません。再度入力して下さい。"
    UserForm1.Show
End If


'文字数が半角10文字かチェック

  If Len(Range("d1")) <> 10 Then
    MsgBox ("日付を yyyy/mm/dd の形式で入力して下さい")
    UserForm1.Show
  End If

' 形式チェック
If Not Range("d1") Like "####/##/##" Then
    MsgBox "日付のフォーマットではありません。再度入力して下さい。"
    UserForm1.Show
End If
  

'日付に変換できる値かチェック
If IsDate(Range("d1")) <> True Then
    MsgBox ("正しい日付を入力して下さい")
    UserForm1.Show
End If

End Sub
-------------------------------------------------------------------------

上のコードだと次のような問題がでます。
1.「123」のように入力しても「1900/5/2」のようにsheet1のd1に入力されてしまう。
2.「vba」と5回入力すると、チェックをすり抜け、型が一致しないと言われる。
チェックを繰り返したいのに、繰り返しになっていない。
3.「123456789123456789123456789」と入力するとオーバーフローする。

ちょっと自分ではどうすることも出来なくて・・・。
すいませんが、どなたかお願いします。

【47228】Re:テキストボックスを使った日付入力
発言  Blue  - 07/3/5(月) 17:36 -

引用なし
パスワード
   なぜ
>'日付の妥当性のチェック
を最初に持ってきているのでしょうか?
これをするのは形式が正しいときでいいのではないでしょうか?
しかも、

>'日付に変換できる値かチェック
で同じことをしているし。


さらに
>'文字数が半角10文字かチェック
は不要でしょう。
>' 形式チェック
で網羅できます。
つまり

'入力値のチェックをする
Private Sub kijyunbi()
  Dim input As String

  input = Range("D1").Text

  ' 形式チェック
  If Not input Like "####/##/##" Then
    MsgBox "日付のフォーマットではありません。再度入力して下さい。"
    UserForm1.Show
  End If

  '日付に変換できる値かチェック
  If Not IsDate(input) Then
    MsgBox ("正しい日付を入力して下さい")
    UserForm1.Show
  End If
End Sub
  
だけでいいのでは?

【47230】Re:テキストボックスを使った日付入力
回答  Blue  - 07/3/5(月) 17:48 -

引用なし
パスワード
   それと、ちぇっくするのはD1転記に転記前なのではないでしょうか?
つまり

'ユーザフォームでボタンの定義をする
Private Sub CommandButton1_Click()

'sheet1のd1に日付を入れる       
  Sheets("sheet1").Select
  Range("d1").Select
  Selection.ClearContents
<ここでちぇっくする!!!>
  Range("d1") = UserForm1.TextBox1.Text
  Unload Me
 
  
End Sub


つまりまとめると、

' テキストボックスに入力された文字列をチェックする関数
Private Function IsDateText(ByVal inputText As String) As Boolean
  ' 形式チェック
  If Not inputText Like "####/##/##" Then
    MsgBox "日付のフォーマットではありません。再度入力して下さい。"
    Exit Function
  End If

  '日付に変換できる値かチェック
  If Not IsDate(inputText) Then
    MsgBox ("正しい日付を入力して下さい")
    Exit Function
  End If
 
  ' 日付の形式として正しい
  IsDateText = True
End Function

'ユーザフォームでボタンの定義をする
Private Sub CommandButton1_Click()
  ' テキストボックスに入力された文字列をチェックする
  If IsDateText(Me.TextBox1.Text) Then
     ' 正しいのでD1に転記
     Worksheets("sheet1").Range("D1").Value = Me.TextBox1.Text
     Unload Me
  End If
End Sub


となります。

【47233】Re:テキストボックスを使った日付入力
お礼  初心者 E-MAIL  - 07/3/5(月) 18:31 -

引用なし
パスワード
   できましたー!!
すっきりしました。

Functionを使うんですね。
ありがとうございます!。

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