【VBA】メッセージボックスを使って警告を促す方法

このQ&Aのポイント
  • エクセル2000でVBAのメッセージボックスを使って警告を促す方法について教えてください。
  • E列に選択した文言に対応するV列の文言を選択できる環境でありながら、一部の組み合わせでは矛盾した警告ポップアップが表示されるようにしたいです。
  • ポップアップの選択肢は「中止」と「無視」の2つで、「中止」を選べばV列の内容が消え、「無視」を選べば矛盾した内容がそのまま入力されるようにしたいです。
回答を見る
  • ベストアンサー

【VBA】できればメッセージボックスを使って警告を促したい

【VBA】できればメッセージボックスを使って警告を促したい エクセル2000です。 VBAのメッセージボックスを使って以下のことは可能でしょうか。 E列とV列があり、それぞれ異なるリスト内から文言を選択するという環境です。 入力順序はE列→V列になり、E列のリストには「A~F」という6種類の文言が、 V列のリストには「G~L」という6種類の文言があるとします。 ここで例えばE3にリストから「A」を選択したとします。 次にV3にもリストから文言を選択する訳ですが、E3に「A」と入れた場合 V3には「G~L」どれでも選択できる環境でありながら、G、H、Iのいずれかを選択した時は 普通に入力でき、J、K、Lを選択した時は「矛盾しています」の警告ポップアップがでるように したいのです。 このようにE列にある文言を選択した時、同行のV列に然るべき文言を選択しなかった場合 警告ポップアップがでるような組み合わせをいくつか作成したいと思っています。 可能であれば、ポップアップの選択は「中止」か「無視」の2択にし、 「中止」を選べば一旦V列の内容が消え、「無視」を選べば矛盾した内容がそのまま V列に入力されるようにもしたいと考えています。 表の大きさはA1:Y80だとして、E列とV列は同じ行内でいつでも上記のような 関係にすることは可能でしょうか。 当方VBAを始めたばかりの初心者(実際に記録をやってみて、その結果がVBEにどう書かれるかを探ってるレベル)ですので、贅沢を言って申し訳ないですが、 それを汲んで解説いただけたら幸いです。 本来なら自分でじっくり学んで方法を模索したいところなのですが 達成したい期日があるので、早目にヒントだけでも欲しいというのが本音です。 回答はそれなりに難解になるとも思っていますが、読み解く努力はしたいと思っていますので どうかよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

もっと短くすると Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 22 Then If Not Range("W1:W" & Range("W" & Rows.Count).End(xlUp).Row).Find(Range("E" & Target.Row).Value & Range("V" & Target.Row).Value, LookAt:=xlWhole) Is Nothing Then If MsgBox("矛盾しています", vbAbortRetryIgnore) = vbAbort Then Range("V" & Target.Row).Value = "" End If End If End If End Sub のような感じになります。

t-bag-waka
質問者

お礼

回答ありがとうございました。 覚悟していたことですが、今の自分の知識量には過ぎた質問でしたので いただいた回答をヒントに現在も試行錯誤している最中です。 それでも全くの無からではどうにもできない状態だったので おかげさまで調べていく方向性は見えてきました。 それにしても投稿からわずか1~2時間で回答をいただけるとは思ってもいませんでしたので 正直感心と共に驚いています。 また行き詰った時には質問させていただくかもしれませんがよろしくお願いいたします。 素早い回答ありがとうございました!

その他の回答 (2)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

たとえばW列に矛盾リストを作るとしたら 以下のようになります。 W列には例で行くと AJ AK AL が入力されているとします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim m_Contradiction As Boolean Dim i As Long If Target.Column = 22 Then For i = 1 To Range("W" & Rows.Count).End(xlUp).Row If Range("E" & Target.Row).Value & Range("V" & Target.Row).Value = Range("W" & i).Value Then m_Contradiction = True Exit For End If Next i If m_Contradiction = True Then If MsgBox("矛盾しています", vbAbortRetryIgnore) = vbAbort Then Range("V" & Target.Row).Value = "" End If End If End If End Sub

t-bag-waka
質問者

お礼

回答ありがとうございました。 詳細は最新の回答に集約させていただきます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

