• ベストアンサー

VBA Find

困りました、、 Findを使って検索しようとしていて、 検索する値に変数を使っているのですが (変数は文字列) 検索するものがたくさんあり、 ひとつの項目ごとにFindを書くのがとても面倒です 調べてみても数字を増やしていく方法しか見つからず どうすればいいのか分からなくなりました^^; どうにかひとつのFindで10個ほどある項目を順番に検索していく方法が ありましたらお願いします(__)

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

  • ベストアンサー
回答No.4

Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range If Not Application.Intersect(Target, Worksheets("Sheet2").Range("B1")) Is Nothing Then '範囲に含まれて無くない=含まれてたら! If Worksheets("Sheet2").Range("B1") <> "" Then Set FoundCell = Worksheets("Sheet1").Columns("A").Find(what:=Worksheets("Sheet2").Range("B1"), lookat:=xlWhole) If FoundCell Is Nothing Then MsgBox "個人番号が見つかりませんでした。" Else Worksheets("Sheet1").Select FoundCell.Activate FoundCell.Select ' "見つかったセルを選択" Dim ActiveRow As Long ActiveRow = ActiveCell.Row Worksheets("Sheet2").Range("B2") = Worksheets("Sheet1").Range("B" & ActiveRow) '通信費 Worksheets("Sheet2").Range("B3") = Worksheets("Sheet1").Range("C" & ActiveRow) '所属コード Worksheets("Sheet2").Range("B4") = Worksheets("Sheet1").Range("D" & ActiveRow) '会社コード Worksheets("Sheet2").Range("B5") = Worksheets("Sheet1").Range("E" & ActiveRow) '基本給 End If End If End If End Sub すごく遠回りした気もしますが、こんな感じでしょうか?(たぶんバグあります。) 一番簡単なのは、関数を使うことだと思いますよ。 B2に =INDEX(Sheet1!$A$1:$E$6,MATCH($B$1,Sheet1!$A$1:$A$6,0),MATCH(A2,Sheet1!$A$1:$E$1,0)) と入力して下にコピーしていけば出来ると思います。

lostsymbol
質問者

お礼

ありがとうございます!! 基本的な動きはこれでいけたと思います。 あとは細かい所のデバッグをしていくだけですね 関数はちょっと、、、 1クリックでやりたいもので(笑)

その他の回答 (3)

回答No.3

[Sheet1] A,B,C,D,E あ,15 い,14 う,12 え,1 お,13 [Sheet2] A,B,C,D,E サンプルコード,データ,,,, 1023,テスト1, 15,あ, ・ ・ 上記のようにシート名とカンマ区切りでデータを表示してもらえると助かります。 また、やりたいことが何だか良く分からないので、 やりたいことを箇条書きにして下さい。(そうすればプログラムは簡単に組めるはずです) たとえば、 Sheet1のA列を、Sheet2のB列の内容で検索をかける 見つかったらE列に○と記入する とかです。

lostsymbol
質問者

お礼

形が崩れてしまって読みにくいですね(-_-;)

lostsymbol
質問者

補足

〈sheet1〉 A    B    C      D    E 個人番号 通勤費 所属コード 会社コード 基本給 16458 ○○   ○○    ○○   ○○ 36582   ○○   ○○    ○○   ○○ 47265 ○○ ○○ ○○ ○○ 37592 ○○ ○○ ○○ ○○ 46503 ○○ ○○ ○○ ○○ 〈sheet2〉    A    B 個人番号  36582 通勤費   ○○ 所属コード ○○ 会社コード ○○ 基本給   ○○ このようにシート2に個人番号を打てば 通勤費や会社コードなど対応する値が入るようにしたいのです ・シート2に個人番号入力 ・シート1のA列から個人番号検索 ・シート2の各項目をシート1の1行目から検索 ・シート2にその値をコピー これがやりたいことです! よろしくお願いします<(_ _)>

回答No.2

プログラムの内容を拝見しましたが、 別にこのような作業をしていく必要があるのでしょうか? 使っていない列を使って 項目があるところには○を記入…とかすれば もっと簡単にできると思いますが… とりあえず、現段階と同じ方法でやっていくのなら… http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_for_next.html Rangeを設定しておき、 指定範囲にあるRangeデータを繰り返し検索…などは出来ると思います。 Sub rei1()  Dim myRng As Range  Dim c As Range  Set myRng = Range("C1:C10")   For Each c In myRng    Msgbox C.Address      Next c End Sub やりたいことを箇条書きにし、 一つずつ考えていけば良いものができるかと思います。 もう少し詳しい内容か、サンプルデータを頂ければ 回答できると思います。

lostsymbol
質問者

補足

すいません、よく理解できないのですが、、、 あとサンプルデータの張り方も分かりません(-_-;)

回答No.1

困りました。 どうやっているのか想像ができません… 現状、どういうプログラムなのか見せてもらえませんか? そうしたら改善策が出てくると思いますよ。

lostsymbol
質問者

補足

Set Range2= wsrist.Columns("B").Find(what:=wsData.Range("G3"), lookat:=xlWhole) 'hlineに値があった場合、行番号取得 If Not Range Is Nothing Then hline = Range.Row Else MsgBox "対象の従業員が見つかりませんでした" End If '【各項目検索】 '所属コード Set range2 = wsrist.Cells.Find(what:=(member), lookat:=xlWhole) If Not range2 Is Nothing Then vline = range2.Column Else MsgBox "所属コードは見つかりませんでした" End If wskyu.Range("P7") = wsrist.Cells(hline, vline).Value このような形で別のシートから 個人番号・・・G3 を検索し列を取得、 あれば次に 所属コード・・・member で検索して行を取得し 最後にその二つがぶつかるところを 参照してきています 所属コードいがいに10個ほど項目があり、 今はそれごとにFindを書いています

関連するQ&A