重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

検索して該当者をメッセージに表示するように作成してますがつまずきました。
今回行いたいのはE列を検索してB列の内容をメッセージボックスに表示します。

  Dim com As Range
Set com = Worksheets("シート1").Range("e:e").Find(what:=”野菜”, lookat:=xlWhole)

  If Not com Is Nothing Then
Dim first As Range
Set first = com
Dim compp As String
compp = com.Value

Do
Set com = Worksheets("シート1").Range("e:e").FindNext(com)
If com.Address = first.Address Then
Exit Do
End If
comm = comm & vbCrLf & com.Value
Loop

MsgBox comm

Else

End If

 上記の内容はオフセットを使用し解決しました。ありがとうございました。

そこで問題が発生したのはB列の同じ名前は表示しないようにするのにはどうすればよいのかアドバイスお願いします。
白菜が2つありますが1つだけ表示させたいです。

「vba findnext で検索し同じ値」の質問画像

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

  • 作成したマクロです
    Dim first As Range
    Set first = com
    comm = com.Offset(, -2).Value
    Do
    Set com = Worksheets("シート1").Range("e:e").FindNext(com)
    If com.Address = first.Address Then
    Exit Do
    End If
    comm = comm & vbCrLf & com.Offset(, -2).Value
    End If
    Loop
    If comm <> "" Then
    MsgBox comm
    End If
    Else
    End If
    End If

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/09/18 12:03
  • 遅くなり申し訳ございません。
    できれば最初のマクロの修正でお願いします。

    No.6の回答に寄せられた補足コメントです。 補足日時:2021/09/18 17:35

A 回答 (7件)

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



Option Explicit

Sub sample()
Dim dicT As Object
Dim com As Range
Set dicT = CreateObject("Scripting.Dictionary")
Set com = Worksheets("シート1").Range("e:e").Find(what:="野菜", lookat:=xlWhole)

If Not com Is Nothing Then
Dim first As Range
Set first = com
Dim comm As String
Dim name As String
name = com.Offset(0, -3).Value
If dicT.exists(name) = False Then
dicT(name) = True
comm = comm & vbCrLf & name
End If
Do
Set com = Worksheets("シート1").Range("e:e").FindNext(com)
If com.Address = first.Address Then
Exit Do
End If
name = com.Offset(0, -3).Value
If dicT.exists(name) = False Then
dicT(name) = True
comm = comm & vbCrLf & name
End If
Loop

MsgBox comm

Else

End If
End Sub
    • good
    • 0
この回答へのお礼

この度はご教授ありがとうございました。
理想の形に完成しました。
dicT.exists(name)の使い方を勉強したいと思います。

お礼日時:2021/09/18 19:10

No4です。


あなたから、補足で提示されたマクロが使えないので、最初に提示されたマクロを修正したいと思いますが、それで良いでしょうか。
この回答への補足あり
    • good
    • 0

No2です。



補足のコードを見ても、(ご自分で)内容を把握できているとは思えませんね。
(中途半端なコードの提示の仕方なので)


ご質問の直接の回答ではありませんけれど、関数利用でも良ければ、以下のような簡単なコードでも同様のことは実現できます。
(Office365環境が条件になりますけれど…)

Sub Sample()
Set r = Cells(1, Columns.Count)
r.FormulaLocal = "=TEXTJOIN(CHAR(10),1,UNIQUE(FILTER(B:B,E:E=""野菜"","""")))"
s = r.Value
r.Clear
MsgBox s
End Sub

※ 私の環境では上記関数は使えないので、完全な検証はできていませんが、悪しからず。
※ 365環境でないとエラーになりますのでご注意。
    • good
    • 1
この回答へのお礼

職場のは365ではなかったと思いますが試してみます。
ありがとうございます。

お礼日時:2021/09/18 17:36

No3です。

補足ありがとうございました。
補足されたマクロをこちらで実行すると
添付図のようにエラーになってしまいました。
エラーにならないマクロを提示していただけませんでしょうか。
Sub sample()
End Sub
はこちらで追加しています。
マクロの途中からでなく、全て提示していただいた方が、
良いかと思います。
「vba findnext で検索し同じ値」の回答画像4
    • good
    • 0

あなたが提示されたスクリプトを実行すると


添付図のように野菜が2回表示されます。
問題点1.本来は野菜が3回表示されるべきではないでしょうか。
問題点2.B列の名前を表示するのにオフセットを使ったということですが、
そのオフセットを使ったマクロを提示していただけませんでしょうか。

このマクロだと、どのように修正したら良いか、迷ってしまいます。
問題点1、問題点2の解決も含めてどのようにしたら良いかということなら、そのように解決策を提示しますが、
問題点1、問題点2が既に解決済みなら、そのマクロを提示してください。
「vba findnext で検索し同じ値」の回答画像3
この回答への補足あり
    • good
    • 0

こんにちは



>同じ名前は表示しないようにするのには
>どうすればよいのかアドバイスお願いします。
基本的な考え方としては、ループで項目を追加する前に「既に同じ項目が存在するか」をチェックして、存在したら追加しないようにすれば良いでしょう。
それまでの項目は変数に持っているので、その中に同じ項目(=文字列)が存在するかを調べればよいです。

ただし、単純検索だと、ご提示の記録方法の場は「高麗人参」がすでにあるときに「人参」で検索するとヒットしてしまうので、少し工夫が必要かも知れません。
(区切り文字込みで検索するようにするなど)

あるいは、最初から文字連結をせずに、配列やDictionaryなどに記録していって、最後に連結して表示する方法をとれば、上記のような包含関係の項目を気にする必要はなくなります。(完全一致で調べればよいので)

ちょっと特殊な方法としては、シートの空き列にFINDで得た項目を順に記録していって、シート機能の「重複を省く」を行ってから、連結して表示するという方法も考えられます。
    • good
    • 1

Dictionaryオブジェクトで『各名前が既に出てきたか』をチェックする(登録する事で)とかですかね。


もっと楽な方法もあるのでしょうけど、なんせ初級レベルなジジィですので。

COUNTIF関数で発見されたセル~B2までの範囲で1を超えたら文字列の連結をしないってのもありそうですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
いろいろ試してみます。

お礼日時:2021/09/18 12:04

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