例の部分だけを単純に考えると以下のようになります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 22 Then If Range("E" & Target.Row).Value = "A" Then If Range("V" & Target.Row).Value = "J" Or Range("V" & Target.Row).Value = "K" & Range("V" & Target.Row).Value = "L" Then If MsgBox("矛盾しています", vbAbortRetryIgnore) = vbAbort Then Range("V" & Target.Row).Value = "" End If End If End If End If End Sub あとA~FとG~Lで矛盾している組み合わせのリストを作って そのリストに合致したらメッセージをだすというような作り方もできます 多分そのほうがソースとしては短いものになると思います。

t-bag-waka
質問者

お礼

回答ありがとうございました。 詳細は最新の回答に集約させていただきます。

関連するQ&A

  • 2010 Excel VBA 測定結果を貼り付ける

    VBA初心者です。 どなたか教えていただけませんか? 測定した結果を各シート別に貼り付けを行いたいのです。 シート名は「データ」で、貼り付けたいデータはG列とI列。 貼り付けたいシート名は1、2、3、・・・15まであります。 データをG列の8個分のデータで行列を入替えて貼り付け(E6~L6) I列も同様に8個分のデータを行列を入替えて貼り付け(E7~L7) ※シート1枚に行う作業はこれで終わりです。但し追記を行いますので基にデータが  ある場合は倍数分飛んで入力を行いたいです。(G列の場合E6,E8,E10,E12・・・、I列の場合E7,E9,E11,E13) マクロ開始時に貼り付けるシートを選択しその順番で各データの貼り付けを行いたいです。 データのG列、I列は連続データなので8個ずつのデータを選択したシート順に貼り付ける。 流れとしては マクロ開始→入力シートを選択→データから各シートへコピーペースト マクロ記録でやってみたのですがなかなかうまくいかず困っています。 大変申し訳ないですが教えて頂けないでしょうか? 知識はVBA入門編が理解できる程度なのでご指導宜しくお願いします。

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • エクセル(vba)で教えてください。

    エクセル(vba)で教えてください。 vbaはほぼ初心者ですので、皆様のお知恵を拝借させてください 現在リストを作成しているのですが、最終更新日時を自動で取得するようにしてみたいのですが、うまくいかないです。 リストは列(項目)固定で、最終行に追加していくというものです。 1カテゴリ=1行での入力になります。 例えば、A,C列の項目のみ記入すると、その行のL列に自動で日時が入力される。 また翌日ブックを開いても、その日時は最終入力日のままだが、追加でD列の項目を 入力すると日時も更新される、というものです。 説明が足りないかもしれませんが、どなたか詳しい方よろしくお願いします。

  • VBA コンボボックス リスト表示について

    初心者ですいません エクセル VBAのフォームでコンボボックス3つと、テキストボックス3つがあります シートのListにA~F列までのデータがあり、コンボボックス1にA列のリストを表示し コンボボックス2にA列で選んだリストを参照したB列のリストを表示し、コンボボックス3 にコンボボックス1,2で選んだリストを参照し、C列のリストを表示した後、 コンボボックス1,2,3で選ばれたもののD列、E列分をテキストボックス1,2に 反映しようと思っておりますがうまくいきません どのようにしたらよいか、おしえてください 宜しくお願いします ちなみに、リストの内容は A列   B列   C列     D列   E列 テレビ 42インチ  HDD内蔵  台    100,000 テレビ 32インチ  BD内蔵   台     80,000 テレビ 19インチ          台     50,000 ビデオ HDD   1TB     台    100,000   ビデオ HDD   500GB    台     80,000 ビデオ BD            台     70,000 が、入ってます 希望は、質問の際のカテゴリ選択のようになればよいのですが... さらに、希望を言えば、自動で、行ごとに1,2,3...と番号を振るようにしており スピンボタンで番号を選べば、登録された上記のデータをフォームに反映させるようにしております これもうまくいきません お願いばかりで申し訳ありませんが 宜しくお願いします

  • エクセルのINDIRECT関数による入力が、突然できなくなりました

    こんにちは。お世話になっております。 4月にこちらで質問して(QNo. 831048)ご親切に教えていただき、エクセルにINDIRECT関数を設定しました。 E列とF列に、リストによる入力規制を設定し、    E列で大分類を選択→ F列では、E列で選択した大分類中の項目だけがポップアップされる という状態になっていました。 その後、行が増えたため、何度か設定する範囲を広げて設定しなおしてきました。 ところが昨日から、E列を選択しても、F列になにもポップアップされない状態になってしまいました。 範囲を広げて設定しなおしましたが、まったくダメです。 どこがいけないのでしょうか。。。宜しくお願い致します。

  • エクセルVBAについて

    エクセルVBAについての質問です。A1、B1と順に入力していき、最終 F1列にカーソルがいったときに(F1を空欄のまま)エンターキーを押すと次の行のD2にカーソルが飛ぶ、そしてD2、E2に入力をして、G列にカーソルを動かしエンターキーで次の行のA列にカーソルが移動する、こんな操作をしたいのですが。つまりF列にカーソルがいったらカーソルは次の行のD列に飛び、G列にカーソルがいったら次の行の先頭つまりA列にカーソルが移動するように。VBA初心者でもつくれるかどうか、よろしくお願いします。

  • エクセルVBA「コンボボックスの値をワークシートに代入」

    エクセルVBA「コンボボックスの値をワークシートに代入」 連日質問してしまい申し訳ありません。・・・ 今回は「コンボボックス」にリストアップされている値をセルに入力したいのです。 画像を見て頂ければと思いますが、コンボボックス(左ウィンドウ画像)には25の文字列がリストアップされています。 このリストアップされている文字列をすべてワークシートのセルB4からの"4"列に入力したいのです。 なんだか滅茶苦茶ですが、ご理解頂ければご協力お願いします。

  • オートフィルタ 絞込み

    ExcelのVBAです。 作っているのですが、 絞り込む物がリストに無くても、 絞込み、空のページが表示されます。 例えば、    A   B   C 1  あ   K   A 2  い   K   A 3  う   L   A 上記のようなデータがある場合に、 B列のフィルタには K 、 L の絞込みリストが表示されます。 しかし、VBAの場合は K、L以外の入力で絞り込むことができます。 例)あいうえおでB列絞り込んでみる Selection.AutoFilter Field:=Range("B1").Column, _ Criteria1:="あいうえお" 当然のことですが、 あいうえおと表記された所はないため、 何も表示されません。 せめてポップアップを出し、中止を促したいです。 MsgBox "絞り込み条件がありません " MsgBox "絞り込めないため終了します" などなど。 できれば、エラーメッセージをだし 再入力を求めるなどあれば良いのですが、 なにか良い方法はありますか?

  • チェックボックスに関して(vba)

    VBA初心者のためコードを教えてくれますと助かります。 シート1にリストが記載されています。 チェックボックスで選択されている値を取得して(シート1のA列の商品名から)、チェックされている値のデータを転記するようなコードを作成したいと思っております。(別途シート追加する) 知識不足でうまく動きません。よろしくお願いします。

  • VBAで2つのリストボックスの連動表示に関して

    VBAで2つのリストボックスの連動表示に関して、 ご教授、お願い致します。 VBAで色々、試行錯誤しております初心者です。 今回の質問ですけど、参考にWebで調べたのですが 分からなく、どのようにしたらいいのか 教えて頂けないでしょうか。 (例 リスト表) Sheet1(取引名簿)    (No.) (取引番号) (取引社名)                      A列    B列     C列    ・・・                1   1   A-0001     A社    ・・・             2   2   B-0001 B社     ・・・ 3   3   A-0002 C社    ・・・ 4   4   A-0003  D社     ・・・ 5   5   B-0002 E社    ・・・ ・ ・ ・ Sheet2(顧客名簿) (No.) (取引社名) (顧客名) A列    B列     C列   ・・・ 1   1 A社     顧客1 ・・・ 2   2     B社 顧客2  ・・・ 3   3    A社   顧客3 ・・・ 4   4    C社   顧客4 ・・・ 5   5 A社 顧客5 ・・・ ・ ・ ・ 上記、例題 2つのシートリストを条件に合わせ、2つ目のリストボックスに 連動表示させたいのですが処理できるように教えて頂けないでしょうか。 ※ ListBox1 に Sheet1 の B列(取引番号) と C列(取引社名) を表示し、 ListBox2 には、 Sheet1 で選択した取引会社に連動し、 C列の顧客(条件一致者)全員を ListBox2に表示したいのです。 (例) ListBox1でSheet1の中からA社を選択したとします。 連動でListBox2には、A社の顧客1、顧客3、顧客5が表示するように出来ないでしょうか。 説明下手で申し訳ありませんが宜しくお願い致します。

専門家に質問してみよう