• ベストアンサー

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

  • find での検索について

    find での検索について 以下のような繰り返しの処理を作成しました。 (実際のコードよりかなり簡略化して書いています) for 1 to *** a = sheets(1).cells.find(what:=ABC) next a = sheets(1).cells.find(what:=ABC) 常に変化する変数"ABC"を元に他のブックに検索をかけ、データをコピーしてくる 処理をしています。 つまずいているところは繰り返し中の検索は正常に処理出来ているが nextを抜けた後の検索がうまくいかない点です。 具体的には他のブックに検索したい値(変数"ABC")があるのに検索できないというものです。 自分なりに以下のような切り分けを行いました。 1,nextを抜けた後の変数"ABC"の値が他のブックに存在しない変数を取得しているのではないか? と思い直前で変数"ABC"を表示させてみたが正常 2,"ABC"の値に空白や,大文字、小文字等があり検索出来ないのではないか? と思い調べてみたが正常 3,引き数LookInですべてのパターンを試したがうまくいかなかった。 途方に暮れて、手動で検索を行ってみました。 1,エラーで途中で止まってから他のブックをCtrl+Fで検索(マクロの実行途中で止まっているため、検索しようとしていた値、変数"ABC"がすでに検索する文字列(N):に入力されている)するが対象が見つからない。 2,検索しようとしていた値(他のブックに入力されている値)を直接コピーして検索をかけたところ 正常に検索できた 3,おかしいなと思いCtrl+Fで"検索する文字列(N):"をプルダウンメニューをみてみると全く同じ値がありました。試しになんどか交互に手動検索をかけてみましたが変数"ABC"から取得した方では検索できません。 検索しようとしていた値(他のブックに入力されている値)を直接コピーしたほうから検索出来ます。 どちらの値も違いはないように見えます。 どなたかこのような現象に心あたりがあるかたはいらっしゃいますでしょうか?

  • VBA/FIND関数を使っての先頭文字列の検索方法

    エクセルVBAにてFIND関数を使って、 文字列検索⇒コピー&ペーストのマクロを作成しているのですが、 どうしても、先頭文字列から検索をする方法がわかりません。 たとえば、 あいうえお いうえおあ おあいうえ えおあいう という文字列から「あいう*」を検索したい場合、 1行目だけを抽出したいのですが、 1,3,4行目が抽出されてしまいます。 find関数では先頭文字からの検索はできないのでしょうか? もし、不可能な場合、先頭文字からの検索を行うにはどのように行えばよいでしょうか? アドバイス、よろしくお願いいたします。

  • マクロのCells.Findについて

    エクセルマクロのCells.Findについて教えてください。 特定の文字列を含むセルを検索するときにCells.Findを使うと思うのですが、例えば、「スペル」という文字列を検索したいけれども、「ゴスペル」というような文字列は排除しながら検索できますか?「スペル」と入力されているセルと、「ゴスペル」と入力されているセルと、「スペル、ゴスペル」と入力されているセルがあったときに、「スペル」や「スペル、ゴスペル」と入力されているセルを検索したいです。 Cells.FindのWhat:=の記入中身を工夫すればできないかなと頭を悩ませていますが、Cells.Find以外の方法でも結構です。どうか宜しくお願いします。

  • エクセルVBAのFindメソッドを使って・・・

    こんばんは。エクセルのVBAで教えてください。 I列で「数量」という文字を見つけて、 その(I列の)右隣(J列)の値をB2以降に、 その2つ左(G列)のレートをC2以降に、 その3つ左(F列)の、2つ上の商品名をA2以降に 順に書き出していくようにしたいのですがどのようにコードを 書けばいいでしょうか? Findメソッドを使ってできそうだと考えたのですが、その先が さっぱりわかりませんが、なんとか形にしたいので質問させていただ きます。よろしくお願いします。

  • VBA/ CurrentRegion.Find

    以下の様なVBAで"検索ワード"が入力されているセルを抽出しています。 Set 検索結果 = 検索範囲.CurrentRegion.Find(what:="検索ワード") 検索ワードは"01000"といった感じの5桁の数字(テキストタイプ)です。 7000行くらいの検索範囲の中から、2500回くらいの"検索ワード"を変更しながら検索するものです。 概ねうまくいくのですが、10件くらい、検索結果に実際と異なる値が入ります。 デバッグしていくとうまくいくものは例えば検索ワードが"02020"だった場合、検索結果も"02020"となりますが、うまくいかない場合には、検索ワードが"03000"のときに検索結果に"F003000"といった値が入り、検索結果.rowには全く関係のない"01750"が入力されているセルの行番号が入ったりします。 10個くらいそういう現象が起きる"検索ワード"には全く規則性はなく("03000"とか"10233"とか先頭が"0"のものに限られる、といったこともなく)、検索結果に入る値も"F003000"や"A1023300"など、検索ワードを含んでいるようなのですが、前後につく文字はよくわかりません。 しかも、実際には検索範囲の中に検索ワードは存在し、例えば"03000"の行を検索範囲の一番上に並び替えた場合は、ちゃんとヒットします。 非常に分かりにくい質問で恐縮ですが、何か考えられる要因があるようでしたら、可能性だけでも結構ですので、ご意見いただければと思います。 ※"検索結果"とか"検索ワード"とかは実際のVBAの中では半角アルファベットで定義されています。 ※ほとんどがうまくいっているので定義の方は問題無いものと思われます。

  • エクセルVBAで検索(FIND使用)

    困っています。お願いします。 例、このようなシートがあるとする 100 200 300 1000 10000 エクセルVBAで fc = Range("a1").Interior.Find("100") 「100」で検索すると100だけではなく、100を含むすべての文字列、つまり1000、10000も全部ひっかかります。 ちょっと困るので、完全一致のものだけを抽出する方法ありませんか。 ちなみに今日はじめてエクセルVBAを触りました。初心者です

  • 【VBA】findの検索条件における制限について

    すみません、教えてください。 例) Range("XX" & YY).Find(what:=文字A, lookAt:=xlWhole) ↑のような感じで完全一致で検索したいのですが、 実行するとエラーコード13のエラーが出てしまいました。    実行時エラー'13' 型が一致しません。 調べてみたのですが、VBAの本にはfindのwhatはVariant型と書いてあり、 Variant型が16バイトという記載がありました。 例文の“=文字A”には30バイトの文字列が入っている事がわかりました。 文字数を減らした所うまく通ったのでこれが原因と考えているのですが、 もし、対処方法があれば教えていただきたいです。

  • エクセル VBA find は別シートを検索できますでしょうか?

    こんばんわ。マクロ初心者です。 皆さんいつも親切なご回答ありがとうございます。 早速ですが質問内容を記入いたします。 ・ブックA を開いています。 選択している行のC列セルの値を検索キーワードにして、 ブックB 内を検索し、検索結果のセルの3つ左のセルの値を、 ブックA で選択していたセルの同じ行のO列(15列目)に入力したいです。 ※ブックBをアクティベートする事無く行えますでしょうか? (他の処理と組合わせて行い、回数も多いので、  ブックA⇔ブックB アクティベートの往復は避けたいです。) 下のようなマクロを作成してみましたがうまくいきません。 どうかご指導よろしくお願いいたします。 --------------------------------------------------------------- dim 検索品目 as string dim fcell as object dim i as integer i = Selection.Row '選択行の3列目セルの値を変数『検索品目』に格納 検索品目 = Cells(i, 3).Value 'オブジェクト変数『fcell』に検索したセルを格納 Set fcell = Cells.Find(What:=検索品目, After:=Workbooks("ブックB.xls").Worksheets("sheet1").Range("G2"), LookAt:=xlWhole, searchorder:=xlByColumns) '検索したセルの3行左のセルの値を変数『オーダ番号』に格納 オーダ番号 = fcell.Offset(, -3).Value 'ブック A の選択行の15列(O列)にデータ入力 Cells(i, 15) = オーダ番号

  • Excel VBAのFindメソッドについて

    Excel VBAを勉強中の者です。 Findメソッドで、数字の入ったF5セルからF28セルの範囲から、 1という数字の入ったセルを検索したいと思い Sub test() Dim xRange As Range Set xRange = Range("F5:F20").Find(What:=1, LookIn:=xlValues)   xRange.Select End sub としました。 しかし、このまま検索するとF6セルの12が検索されてしまいます。 他の数字では問題なく、対象の数字の先頭の数字が選択されます。 どうしてでしょうか? よろしくお願いします。

  • vbaのFindメソッドで取得するにはどうすれば

    A1に「あ」B1に「い」と入れて、 A2に「=A1&B1」としました。 この時、A2は「あい」と表示されます。 今回やりたいことは、 Sub test() Debug.Print Cells.Find(What:=" あい").Row End Sub で、2を返したいのですが、 実行時エラー91になってしまいます。 セル内に該当の文字列がないからだと思いますが、 数式でつなげた文字列を、 vbaのFindメソッドで取得するにはどうすれば良いでしょうか?