
エクセルマクロで、仕事の「開始時間」「終了時間」をInputBox関数を使って入力しています。
質問なんですが、
時間を入力するとき、不正な値を入力したときのエラー分岐をしたいのです。
例えば 6:00 と入力すべき所を誤って 6::0 になったり
ただの数字 6 だったり、開始時間より終了時間が小さかったり
した場合
どのような構文で分岐したら良いのでしょうか
開始時間・終了時間はデータ型を宣言していません
なので
マクロ実行時、型はEmpty 値となって
If 開始時間 ="" Then ・・・としているだけで
空白以外は全て受け付けてしまう仕様になっています。
これを時刻形式の表示(hh:mm) 以外を拒否するためには
どのようすれば良いか分かりません
データ型をDim 開始時間 As Date
にしてみたのですが、このときエラー時分岐判断はどのように
すれば良いのでしょうか
また他に良い方法があれば教えてください
No.4ベストアンサー
- 回答日時:
こんにちは。
#1です。#2 さんの
>#1さんほどスマートじゃないけど。
最初に、「いいえ!」
本当は、標準的には、
>On Error GoTo ER:
とするのが普通なのですね。後で、もう一度触れます。
最初に、以下は、ひとつのフレーズです。
>If 開始時間 = "" Or VarType(開始時間) = vbBoolean Then Exit Sub
>この VarType(開始時間) = vbBoolean ・・・は
>どのような意味になるのでしょう?
変数「開始時間」というのは、Variant 型なので、そこには、二種類の型が入ります。
ひとつは、文字型で、もうひとつは、キャンセルを押したときには、Boolean 型です。戻り値は、False です。もともと、True, False が入るということは予想していませんから、そこで、プロシージャから離脱させるように作ります。
だから、ここがミソです。
Dim 開始時間 As Variant
もしも、InputBox 関数で書くと、同じ内容でも、もう少し、難しくなってしまいます。
もともと、InputBox 自体がレガシー(過去の遺物)なのですが、InputBox関数と同じ機能を持たせるためには、いわゆる「レガシー機能=StrPrt関数」という方法を使わざるを得なくなるからです。
> If Not (InStr(開始時間, ":") > 1 And IsDate(開始時間))
例えば、数字のみを入れた場合は、IsDate として、日にちとして、受け取ります。
それでは、時間を受け取れることが出来ません。そこで、例 12:12 として、必ず、「: (コロン)」は、2以上の場所にあることが条件になります。しかし、例: 12:12:12:12 では、時間としては受け取れませんので、両方が成り立つときにだけ、ループを離脱して、改めて、
変数「開始時間」は時間として扱うことが出来る、という仕組みになっています。
ところで、これは、「Goto を使うな」というのは、構造化言語を開発した人間の提唱した言葉で、あえて、それに100%従うのはナンセンスなのですが、こういう方法もある、ということぐらいで十分だと思います。
エラー処理は、やはり、Error トラップが簡単です。しかし、なぜ、Errorになるか、ということを良く分かった上で作ったほうがよいと思います。
すごく分かりやすい説明ありがとうございます
#papayuka 様の構文と併せて勉強させてもらいます
あかげでなんとか自分なりにマクロが出来そうな目処が立ちました
本当にありがとうございます
No.3
- 回答日時:
不完全回答と思いますが
Sub test01()
t = InputBox("開始時刻")
If IsDate(t) Then
MsgBox "OK"
Else
MsgBox "時刻エラー"
End If
End Sub
をやってみましたが、チェックが完全ではないようです。
ある程度は「時刻としておかしなもの」は指摘するが。
ーー
>開始時間より終了時間が小さかったり
などは常識的で単独の値でOKになってしまえばチェックは簡単ですが
ーー
時刻にふさわしい入力値かどうかのチェックは、意外に難しく、色々条件をコードに作りこまないといけないように感じました。
>時刻にふさわしい入力値かどうかのチェックは、意外に難しく、
>色々条件をコードに作りこまないといけないように感じました。
本当に難しいですね
忙しい中色々と考えていただきありがとうございます。
感謝いたします
No.2
- 回答日時:
既に回答が出てますが、せっかく書いたので載せます。
#1さんほどスマートじゃないけど。
Sub Test()
Dim stTime, edTime
On Error GoTo ER:
stTime = TimeValue(Application.InputBox _
("開始時刻(hh:mm)は?", "時刻", Type:=2))
edTime = TimeValue(Application.InputBox _
(stTime & " ~ 終了時刻(hh:mm)は?", "時刻", Type:=2))
If stTime < edTime Then
MsgBox "開始:" & stTime & " ~ 終了:" & edTime & "", vbInformation
Else
MsgBox "終了は開始より後じゃなきゃ!", vbCritical, "ダメよ"
End If
Exit Sub
ER:
If MsgBox("時刻指定に誤りがあります。" & vbCrLf & _
"再度入力しますか?", vbYesNo + vbExclamation) = vbYes Then Resume
End Sub
>#1さんほどスマートじゃないけど。
いえいえ。本当に助かります。
私のマクロより数段すばらしいです。
エラー処理は難しくマクロ構文の収拾がつかなくなってきました
(ーー;)
ひとつ、ひとつ分解して勉強させていただきます。
ありがとうございました
感謝いたします。
No.1
- 回答日時:
こんばんは。
InputBox は、InputBox メソッドに切り替えてください。
それから、
>データ型をDim 開始時間 As Date
とすると、違ったものが入ると、マクロ自体のエラーを出してしまいます。どちらかと言えば、Variant 型がで受けるか、InputBox 側の戻り値とは別の変数を使用します。
以下の場合は、キャンセルボタンや空のエンターの時は終わらせるようにしています。間違って入力したら、メッセージが出ますし、12:12:12:12 でも、時間とは認識しないので、メッセージが出て、再び、InputBox に戻ります。
例:
Sub TestTime()
Dim 開始時間 As Variant
Do
開始時間 = Application.InputBox("時間を入力してください。(例:12:15)", Type:=2)
If 開始時間 = "" Or VarType(開始時間) = vbBoolean Then Exit Sub
If Not (InStr(開始時間, ":") > 1 And IsDate(開始時間)) Then MsgBox "時間を入れてください。", 64
Loop Until InStr(開始時間, ":") > 1 And IsDate(開始時間)
MsgBox 開始時間
End Sub
出来れば、変数に2バイト文字は避けて英字にしたほうがよいです。
ありがとうございます。
甘えついでに2~3質問してもよろしいでしょうか
>If 開始時間 = "" Or VarType(開始時間) = vbBoolean Then Exit Sub
この VarType(開始時間) = vbBoolean ・・・は
どのような意味になるのでしょう?
> If Not (InStr(開始時間, ":") > 1 And IsDate(開始時間))
この部分の意味もお願いいたします
InStr関数はなんとなく判るのですが(マクロの本を紐解きながらですが (^_^;) )
後の部分がわからなくて苦戦しています。
どうか宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 指定した値以上の中で最小値を出したい 7 2022/10/24 21:12
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- その他(Microsoft Office) スプレッドシート関数、右端の列番号を取得したいですがもう一歩のところで上手くいきません。 2 2022/12/28 18:00
- Excel(エクセル) エクセル「社員の重なっている仕事時間の算出方法について」教えてください。 6 2023/02/06 00:10
- Excel(エクセル) エクセル2019の関数を教えてください。 8 2022/12/16 12:45
- その他(Microsoft Office) エクセル 条件付き書式 日をまたぐ塗りつぶし 1 2023/01/13 18:00
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- アルバイト・パート 初めてバイトを始めました。まだ初めてから1ヶ月程ですが、少し違和感がします。 その職場はタイムカード 1 2022/05/07 01:57
- その他(プログラミング・Web制作) GASでガントチャートを作りたいです 1 2022/09/05 17:26
- Excel(エクセル) セルに特定の色が出た時だけ、式を発動させたい 4 2022/06/17 10:32
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数で教えてください。
-
電線等の入線潤滑材の代用品っ...
-
Accessの重複なしのカウントの...
-
フリー wifi でwindowsの時刻が...
-
貨物列車の時刻 (上越線)
-
エクセルマクロで時間計算のエ...
-
エクセルVBAでタイマーコントロ...
-
【VBA】CSV読込_特定行を無視する
-
標準時間と117の時間の10秒のずれ
-
時刻と時間を明確に区別したい...
-
[MS Access]クエリで変換 hhmm...
-
時間と時刻の違い!?
-
時間計算 エラー表示を無くしたい
-
[h]:mm形式→10進法への変換
-
時刻表示について
-
午後11時59分って何時? 昼の11...
-
iPhoneのボイスメモ
-
福島駅での乗り換え
-
羽田空港第3ターミナルの送迎用...
-
特急の降り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[MS Access]クエリで変換 hhmm...
-
電線等の入線潤滑材の代用品っ...
-
午後11時59分って何時? 昼の11...
-
8時間以上だったら1時間マイ...
-
Accessの重複なしのカウントの...
-
京都に223系を入れたのは、221...
-
標準時間と117の時間の10秒のずれ
-
[h]:mm形式→10進法への変換
-
iPhoneのボイスメモ
-
VBA で PCの 時刻を サーバー時...
-
エクセルで早朝深夜労働時間を...
-
時間と時刻の違い!?
-
時刻と時間を明確に区別したい...
-
エクセルVBAでタイマーコントロ...
-
エクセルのNow関数の時刻の更新...
-
PC間の時刻同期コマンドが失敗...
-
サンライズエクスプレスの通過時刻
-
ExcelのVBAで他のPCのシステム...
-
Excelでミリsecまでの2つの時...
-
Access2003 時刻の表示とイン...
おすすめ情報