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

Excelで、「検索してヒットしたセルのとなりのセルに、特定の値を
入力する」という作業をスムーズにできる方法を考えています。

具体的には在庫のチェックに使います。A列に品名が6000件ほどあって、
検索してヒットした品名の隣のセル(B列)に"●"を入力する作業です。
ただし、その隣のセル(B列)にはあらかじめ"○"が入力されています。

現在のところ、
 ctrl+F で検索 → 該当するセルに"●"をペースト 
で処理していますが、もっと効率的な方法をご存じないでしょうか。
少しでもマウスを動かしたりするのを減らしたいのです。

一つ考えているのは、以下のようにマクロを利用することです。
ユーザーフォーム
 テキストボックス(検索する文字列の入力用)
 コマンドボタン1(検索用)
 コマンドボタン2(次を検索)
 コマンドボタン3(前を検索)
 ラベル(検索してヒットしたセルの値を確認する用)
 コマンドボタン4("●"を該当セルに入力する用)

ここまでたどり着いたのですが、お手上げになりました。
このような考えを実現するコードをお教えいただけないでしょうか。
あるいは、もっと楽なやり方があるということでしたら、それも
お教えいただけないでしょうか。よろしくお願いします。

A 回答 (5件)

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/20 21:37

下記は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 = "●" とかすれば良いでしょう。
    • good
    • 0
この回答へのお礼

早々にありがとうございます。
お教えいただいたコードでかなりいい具合にいったのですが、
残念ながら目標まで到達しませんでした。
これは私の説明不足によるものだと思います。
お手数をおかけして申し訳ありません。

検索してヒットしたすべての値の隣のセルに入力するのではなく、

1)商品名を「部分一致」で検索
2)複数ヒットした場合、目視で該当する唯一のものを選択
3)その選択されたセルの隣のセルのみに"●"を入力

というのが真意でした。
検索する商品名が長い(しかも1対1で対応するような識別コードがない)ために、このように考える次第です。
もう一度おつきあいいただけると幸甚です。

お礼日時:2008/07/20 21:32

考えが変な方に行ってると思う。


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秒ぐらい。
    • good
    • 0
この回答へのお礼

早々にありがとうございます。
お教えいただいたコードでかなりいい具合にいったのですが、
残念ながら目標まで到達しませんでした。
これはおっしゃるとおり、私の説明不足によるものだと思います。
お手数をおかけして申し訳ありません。

検索してヒットしたすべての値の隣のセルに入力するのではなく、

1)商品名を「部分一致」で検索
2)複数ヒットした場合、目視で該当する唯一のものを選択
3)その選択されたセルの隣のセルのみに"●"を入力

というのが真意でした。
検索する商品名が長い(しかも1対1で対応するような識別コードがない)ために、このように考える次第です。
もう一度おつきあいいただけると幸甚です。

お礼日時:2008/07/20 21:35

>1)商品名を「部分一致」で検索


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

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
    • good
    • 0
この回答へのお礼

ありがとうござます!

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

このたびは、ほんとうにありがとうございました。助かりました。

お礼日時:2008/07/21 04:01

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