質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

8275閲覧

【Excel VBA】Inputboxでキャンセルした時に終了するようにしたい

koburon

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2023/01/06 08:35

編集2023/01/06 08:57

前提

VBAで今日現在および任意の日の組織リストを出力するマクロを作っています。
ボタンをクリックするとダイアログが開き、任意の日付(例:2023/1/1)を入力して「OK」をクリックすると、その日の時点での組織リストが出力されるようにするマクロです。

該当のソースコード

「組織マスター」シートおよび「組織DB」シートを参照して、「現在の組織」シートに今日現在の組織リストを作成するコードです。

【組織マスター】
イメージ説明
【組織DB】
イメージ説明
【現在の組織】
イメージ説明

VBA

1Sub sosikikosin(d As Date) 2 '今日現在の組織リストを出力する 3 Dim today_d As Date, str_d As Date, end_d As Date 4 Dim shisha As String, bu As String, ka As String, kakari As String, syozoku As String 5 Worksheets("現在の組織").Activate 6 n = Worksheets("現在の組織").Cells(Rows.Count, 1).End(xlUp).Row 7 If n > 2 Then 8 Worksheets("現在の組織").Range(Cells(3, 1), Cells(n, 8)).ClearContents 9 Worksheets("現在の組織").Range(Cells(3, 1), Cells(n, 8)).Borders.LineStyle = xlLineStyleNone 10 End If 11 For R = 2 To Worksheets("組織DB").Cells(Rows.Count, 1).End(xlUp).Row 12 With Worksheets("組織DB") 13 today_d = d 14 str_d = .Cells(R, 1) 15 end_d = .Cells(R, 2) 16 shisha = .Cells(R, 3) 17 bu = .Cells(R, 4) 18 ka = .Cells(R, 5) 19 kakari = .Cells(R, 6) 20 syozoku = .Cells(R, 7) 21 End With 22 If (str_d <= today_d And today_d <= end_d) Or (str_d <= today_d And end_d = 0) Then 23 With Worksheets("組織マスター") 24 Set rcd_shisha = .Range("a:a").Find(shisha, lookat:=xlWhole) 25 Set rcd_bu = .Range("c:c").Find(bu, lookat:=xlWhole) 26 Set rcd_ka = .Range("e:e").Find(ka, lookat:=xlWhole) 27 Set rcd_kakari = .Range("g:g").Find(kakari, lookat:=xlWhole) 28 Set rcd_syozoku = .Range("t:t").Find(syozoku, lookat:=xlWhole) 29 code_shisha = rcd_shisha.Offset(0, 1) 30 code_syozoku = rcd_syozoku.Offset(0, 1) 31 End With 32 With Worksheets("現在の組織") 33 n = .Cells(Rows.Count, 1).End(xlUp).Row + 1 34 .Cells(n, 1) = R 35 .Cells(n, 2) = shisha 36 .Cells(n, 3) = bu 37 .Cells(n, 4) = ka 38 .Cells(n, 5) = kakari 39 .Cells(n, 6) = code_shisha 40 .Cells(n, 7) = syozoku 41 .Cells(n, 8) = code_syozoku 42 End With 43 End If 44 Next R 45 n = Worksheets("現在の組織").Cells(Rows.Count, 1).End(xlUp).Row 46 Worksheets("現在の組織").Range("A2:h" & n).Sort _ 47 Key1:=Range("a2"), Order1:=xlAscending, _ 48 Header:=xlYes 49 Worksheets("現在の組織").Range("A2:h" & n).Borders.LineStyle = xlContinuous 50 Worksheets("現在の組織").Range("a1") = d & "現在組織リスト" 51End Sub

「menu」シートにボタンを作成、クリックするとダイアログが開き、任意の日付(例:2023/1/1)を入力して「OK」をクリックすると、その日の時点での組織リストが出力されるコードです。
【ダイアログ】
イメージ説明

VBA

1Sub ninikosin() 2 '任意の日の組織リストを出力する 3 Application.ScreenUpdating = False 4 Dim d As Date 5 d = InputBox("基準日を入力(記入例:1900/1/1)") 6 Call Module1.sosikikosin(d) 7 Dim TargetBook As Workbook 8 Worksheets("現在の組織").Copy 9 Set TargetBook = ActiveWorkbook 10 ThisWorkbook.Activate 11 d = Date 12 Call Module1.sosikikosin(d) 13 Worksheets("menu").Activate 14 TargetBook.Activate 15 Application.ScreenUpdating = True 16End Sub

発生している問題・エラーメッセージ

ダイアログに正しく日付を入力して「OK」をクリックすると別ファイルで出力されますが、
「キャンセル」および右上の「×」をクリックすると以下のエラーメッセージが発生してしまいます。
また、何も入力しないで「OK」をクリックした場合も同様のエラーメッセージが発生します。

実行時エラー'13': 型が一致しません。

