前提
VBAで今日現在および任意の日の組織リストを出力するマクロを作っています。
ボタンをクリックするとダイアログが開き、任意の日付(例:2023/1/1)を入力して「OK」をクリックすると、その日の時点での組織リストが出力されるようにするマクロです。
該当のソースコード
「組織マスター」シートおよび「組織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
回答2件
あなたの回答
tips
プレビュー