[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『インプットボックスでのキャンセル』(torao)
度々申し訳ありません。
インプットボックスに日付を入力し、キャンセルを押したら終了にしようと下記のようにやってみました。
ですが、【型が一致しません】と出てしまいます。
どこをどのように変えたら良いのでしょうか。
Sub Sample()
Dim firstDay As Date
firstDay = InputBox("日付入力")
If firstDay = "" Then
MsgBox "キャンセルされました" End If End Sub
< 使用 Excel:Excel2013、使用 OS:Windows7 >
(x) 2016/04/01(金) 15:15
InputBox関数の戻り値は 【文字列】です。 それを 日付型変数に入れようとすると、型が違うということで叱られます。
Dim firstDay As String
こうしたうえで、""チェックのみならず、入力された文字列が、適切なものかの判定をする必要があります。 (InputBox関数でうけると、どんな文字列 たとえば ABCDEFG でも入力可能ですので)
(β) 2016/04/01(金) 15:18
変数が何種類もあるんですね。
入力された文字列が、適切なものかの判定をする必要があります。
○○○○/○○/○○のように西暦からの日付かどうかのチェックは、他の関数が存在してるのでしょうか・・・
インプットボックスには日付だけしか入れません。
(torao) 2016/04/01(金) 15:42
(x) 2016/04/01(金) 16:02
IsDateでしょうか・・・?
後だしで申し訳ありませんが、 End Ifの後に下記のような一文がありまして、インプットボックスに入力した日付分をシートコピーしています。
Days = DateDiff("d", firstDay, endDay + 1)
StringやVariantに指定したらここでも【型が一致しません】になってしまいました。
インプットボックスには日付しか入れませんので、
Dim firstDay As Date
のままでキャンセルや右上の×を押して終了するようになるでしょうか。
(torao) 2016/04/01(金) 16:23
Dim firstDay As Variant Dim endDay As Date Dim days As Long
endDay = #12/31/2016# '適当。。。
firstDay = InputBox("日付入力") If firstDay = "" Then MsgBox "キャンセルされました"
ElseIf Not IsDate(firstDay) Then MsgBox "日付ではありません" Else days = DateDiff("d", firstDay, endDay + 1) '+1の意味は分かりませんが(笑)
MsgBox "間隔:" & days & "日"
End If
End Sub
(x) 2016/04/01(金) 16:42
5日〜10日だとすると、第0日目がないため +1 かな?と思ったのですが、さきほどやってみたら、 +2 で必要枚数コピー出来ました。
キャンセルボタンに関しては後ほどやってみます。
年度替りのお忙しいときにありがとうございます。
(torao) 2016/04/01(金) 17:04
文字列をIsDate判定した場合、セル上で入力して日付と認められる形式のものは、すべてOKになります。 そのOKになった文字列を日付型の変数にいれてやると、日付型のデータとなります。
Sub 参考() Dim s As String Dim dt As Date
s = "2016/4/1" If IsDate(s) Then dt = s MsgBox s & vbLf & dt Else MsgBox s & vbLf & "エラーです" End If
s = "2016年4月1日" If IsDate(s) Then dt = s MsgBox s & vbLf & dt Else MsgBox s & vbLf & "エラーです" End If
s = "平成28年4月1日" If IsDate(s) Then dt = s MsgBox s & vbLf & dt Else MsgBox s & vbLf & "エラーです" End If
s = "12345" If IsDate(s) Then dt = s MsgBox s & vbLf & dt Else MsgBox s & vbLf & "エラーです" End If
s = "abcde" If IsDate(s) Then dt = s MsgBox s & vbLf & dt Else MsgBox s & vbLf & "エラーです" End If
End Sub
(β) 2016/04/01(金) 17:04
To torao さん
InputBoxを使って、 日付型と数字(Double型、Long型、Integer型)を取得したいときは、 InputBoxの返り値をまず、Variant型で受けてます。 If文でチェック後に、取得したい型に型変換しています。 InputBoxで、タイプ【 Type:= 】はあえて指定していません。 【 Type:= 】を省略すると、【 2 】の文字列 (テキスト) を指定したとされる。
セル範囲を取得したいときは、InputBoxで【 Type:=8 】を指定。 セル範囲でない値が入力されることを想定して、エラー処理をしてます。 http://www.239-programing.com/excel-vba/func/func012.html On Error Resume Next ●エラーがでそうなところ(InputBoxの返り値等) On Error GoTo 0
さまざまな型変換 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_08.html
■InputBoxにて、日付(Date型)を取得したいとき Sub test1() Dim msg1 As String, msg2 As String Dim val_date As Variant, date1 As Date Dim flag As Boolean
msg1 = "日付を入力してください。": msg2 = "タイトル" val_date = Application.InputBox(msg1, msg2, Default:=Format(Date, "yyyy/m/d"))
If VarType(val_date) = vbBoolean Then MsgBox "キャンセルされました。終了します。": flag = True: GoTo step1 ElseIf IsDate(val_date) = False Then MsgBox "入力値が日付ではありません。終了します。": flag = True: GoTo step1 End If
date1 = CDate(val_date) 'Date型に型変換 MsgBox date1 & vbCrLf & date1 + 1
step1: If flag = True Then '処理1 End If End Sub
************************************************************************************** ■InputBoxにて、ゼロまたは正の整数(Integer型)を取得したいとき Sub test2() Dim msg1 As String, msg2 As String Dim val_num As Variant Dim dbl_num As Double, num1 As Integer Dim flag As Boolean
msg1 = "0または正の整数を入力してください。": msg2 = "タイトル" val_num = Application.InputBox(msg1, msg2, Default:=7)
If VarType(val_num) = vbBoolean Then MsgBox "キャンセルされました。終了します。": Exit Sub ElseIf IsNumeric(val_num) Then dbl_num = CDbl(val_num) 'Double型に型変換 If Not (dbl_num = Int(dbl_num) And dbl_num >= 0) Then MsgBox "ゼロまたは正の整数ではありません。終了します。": Exit Sub End If Else MsgBox "数字ではありません。終了します。": Exit Sub End If
num1 = CInt(dbl_num) 'Integer型に型変換 MsgBox num1 & vbCrLf & num1 + 5 End Sub
(マリオ) 2016/04/01(金) 18:22
失礼します。
To マリオさん
ご指摘の InputBox は、 InputBox【メソッド】ですね。 もちろん、こちらのほうが、強力な武器なんですが、とりあえず、torao さんのコードでは InputBox【関数】を使っておられます。
(β) 2016/04/01(金) 18:56
(マリオ)様
InputBox【メソッド】と言うものがあるのですね・・・ またそちらについでも勉強させていただきます。
なんとか回避することができました。
本当にありがとうございます。
(torao) 2016/04/05(火) 13:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.