デバックを確認すると、5行目でエラーが発生していました。
(「d=」付近にカーソルを合わせると「d = 0:00:00」と表示されます)

実現したいこと

  • 「キャンセル」および右上の「×」をクリックしてそのままダイアログを終了させたい。
  • 何も入力しないで「OK」をクリックした場合、「数値を入力してください」というメッセージボックスを表示させたい

試したこと

キャンセルを選んだときの処理に関するコードを調べて、参考になりそうなサンプルコードを見つけました。

VBA

1Sub InputBox関数で必ず数値を入力してもらう_キャンセル処理あり() 2 Dim ans As String ' InputBoxの戻り 3 Dim flg As Boolean ' 数値かどうかの判定フラグ 4 flg = False 5 Do 6  ans = InputBox("数値を入力してください。") 7  If StrPtr(ans) = 0 Then Exit Sub ' キャンセル時に終了 8  If IsNumeric(ans) Then flg = True 9 Loop Until flg = True 10 11 MsgBox CDbl(ans) 12End Sub

Sub ninikosin()の直下に入力するだけでは当然エラーになり、2行目~11行目を、Sub ninikosin()の4行目下に挿入するのを試してみましたが、この場合、何も入力せず「OK」を押したとき「数値を入力してください」のメッセージボックスが表示されないという別の問題が発生してしまいました。
キャンセル時に終了できるように、アドバイスいただければと思います。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
ソフト:Microsoft365 Excel

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/01/06 09:25

> 何も入力せず「OK」を押したとき「数値を入力してください」のメッセージボックスが表示されないという別の問題が発生してしまいました。 キャンセルボタンをクリックしたときのエラーは解消された、と理解して良いのでしょうか?
koburon

2023/01/09 23:56

コメントありがとうございます。 いいえ、キャンセルをクリックした場合、引き続きエラーは発生してしまいます。
guest

回答2

0

ベストアンサー

キャンセル又は×クリック時、処理を終了します。
未入力時、エラーメッセージを表示後、再入力します。
日付入力時、次の処理へ進みます。(日付の妥当性チェックは行っていません)
以下のようにしてください。

VBA

1Sub ninikosin() 2'任意の日の組織リストを出力する 3 Application.ScreenUpdating = False 4 Dim d As Date 5 Dim dval As String 6 Dim flag As Boolean 7 flag = False 8 Do While flag = False 9 dval = InputBox("基準日を入力(記入例:1900/1/1)") 10 If StrPtr(dval) = 0 Then 11 'キャンセル又は右上の×をクリックした場合 12 Exit Sub 13 ElseIf dval = "" Then 14 'なにも入力しないでOKをクリックした場合 15 MsgBox ("未入力です") 16 Else 17 '上記以外 18 '入力日付は正しいものとする 19 '(必要があれば入力日付のチェックを行い、エラーなら再入力するように変えてください) 20 d = CDate(dval) 21 flag = True 22 End If 23 Loop 24 Call Module1.sosikikosin(d) 25 Dim TargetBook As Workbook 26 Worksheets("現在の組織").Copy 27 Set TargetBook = ActiveWorkbook 28 ThisWorkbook.Activate 29 d = Date 30 Call Module1.sosikikosin(d) 31 Worksheets("menu").Activate 32 TargetBook.Activate 33 Application.ScreenUpdating = True 34End Sub 35

投稿2023/01/10 02:34

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koburon

2023/01/10 04:03

回答ありがとうございます。 実行したところ、問題なく動作しました。 こちらをベストアンサーとさせていただきます。 ありがとうございました。
guest

0

以下のようにしてください。

VBA

1 Dim dval As String 2 dval = InputBox("基準日を入力(記入例:1900/1/1)") 3 If StrPtr(dval) = 0 Then 4 'キャンセル又は右上の×をクリックした場合 5 MsgBox ("キャンセル") 6 ElseIf dval = "" Then 7 'なにも入力しないでOKをクリックした場合 8 MsgBox ("未入力") 9 Else 10 '上記以外 11 MsgBox ("入力") 12 End If 13

投稿2023/01/06 13:11

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koburon

2023/01/10 00:49

回答ありがとうございます。 キャンセル又は右上の×をクリックした場合となにも入力しないでOKをクリックした場合でメッセージボックスを表示させることができました。 ただし、特定を日付を入力してOKをクリックした場合、"入力"とメッセージボックスが表示されるのみなので、 入力した日の組織リストを出力するようにしたいのですので、どのように途中に組み込めば良いでしょうか。 試しに、11行目を上述のSub ninikosin()の6行目から14行目に入れ替えて「d」を「dval」に直し実行したところ、 「ByRef引数の型が一致しません」というエラーが発生してしまいました。宣言する変数に関するエラーだと思いますが、原因がよく分からないです。 原因をご存じでしたら、アドバイスいただければと思います。 よろしくお願いいたします。
tatsu99

2023/01/10 02:35

別途、回答を書きました。そちらを参照してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問