プロが教えるわが家の防犯対策術!

お世話になります。
マクロに行き詰まってしまったので教えて下さい。
A列にある文字を検索した際にメッセージボックスを
表示し、検索文字がないときはメッセージボックスを表示させないようにしたいです。

A列→検索文字(検索は文字、数量、空白など)
B列→注文番号
C列→商品名
D列→数量や顧客名

上記のような表がA4から開始するとして
A4の文字を検索して該当があれば
[確認してください]とメッセージボックスを表示し
出来ればB列の注文番号も表示させたいです。
(例: 365番 確認してください)
A4に対するメッセージを消した後は同じように
A5,A6と同じように検索をかけたいのですが
このようなことは可能でしょうか?

ネットで検索したのが以下のマクロになりますので
アドバイスいただけたらと思います。
よろしくお願いします。

Option Explicit
Sub 検索()
Dim firstFindCell As Range
Dim firstCell As Range
Dim result As Range

Set firstFindCell = Range("D4:D1000").Find(What:=Range("A4").Value, LookAt:=xlWhole)
Set firstCell = firstFindCell
Set result = firstFindCell

Do
Set firstFindCell = Range("D4:D1000").FindNext(firstFindCell)
If firstFindCell.Address = firstCell.Address Then
Exit Do
Else
Set result = Union(result, firstFindCell)
End If
Loop
result.Select
End Sub

質問者からの補足コメント

  • 早速のアドバイスありがとうございます。
    実は似たようなことすでにやっているのですが
    チェック者がパソコンが得意でないことと、
    見忘れることが多くてメッセージボックスで表示したいと思いました。

    手順はCSVデータをマクロで読み込んだ際に
    該当があればメッセージボックスで注意を促し
    なければメッセージボックスは表示せず
    次の作業に進む、という感じにしたいです。
    説明不足ですみません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/07/06 11:26
  • 何度もご丁寧にありがとうございます。
    実情を話すとチェックは上司ともう一人、三人で行っていて実際のデータは二万件ぐらいあります。
    そのため初めはNO1様の様にしていたのですが
    見落としとスクロールする時間がもったいないということで
    ピポットで抽出した件数をメッセージボックスにて表示させました。
    その結果メッセージボックスが出た際は注意深くリストをチェックし、作業も短縮できました。
    しかし今回、検索するものが増えてしまい
    またその都度検索するものも変わってしまったため
    上記のような質問になり、助けを求めました。

    上司もメッセージボックスが出ることによりミスが減ったためなんとかしてくれと言われています。。。
    No1様の案も提案しているのですが納得されなくて困ってます。せっかく色々考えてくれてのに本当に申し訳ないです。。。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/07/06 18:03

A 回答 (5件)

検索結果をメッセージボックスで表示してしまうと「OK」をクリックするまで、Excelの操作ができなくなってしまいます。

また、「OK」をクリックして次のワードの検索を行ってしまうと、結局、すべてのワードの検索が終るまで、Excelの操作ができません。
よって、メッセージボックスでは、お望みの処理はできないと思います。

そこで、ユーザフォームをモードレスで表示することをお勧めします。モードレス表示であれば、表示中でもExcelの操作が可能です。
ユーザフォームに「確認しました」ボタンを付けて、クリックされたら次のワードを検索するようにします。
    • good
    • 0

すみません。

検索を行う目的がよくわかりません。
いまさら、基本的なことですが、教えてください。
添付図の赤が検索文字、黄色がデータとして、
1)(検索は文字、数量、空白など)とのことですが、空白の検索の目的は何ですか。
青色のD10のセルのようになにも無い箇所のチェックですか。
2)文字1に山下を設定すると3回ヒットしますが、この目的は山下さんが何回購入しているかを確認する為ですか。
3)文字1に阿部を設定すると1回もヒットしませんが、この目的は阿部さんがなにも購入していないことを確認する為ですか。
4)文字1,文字2,文字3は、各担当者が経験に従って自分の判断でそれぞれ文字を設定するのですか、それとも、
予め、設定する文字は決まっていて、各担当者は同じ文字を設定して、同じことを確認するのですか。
「マクロで検索したさいにメッセージボックス」の回答画像4
    • good
    • 0

ANo2です。



>No1様の案も提案しているのですが納得されなくて困ってます。
No2では、No1の方法に加えて関係セルにすべて色付けをし、チェック結果をまとめてメッセージボックスに表示する案にしてありますが…??


・・・とは言うものの、2万件をスクロールして見るというのは、手作業の範囲を優に超えていると思います。
根本的な原因はそこにあるような気がしますので、その作業全体を見直すことを考えた方が良くはありませんか?

メッセージが出ることの意味(=重複があることの意味)やその後の処置をどのようにしているのかなどについては回答者にはわかりませんが、それも含めて何らかのプログラム化するなど、とにかく2万件を目視でチェックするという作業設定自体に難があるように思えます。そのチェック作業を補助する方法も含めて考えてみるのがよいのではないでしょうか?

安易な思いつきではありますが、一つのアイデアとして、No2で示した色つきのセルだけを全部上の方に並べ替えて移動してしまうだけでもだいぶ違うのではと想像します。(並べ替えてもよいデータなのかはわかりませんが、スクロールはだいぶ減るはず)

まぁ、通常はチェックに引っかかるようなことはなく、警告が出るような事態はごくまれな状態であるというのであれば、また別なのかもしれませんが・・・
    • good
    • 0

ANo1です。



補足でだいたいの雰囲気がわかりました。
>CSVデータをマクロで読み込んだ際に~
とのことですので、一つずつチェックするよりも、まとめて全部チェックする方が良いのではないでしょうか?
(操作者が一つずつ入力するわけではなさそうですので…)

