• ベストアンサー

Excelで、検索してヒットしたセルの隣のセルに値を入力したい

Excelで、「検索してヒットしたセルのとなりのセルに、特定の値を 入力する」という作業をスムーズにできる方法を考えています。 具体的には在庫のチェックに使います。A列に品名が6000件ほどあって、 検索してヒットした品名の隣のセル(B列)に"●"を入力する作業です。 ただし、その隣のセル(B列)にはあらかじめ"○"が入力されています。 現在のところ、  ctrl+F で検索 → 該当するセルに"●"をペースト  で処理していますが、もっと効率的な方法をご存じないでしょうか。 少しでもマウスを動かしたりするのを減らしたいのです。 一つ考えているのは、以下のようにマクロを利用することです。 ユーザーフォーム  テキストボックス(検索する文字列の入力用)  コマンドボタン1(検索用)  コマンドボタン2(次を検索)  コマンドボタン3(前を検索)  ラベル(検索してヒットしたセルの値を確認する用)  コマンドボタン4("●"を該当セルに入力する用) ここまでたどり着いたのですが、お手上げになりました。 このような考えを実現するコードをお教えいただけないでしょうか。 あるいは、もっと楽なやり方があるということでしたら、それも お教えいただけないでしょうか。よろしくお願いします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

ANo.2です。何件くらいヒットするのか分かりませんが、先の回答を改造して下記の様なのはいかがでしょうか。UserFormに、テキストボックスと、リストボックスを設けます。テキストボックスに入れた文字列に部分一致するもののリストがリストボックスに表示されますので、目的の値をクリックすると、その値の隣のセルに●が入ります。(この後何をなさりたいのかは分かりかねますが) <標準モジュール> Sub test() UserForm1.Show Set UserForm1 = Nothing End Sub <UserForm1のコード> Dim matchRange() As Range Private Sub TextBox1_Change() Dim c As Range Dim firstAddress As String ReDim matchRange(0 To 0) With Worksheets(1).Range("a1:f500") Debug.Print TextBox1.Value Set c = .Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart) If Not c Is Nothing Then firstAddress = c.Address Set matchRange(0) = c Me.ListBox1.AddItem c.Text Do Set c = .FindNext(c) If (c Is Nothing) Or (c.Address = firstAddress) Then Exit Do ReDim Preserve matchRange(UBound(matchRange) + 1) Set matchRange(UBound(matchRange)) = c Me.ListBox1.AddItem c.Text Loop End If End With End Sub Private Sub ListBox1_Click() matchRange(ListBox1.ListIndex).Offset(0, 1).Value = "●" Me.Hide End Sub

futabatei
質問者

お礼

ありがとうござます! >(この後何をなさりたいのかは分かりかねますが) ひたすら同じ作業を繰り返します。 ですので、最後の Me.Hide のところを Me.TextBox1.value ="" Me.ListBox1.clear としてみました。 このたびは、ほんとうにありがとうございました。助かりました。

その他の回答 (4)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

>1)商品名を「部分一致」で検索 >2)複数ヒットした場合、目視で該当する唯一のものを選択 >3)その選択されたセルの隣のセルのみに"●"を入力 検索ではな抽出をしてシート上で確認・入力では無理なのですか?

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

考えが変な方に行ってると思う。 VBAは自動的にA列にある重複して出現分・該当分検索することが出きる。 コマンドボタンのクリックをきっかけに実行が始まれば、該当の最後まで検索します。 なぜ コマンドボタン1(検索用)  コマンドボタン2(次を検索)  コマンドボタン3(前を検索) が要るのですか。 多分質問者に必要な作業は、バッチ型作業で、一気に処理すればよいのでしょう。これが違うなら質問の説明が不足している。 (まず周辺1点) Offsetメソッドで1発で>隣のセルに、値(決まった値とかルールが記述できるセルの値)をセットできます。>該当するセルに"●"をペースト なぞ必要ない。 (メインポイント) >VBAは自動的に該当分検索することが出きる、といったが, Findメソッドを使うという場合は VBAではFindメソッドとFindNextメソッドを組み合わせて使い、該当探索が終った(尽きた)際のコード上での捉え方が難しい。  だから私は初心者にはFindメソッドの使用は難しいといっている。 しかしマクロの記録で、コードの原型が判るし、WEBなどにもコード例が見つかる。 だから初心者でもコードを作れる。 一例 マクロの記録を改造 Sub Macro1() Application.ScreenUpdating = False 'Worksheets("Sheet1").Activate d = Range("A65536").End(xlUp).Row Range("A2:A" & d).Select Set x = Selection.Find(What:="a", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False) If x Is Nothing Then GoTo p2 x.Activate fst = x.Address x.Offset(0, 1) = "○" p1: Cells.FindNext(After:=ActiveCell).Activate If ActiveCell.Address = fst Then GoTo p2 ActiveCell.Offset(0, 1) = "○" GoTo p1 p2: Application.ScreenUpdating = False End Sub 処理時間は4000件で6秒ぐらい。

futabatei
質問者

お礼

早々にありがとうございます。 お教えいただいたコードでかなりいい具合にいったのですが、 残念ながら目標まで到達しませんでした。 これはおっしゃるとおり、私の説明不足によるものだと思います。 お手数をおかけして申し訳ありません。 検索してヒットしたすべての値の隣のセルに入力するのではなく、 1)商品名を「部分一致」で検索 2)複数ヒットした場合、目視で該当する唯一のものを選択 3)その選択されたセルの隣のセルのみに"●"を入力 というのが真意でした。 検索する商品名が長い(しかも1対1で対応するような識別コードがない)ために、このように考える次第です。 もう一度おつきあいいただけると幸甚です。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

下記はXL2000 VBAのヘルプです Copy Right Microsoft Find メソッドの使用例 次の使用例は、シート 1 のセル範囲 A1:A500 で、値に 2 が含まれていて灰色表示のセルを検索します。 →これは誤訳で、実際はみつけたセルを灰色にしていますね。 With Worksheets(1).Range("a1:a500") Set c = .Find(2, lookin:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do c.Interior.Pattern = xlPatternGray50 Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If End With セルを灰色にする代わりに、 c.Offset(0,1).value = "●" とかすれば良いでしょう。

futabatei
質問者

お礼

早々にありがとうございます。 お教えいただいたコードでかなりいい具合にいったのですが、 残念ながら目標まで到達しませんでした。 これは私の説明不足によるものだと思います。 お手数をおかけして申し訳ありません。 検索してヒットしたすべての値の隣のセルに入力するのではなく、 1)商品名を「部分一致」で検索 2)複数ヒットした場合、目視で該当する唯一のものを選択 3)その選択されたセルの隣のセルのみに"●"を入力 というのが真意でした。 検索する商品名が長い(しかも1対1で対応するような識別コードがない)ために、このように考える次第です。 もう一度おつきあいいただけると幸甚です。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Findメソッドについては未実施ですか?

futabatei
質問者

お礼

いえ、実施しているのですが、No.3の方がおっしゃるとおり、 やはり初心者には、なかなかむずかしいですね。

関連するQ&A