VBAにて、ユーザーフォーム上のテキストボックスに初期値として今日の日付が入力されており、さらにそれを任意で変更するというマクロを作成しようとしています。
'テキストボックス2に初期値として今日の日付を入力
Private Sub UserForm_Initialize()
TextBox2.Text = Format$(Date, "yyyy/mm/dd")
End Sub
'テキストボックス2に入力された日付はdenpyoudateという変数に格納される
Private Sub TextBox2_Change()
denpyoudate = UserForm2.TextBox2.Value
End Sub
入力された日付を変数として利用したいので、上記のようなコードにしたのですが、実際に初期値である今日の日付を編集すると「型が一致しません」というエラーが出てしまいます。
このエラーを回避し、テキストボックスに入力された日付を変数として使用するにはどうすればよいでしょうか?
No.3ベストアンサー
- 回答日時:
変数DenpyouDateがDate型でもVariant型でも
DenpyouDate=TextBox2.Value
とする前に、TextBox2.ValueがDate型なのかチェックの必要があります。
どのイベントでチェックするかは場合によるでしょうが、
BeforUpDateイベントでやれば、TextBox2の値が日付でなかった場合
引数CanceをTrueにすることによりTextBox2の入力を取り消すことができます。
この取り消すと言う意味は他のイベントを使ってみれば分かります。
'-------------------------------------------
Dim DenpyouDate As Date (or As Variant)
'------------------------------------------------
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox2.Value) Then
DenpyouDate = TextBox2.Value
Else
TextBox2.Value = ""
Cancel = True
End If
End Sub
'------------------------------------------
● TextBox2.Value = ""
を省いた場合もテストしてみることをお勧めします。
以上です。
回答ありがとうございます。
検討の結果、以下のコードを流用させていただくことにしました。
Dim DenpyouDate As Date (or As Variant)
'------------------------------------------------
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox2.Value) Then
DenpyouDate = TextBox2.Value
Else
TextBox2.Value = ""
Cancel = True
msgbox("日付が不正です")
End If
End Sub
ありがとうございました。
No.4
- 回答日時:
こんにちは。
今回のUserFormのTextBox に入力する場合に、日付を正しく入れるというのは、本当は、実務レベルでは難しいのです。VBAの1年ぐらいのレベルでは、なかなか分からないのです。概ね、失敗して覚えるものです。私が、#2で書いたように、Variant 型変数にすることで、当面のエラーは消えます。ただし、その値が正しいとは限りません。後は、入力するUserさん任せです。それ以上は、入門レベルの方や基本を覚えただけの人には、それを言っても分からないようにも思いました。
こういう、私も、日付値の自動変換(キャスティング)が、さっぱり分からなかった時代があります。もともと、VBAは、米環境で、アジア式や欧州式でもありませんから、基本的な日付リテラル値は、#m/d/yyyy# スタイルが標準でした。Office やOS もバージョンがあがり、そういう点で、フレキシブルな対応するようになりました。
しかし、コードを提供する側としては、Office のVersionやロケールの違いという見えない問題を考える必要があるのです。だから、入力した日付データを検査しないでそのまま、Date型変数に代入するのは難しいのです。うまく入ったからといって、それが正しいというのは、たまたまだと解釈してよいのではないかと思います。
仮に、文字長のチェックをさせたとしても、
2009/09/31 など、存在しない日にち
特に、うるう年などで、2008/02/30 は存在するのに、2009/02/30 は存在しません。したがって、ダイレクトに入れたら、実行時エラーが発生します。私は、それを、On Error Resume Next などのエラートラップで処理する方法を好みません。本来、エラートラップは回避できないものに対してのみに置くべきです。これも、コーディングスタイルの一つです。
手間を省くために、文字長チェックをしない場合は、
9/31 と入れてしまった場合は、Date 型では、日付として認識してしまいます。
3/1/9 と入れた場合は、2003年1月9日と認識します。それが当たり前のような気がしているけれども、それは、本来、Office のバージョン、日本語OSやロケールの設定によるものだと思います。
また、もしも、month/day と入力されたときは、その年、Year(Date) と同じでなくてはなりませんが、間違った入力すると、まったく別の年になっています。そういうチェックも必要です。
もちろん、年/月/日の位置をガッチリ決めさせる方法がないわけではありません。それは、DTPicker などを使うなら、確実な日付値が得られますから、
例:
Private Sub DTPicker1_KeyDown(KeyCode As Integer, ByVal Shift As Integer)
Dim myDate As Date
If KeyCode <> 13 Then Exit Sub
myDate = DTPicker1.Value
TextBox1.Text = Format$(myDate, "yyyy/mm/dd")
End Sub
こういう方法も可能です。(Office XP以上だったと思いますが、標準的に、その他のコントロールに"Microsoft Date and Time Picker Control 6.0"として入っています。)
当面、こちらは、Excel 2003 +Win XP で、ロケールは日本で、日付値は日本型の標準にしてありますが、環境が違うことを想定すると、まだ足りないものがあるかもしれません。本来は、データの予測値というものを前提に置かなくてはならないのです。ただ、そこまでは、なかなか難しいのです。
今回のご質問者さんは、「denpyoudate = "伝票日"」ですから、ある程度の年の予測範囲は決まってくるのですが、たとえば、オールラウンドの年代の生年月日の入力なども、問題になってきます。だから、一概に、こういうコードだとは決められないのです。私は、単に、コーディング・スタイルとしてのTextBox の値を、直接、Date 型の変数に入れないということで、当面はよいのかと思っています。
サンプルマクロ
'-------------------------------------------
'UserForm モジュール
'UserForm
'TextBox 2個
'-------------------------------------------
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim myDate As Date
Dim buf As Variant
If KeyCode <> 13 Then Exit Sub
buf = TextBox1.Text
buf = StrConv(buf, vbNarrow)
' '文字数をカウントする。
' If Len(buf) - Len(Replace(buf, "/", "")) <> 2 Or Len(buf) <> 10 Then
' MsgBox "yyyy/mm/dd で入力してください。", vbExclamation
' KeyCode = 0
' Exit Sub
' End If
'日付が正しく入っているかチェック
If IsDate(buf) = False Then
MsgBox "日付値ではありません。", vbCritical
KeyCode = 0 '次のコントロールに行かない
Exit Sub
ElseIf Abs(Year(Date) - Year(buf)) > 10 Then '10年以上のブレ
If DateChecker(buf) = False Then
KeyCode = 0
Exit Sub
End If
End If
myDate = CDate(buf)
MsgBox myDate
TextBox2.Value = Format$(myDate, "GGGE年m月d日")
End Sub
Private Function DateChecker(ByVal buf As String) As Boolean
'正しく日付が入力されているかメッセージを出す
If MsgBox(Format$(buf, "yyyy/mm/dd") & "日付は正しいでしょうか?", _
vbQuestion + vbYesNo + vbDefaultButton2) = vbNo Then
DateChecker = False
Else
DateChecker = True
End If
End Function
'-------------------------------------------
なお、私の記憶では、この日付判定には、通常の入力には支障はありませんが、少なくとも、Office 2003 までにバグが存在していたようにも思います。
回答ありがとうございます。
検討の結果、以下のコードを流用させていただくことにしました。
Dim DenpyouDate As Date (or As Variant)
'------------------------------------------------
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox2.Value) Then
DenpyouDate = TextBox2.Value
Else
TextBox2.Value = ""
Cancel = True
msgbox("日付が不正です")
End If
End Sub
ありがとうございました。
No.2
- 回答日時:
こんばんは。
>denpyoudateという変数に格納される
質問には、どこにも変数の宣言が書かれていませんが、一般的に、UserForm のTextBox では、その変数に日付を入れるにしても、変数を節約して使う場合は、Variant 型にします。また、日付として認識できる形になっていれば、String 型でも良いのです。Date 型にしたら、Date型の値しか入れられません。型が違うというエラーが出てきてしまいます。もし、念を入れるなら、出力の際に日付になっているか、IsDate でチェックをします。
最初から、入力を日付型と決め付けないことで作るのは、コーディング・スタイルです。人は、誰でも間違いをするから入れ物自体はフリーにして起きます。ここで、On Error トラップはうまくありません。
回答ありがとうございます。
検討の結果、以下のコードを流用させていただくことにしました。
Dim DenpyouDate As Date (or As Variant)
'------------------------------------------------
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox2.Value) Then
DenpyouDate = TextBox2.Value
Else
TextBox2.Value = ""
Cancel = True
msgbox("日付が不正です")
End If
End Sub
ありがとうございました。
No.1
- 回答日時:
denpyoudate As Date で宣言してるのだと思いますが
TextBox2_Change()ではなくて
Private Sub TextBox2_AfterUpdate()
denpyoudate = UserForm2.TextBox2.Value
End Sub
にしてください。
回答ありがとうございます。
検討の結果、以下のコードを流用させていただくことにしました。
Dim DenpyouDate As Date (or As Variant)
'------------------------------------------------
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox2.Value) Then
DenpyouDate = TextBox2.Value
Else
TextBox2.Value = ""
Cancel = True
msgbox("日付が不正です")
End If
End Sub
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Excel(エクセル) 【vba】日付の形式が勝手に変わってしまう。 1 2022/09/29 10:54
- Visual Basic(VBA) Excelマクロでセルに値が入力されたら実行する 5 2023/08/06 11:03
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Visual Basic(VBA) ユーザーフォームで銀行に対応した支店コードの入力ができません Sheet1のA列に銀行名、B列に銀行 5 2022/07/28 17:50
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
エクセルVBA ユーザーフォームのTextBoxを日付にしたい
Excel(エクセル)
-
エクセルVBAのフォームで日時を入力しやすくしたい
Excel(エクセル)
-
Excelにて、ユーザーフォームで、日付けの範囲を指定し、検索しデーターを抽出し 別シートへ転記した
Excel(エクセル)
-
-
4
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
5
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
-
6
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
TextBoxに日付を自動的に入れる
Visual Basic(VBA)
-
9
イベントの違いを教えてください。
Visual Basic(VBA)
-
10
ユーザーフォームのラベルに日付を表示させる方法があればお願いします。出来ればコード書いていただけると
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「24日の0時」って・・・
-
「時間」、「期日」、「日付」...
-
日付の大小の表現
-
エクセル マクロ 名前を付けて...
-
回覧板の日付について質問です...
-
パソコンで購入したデーターが...
-
Access VBA SQL文で教えてください
-
差し込み印刷に当日の日付が入...
-
日付以外のデータを抽出したい...
-
VBA テキストボックスで日付を...
-
PDFファイルに日付を名前にして...
-
差込印刷 縦書きで和暦(漢数...
-
エクセルで6ヵ月後を自動入力で...
-
Excelでヘッダに前日の日付を表...
-
EXCELで日付を****年上期、****...
-
Googleスプレッドシートで期日...
-
エクセルで日付け表示で、明治...
-
エクセルで日付別にシートを分...
-
スクリーンショットで撮影する...
-
折れ線グラフ 横軸の日付 土...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「24日の0時」って・・・
-
パソコンで購入したデーターが...
-
「時間」、「期日」、「日付」...
-
日付の大小の表現
-
差し込み印刷に当日の日付が入...
-
回覧板の日付について質問です...
-
エクセル マクロ 名前を付けて...
-
TODAY関数から次の火曜もしくは...
-
エクセルで日付別にシートを分...
-
Excelについて
-
スプレッドシートで使う数式を...
-
エクセルで日付け表示で、明治...
-
履歴書の日付間違いで落ちますか。
-
Excelでヘッダに前日の日付を表...
-
ACCESSで1月1日~12月31日まで...
-
ACCESSで日付ごとに自動連番(...
-
エクセルで6ヵ月後を自動入力で...
-
2つの日付の中間の日付 エク...
-
差込印刷 縦書きで和暦(漢数...
-
EXCELで日付を****年上期、****...
おすすめ情報