- ベストアンサー
エクセルでVLOOKUPで検出できなかったらメッセージボックスを表示する方法
- エクセルでVLOOKUP関数を使用してデータを検索する際に、該当するデータが見つからない場合にメッセージボックスを表示する方法について教えてください。
- VLOOKUP関数を使用してデータを検索し、マクロを組んでエラー時にメッセージボックスを表示する方法について教えてください。
- エクセルのVLOOKUP関数で#N/Aエラーが表示された場合、メッセージボックスで「データがありません」と表示し、別のマクロを起動する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo2 merlionXXです。 ならば、#N/Aエラーの処理は印刷マクロのほうにかいてあるということですね? よくわかりませんが、印刷マクロの方は単に印刷指示にとどめて、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Len(Range("A1").Value) > 1 Then If Application.WorksheetFunction.IsNA(Range("B1")) Then MsgBox "データーがありません" Range("A1").ClearContents Else Call 印刷 End If End If End Sub のような感じにしたらいかがでしょう?
その他の回答 (2)
- merlionXX
- ベストアンサー率48% (1930/4007)
ということは、A1セルに入力された時点で判断すればいいんですね? 標準モジュールではなく、シート1のシートモジュールに以下を記入します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) = "A1" Then If Application.WorksheetFunction.IsNA(Range("B1")) Then If MsgBox(" データーがありません") = vbOK Then Call 登録したマクロ End If End If End If End Sub
お礼
補足にも回答いただきありがとうございます。
補足
ありがとうございます。 A1に入力し、B1が表示されるとシート1のセルのいろいろなセルが 表示が変化し印刷がされA1をDELETEするマクロが走るようにしてあります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Len(Range("A1").Value) > 1 Then Call 印刷 End If End Sub で 印刷 のマクロの一部の Range("B1").Select If IsError(ActiveCell.Value) Then errval = ActiveCell.Value Select Case errval Case CVErr(xlErrDiv0) MsgBox "#DIV/0! エラー" Case CVErr(xlErrNA) If vbOK = MsgBox(" データーがありません") Then Exit Sub がうまく動作しないのです。動作する時もあります。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>この時にこの#N/Aの表示をトリガーに >メッセージボックスで >「データーがありません」と表示させるのはどうしたらいいでしょうか? 以下のようにすれば良い。 1. B1セルの式を以下のように変更する =IF(ISNA(VLOOKUP(A1,シート2!B2:F1000,2,FALSE)),Macro2(),VLOOKUP(A1,シート2!B2:F1000,2,FALSE)) 2. 以下の関数とサブルーチンを用意する Function Macro2() If MsgBox(" データーがありません") = vbOK Then Call Macro1 'OKボタンが押されたら登録してある別のマクロを起動させる Macro2 = "#N/A" Exit Function End If End Function Sub Macro1() MsgBox ("Macro1が呼ばれました") End Sub >マクロを組みましたが、わざとシート2にはない値を入力した時に >メッセージボックスが表示される場合と表示されない場合があって困っています。 マクロなんかで組むから、面倒な事になる。 「式で書く」んなら、最初から式そのものを「もしN/Aなら、MsgBoxを画面に出す関数Macro2を呼び、そうじゃないならVLOOKUPの結果を出す」っていう式にしちゃえば良い。 >またこのメッセージボックスには「OK」と表示されています。 >このOKをクリックすると >登録してある別のマクロを起動させる事はできますか? 自分で書いたマクロの中に >If vbOK = MsgBox(" データーがありません") Then Exit Sub ってのがありますね? これ、何してるか理解してますか? これは「データがありませんのMsgBoxでOKが押されたらExit Subを実行する」って意味ですよ? だったら「データがありませんのMsgBoxでOKが押されたら、Call文で既存のマクロを呼んでからExit Subを実行する」って書き替えれば良いんじゃありませんか? で、そう書き替えたのが、上記の回答の If MsgBox(" データーがありません") = vbOK Then Call Macro1 'OKボタンが押されたら登録してある別のマクロを起動させる (略) Exit Function End If の部分です。 質問者さんは「プログラムを深く考え過ぎ」「処理の根本を理解していないので場当たり的な対処ばかりで失敗している」ので「深く考えず、いかに単純に済ますか」「処理の根っこを掴んで、根本的な解決策を取る方法はないか」を考えた方が良いです。
お礼
申し訳ありません。 シート1の各セルは式だらけです。 でA1の入力と連動でマクロを走らせています。 そのマクロの中のこの部分がうまく動かないです。 ですがセルA1に手入力でエンターならこのままで問題ありませんでした。 ・データが無ければメッセージボックス表示 ・データがあれば印刷 バーコードリーダーでデータが無い物を読むと、 リーダーで読み込み後セルがごちゃごちゃ書き換わって メッセージボックスの表示が遅くなりリーダーの文字入力確定信号が メッセージボックスのOKのクリックを押すのと同じになってしまい 駄目なようです。 リーダーでデーターがある物を読めば、各セルが置き換わり印刷までマクロが走ります。 リーダーで読込む→アクティブのセルに入力される→エンター(確定される) リーダーで読込む→アクティブのセルに入力される→セルB1が#N/Aになる→ メッセージボックスが表示される→リーダーの読み込み完了でエンター信号が来る→メッセージボックス のOKがこの信号でクリックされたとなる。 と勝手な予測をしました。 メッセージボックスのOKでマクロ起動はやめて 他の方の回答で対応いたしました。 どうもありがとうございました。
お礼
自己解決しました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Len(Range("A1").Value) > 1 Then If Application.WorksheetFunction.IsNA(Range("B1")) Then Application.Wait Now + TimeValue("0:00:02") MsgBox "データーがありません" Range("A1").ClearContents Else Call 印刷 End If End If End Sub これで完璧な動作となりました。たいへんありがとうございました。
補足
ご丁寧にありがとうございます。 完璧です。 うまくできました。 ただひとつ問題があります。 A1セルに手入力しエンターを押して確定した場合は大丈夫です。 データーがあれば印刷されA1がクリア。 データーが無ければメッセージボックスが出る。 メッセージボックスのOKを押すとA1がクリア。 ですがA1にバーコードリーダーで入力すると、 エンターが2回押されたのと同じになるのかメッセージボックスが一瞬写り消え セルA1がクリアされてしまいます。 リーダーは読み込み後確定のはずで確定を2回は送らないはず。 想像では 読込んだ瞬間セルA1に入力された内容が判定され メッセージボックスが表示されるが、リーダーの確定信号が メッセージボックスをクリックしたのと同じとなっているのでは?と思います。 何か判定を遅らせる(メッセージボックスの表示を遅らせる) 方法はマクロにありますでしょうか?