とりあえず、ご質問の
>出来ればB列の注文番号も表示させたいです
に関して。
複数個ある場合を考慮して、B列の値をヒットするごとに追加して行けばよいと思われます。
例えば、変数strに記憶するのであれば、result(=ヒットしたセル)に代入しているのと同様にして、
 str = firstFindCell.Offset(, -2).Value
追加するときは
 str = str & "," & firstFindCell.Offset(, -2).Value
とすることで、カンマ区切りで値を連結できます。そして最後に
 If str <> "" Then MsgBox str & " を確認してください"
といった感じで表示すれば、できると思います。

また、
>後は同じようにA5,A6と同じように検索をかけたいのですが~
に関しては、繰り返しのループで処理すれば良いでしょう。
A列の値のある最終行は
Cells(Rows.Count, 1).End(xlUp).Row
で求めることができますので、4行目からループするものとして
 For rw = 4 To Cells(Rows.Count, 1).End(xlUp).Row
  検索 (rw)
 Next rw
で繰り返しができます。ただし、この際には、検索()の方を
 Sub 検索(ByVal rw As Long)
のように変更して、A列のrw行目のセルを検索対象とするように、コードを書き換えておく必要があります。

・・・とは書きましたが、実は、ご提示のコードだと検索して該当するものが無い場合にはエラーで止まってしまいますので、『該当するものが無い場合は何もしない』ように処理できるように修正しておく必要があるようです。



ここから先は、私の勝手な思い込みですが・・・

>がパソコンが得意でないことと見忘れることが多くて~
このあたりは資質の問題なのでなんとも言えませんが、一つ一つ警告を出しても、まとめて出してもあまり変わらなさそうな気がします。(警告を出すことに意味はあると思いますが)
でも、「チェック者」とあるからには、その方の仕事はチェックすることにあるのではないかと想像しますが・・・(笑)

>実は似たようなことすでにやっているのですが~
見る/見ないは別の問題として、メッセージボックスよりもやはりこちらのチェックの方が主体だという気がしてなりません。警告は注意喚起のための副手段の位置づけではないでしょか?

・・・ということで、はなはだ差し出がましいですが、勝手にNo1を少し改良した案を考えてみました。
図では(わかり易いように)ご質問文のB~D列をC~E列に変えてあります。
シートの仕組みとして、
1)A列の各値を検索して該当するものがあれば、その注文番号(C列の値)をB列に表示します。(複数ある場合は最初のもの)
2)B列が空白でない場合は、A列、B列の塗を条件付き書式でピンクにしています。
3)B4~に空白でないものがあれば、B3にその数が表示され、赤塗になります。
 (B4~が全て空白なら、B3も空白になります)
4)C~E列は、その行のE列の値がA列にあれば(逆の検索)、行の塗が淡黄色になるようにしてあります。

1)~4)の設定は、関数式、及び書式設定、条件付き書式で実現できます。
シート上で、色塗りのセルが無いときは、チェックにかかった項目がないことを意味しますし、B3の数値はピンク塗の個数を数えていますので、調整が必要な残りの数を示していることになります。

この上で、マクロで警告を出すのであれば、CSVをマクロから書き込む処理の最後に
If Range("B3").Value > 0 Then
MsgBox "重複が" & Range("B3").Value & "件あります。" & _
vbNewLine & "赤・黄のセル確認してください。"
End If
といった感じで追加するだけで、B3セルの値を表示できます。
(添付図参照)

ただし、CSVをマクロで書き込む際にセルのコピペ等で行うと、条件付き書式などの設定が上書きされてしまいますので、直接値を書き込むようにするといった注意が必要です。


※ 私の勝手な思い込みなので、的外れかもしれません。
 もしも、1)~4)のシートの設定方法などを知りたい場合には、補足で要求して頂ければ追加説明したします。
「マクロで検索したさいにメッセージボックス」の回答画像2
この回答への補足あり
    • good
    • 0

こんにちは


直接の回答ではありません。

なさりたいことは、『A列の各セルの値がD列の値と重複しているか否かをチェックしたい』のではないかと推測しました。
しかし、
>A4に対するメッセージを消した後は同じように
>A5,A6と同じように検索をかけたいのですが
とありますが、ご提示のマクロでは重複を全てチェックして選択状態にして位置がわかるようにしていると思います。
マクロで連続して行うと、操作ができない(例えばA列の値を修正するとか)ので、選択することの意味が半減してしまうように思います。


一方で、A列の各行で同様のチェックなさりたいのなら、関数と条件付き書式でもほぼ同様のことが可能だと思われます。
(「重複を全て選択」という部分だけ異なりますが)
もしかすると、その方が扱いやすいのではないかと、勝手に考えてみました。

A列の隣(右側または左側)の列の方が便利とは思いますが、とりあえずE列に表示する例です。
1)E4に =IFERROR(MATCH(A4,D$4:D$10000,0)+3,"")
 の関数式を設定し、下方にフィルコピー
2)さらに、E列の条件付き書式として、
 =E4<>"" の条件で (例えば)「塗色を朱色」などに設定

上記の設定で、A列の各値とD列で重複するものがあればその行数が表示され、朱塗り表示になります。(複数の重複がある場合は、最初の行数が表示されます)
(式を調整することで、その行のB列の値を併せて表示することも可能です。INDEX関数を利用してください)

この方法の利点は、マクロを実行させずともA列のどこかに入力すると、即時にそのチェックが表示されること。
また、たいしたことではありませんが、いちいちメッセージボックスを閉じる操作が不要になるというのもあります。(結構わずらわしいので)
欠点としては、(上にも書きましたが)重複が複数ある時に同時に全てを表示しない点でしょうか?
(重複を一つ解除すれば、次の重複がチェックにかかります)
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!