[[20160401150047]] 『インプットボックスでのキャンセル』(torao) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『インプットボックスでのキャンセル』(torao)

度々申し訳ありません。

インプットボックスに日付を入力し、キャンセルを押したら終了にしようと下記のようにやってみました。

ですが、【型が一致しません】と出てしまいます。
どこをどのように変えたら良いのでしょうか。

Sub Sample()
Dim firstDay As Date

firstDay = InputBox("日付入力")
If firstDay = "" Then

        MsgBox "キャンセルされました"
 End If
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


Dim firstDay As Variant

(x) 2016/04/01(金) 15:15


 InputBox関数の戻り値は 【文字列】です。
 それを 日付型変数に入れようとすると、型が違うということで叱られます。

 Dim firstDay As String

 こうしたうえで、""チェックのみならず、入力された文字列が、適切なものかの判定をする必要があります。
 (InputBox関数でうけると、どんな文字列 たとえば ABCDEFG でも入力可能ですので)

(β) 2016/04/01(金) 15:18


(x)様、(β)様
ありがとうございます。

変数が何種類もあるんですね。

入力された文字列が、適切なものかの判定をする必要があります。

○○○○/○○/○○のように西暦からの日付かどうかのチェックは、他の関数が存在してるのでしょうか・・・

インプットボックスには日付だけしか入れません。

(torao) 2016/04/01(金) 15:42


IsdDte()ですね。

(x) 2016/04/01(金) 16:02


(x)様

IsDateでしょうか・・・?

後だしで申し訳ありませんが、 End Ifの後に下記のような一文がありまして、インプットボックスに入力した日付分をシートコピーしています。

Days = DateDiff("d", firstDay, endDay + 1)

StringやVariantに指定したらここでも【型が一致しません】になってしまいました。
インプットボックスには日付しか入れませんので、

Dim firstDay As Date

のままでキャンセルや右上の×を押して終了するようになるでしょうか。

(torao) 2016/04/01(金) 16:23


ちょっと意味わからない部分がありますが、こういうことをしたいですか?
Sub Sample()
    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


(x)様
大変ありがとうございます。

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.