繰り返しの検索処理で問題発生:次の検索がうまくいかない

このQ&Aのポイント
  • 質問者は、繰り返しの検索処理について質問しています。
  • 繰り返し中の検索は正常に処理されているが、nextの後の検索がうまくいかないようです。
  • 質問者は、変数の値や検索条件を確認しましたが理由が分からず、手動で検索してみたところ、値のコピーでの検索は正常にできたと報告しています。
回答を見る
  • ベストアンサー

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"から取得した方では検索できません。 検索しようとしていた値(他のブックに入力されている値)を直接コピーしたほうから検索出来ます。 どちらの値も違いはないように見えます。 どなたかこのような現象に心あたりがあるかたはいらっしゃいますでしょうか?

noname#150547
noname#150547

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

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

n-junです。 >ところでFalseと表示された場合、どのあたりに問題がありそうでしょうか? >見た目には違いはないのですが。 ・全角、半角の違い ・文字以外の物がある とかが考えられそう。 まず変数”ABC”に代入する部分と、 コピー元のセルの値を再確認。 --- 他にはセルの表示形式で”そのように見えているが実は違うもの” と言うのに”日付”がありますね。 検索する値は文字列で指定しても、実際のセルにはシリアル値でデータがあり 表示形式で表示を変えている場合とか。 --- あとは”他のブック”と良いながら、実は自ブックを検索しているとか。 >a = sheets(1).cells.find(what:=ABC) ブックの指定はされていませんが、 その辺で問題はないでしょうか? ⇒検索したいシートを事前にアクティブにしているなら、 大丈夫かな?

noname#150547
質問者

お礼

ありがとうございます。無事解決に至りました。

その他の回答 (1)

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

>変数"ABC"から取得した方では検索できません。 >検索しようとしていた値(他のブックに入力されている値)を >直接コピーしたほうから検索出来ます。 例えばコピーしてみた値をセルA1に貼付けます。 そのセル値と変数”ABC”は同じになるか試してみましたか? MsgBox Range("A1").Value = ABC で True と表示されるか?(Falseなら違うと言う事) あと引数LookAtでxlPart(部分一致)は試されてますか? 指定してなければ、LookAt:=xlPart を入れてみて下さい。

noname#150547
質問者

補足

n-junさん ご回答ありがとうございます。 環境が会社にしかないので週明けに試したいと思います。 ところでFalseと表示された場合、どのあたりに問題がありそうでしょうか? 見た目には違いはないのですが。 xlPart(部分一致)はすでに試していますが変数”ABC”から取得した値では検索は不可能でした。

関連するQ&A

  • エクセル 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) = オーダ番号

  • VBA Find

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

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

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

  • 改行のあるセルをFindで検索したい

    エクセルです。 A1セルに 「あああ」と入力して、ALT+Enterで改行し、「いいい」と入力しました。 VBAで Sub test() MsgBox Cells.Find(What:="あああ" & Chr(13) & "いいい", LookAt:=xlWhole).Address End Sub として、セル番地を取得したいのですが オブジェクト変数または With ブロック変数が設定されていません。(Error 91) と言うエラーが返ってきてしまいます。 $a$1が返ってきてほしいのですが。 Sub test() Debug.Print Cells.Find(What:="あああ*", LookAt:=xlWhole).Address End Sub で、$a$1が返ってきますが、 できれば改行含む検索ができるようになりたいです。

  • エクセルVBAについて

    こんにちは。エクセルVBAを勉強して間もない初心者です。現在、作っているものがありますが、分からなくなってしまったのでご指導をお願いいたします。エクセル2000を使用しています。 《Sheets構成》 Sheets(1)とsheets(5)があります。※Sheets(2)~Sheets(4)はここでは省略します。 Sheets(1)には、Range(cells(19,2),cells(49,8))に、ランダムに商品CDが入力されています。 Sheets(5)には、Range(cells(7,2),cells(31,2))に商品CDが入力されています。 《やりたい事》 Sheets(1)に入力されている商品CDが、Sheets(5)にも入力されているかチェックし、もしSheets(5)に入力されていればSheets(1)の商品CDが入力されているセルに、"○"を表示させ、入力されていなければ、空白にしたいと考えています。 そのため、自分なりにマクロを作成してみましたが、どうしても空白にする事ができませんので、詳しい方のご指導を頂ければと思います。 《作成したマクロ・・・(変数の宣言はここでは省略させて頂きます)》 sub 商品CDチェック() For n = 2 To 8      'Sheets(1)B列~H列の変数 For m = 19 To 49  'Sheets(1)商品CDが入っている行  mm = 7        'Sheets(5)の商品CDが入っている行 Do         'Sheets(1)とsheets(5)の商品CDのチェック If Sheets(1).Cells(m, n).Value = Sheets(5).Cells(mm, 2).Value Then Sheets(1).Cells(m, n).Value = "○"     'Sheets(5)に商品CDが入力されていれば○ End If mm = mm + 1 Loop Until Sheets(5).Cells(mm, 2) = "" Next m Next n 《その他》 調べたところ、検索するにはFindメソッドを使用するような事が書いてあるものも見つけましたが、使い方がわかりません。もし、上記のマクロを作りたい時はFindを使ったほうが良い場合は、Findを使ったマクロも教えて頂けると、非常に参考になります。 よろしくお願いいたします。

  • EXCEL VBAのFind について

    VBAで、特定の文字が入っているセル位置(結合セル)を取得したく、 シートのコード記述で --- Private Sub Worksheet_Change(ByVal Target As Range) Dim w_CelObj As Object Set w_CelObj = ActiveSheet.Cells.Find(What:="あああ", LookAt:=xlWhole, MatchByte:=False) MsgBox w_CelObj.Row MsgBox Cells.Find(What:="いいい").Row End Sub ----- と記述し、"aa"も"bb"もどちらの方法でも取得できました。 ですが、これを別のEXCELブック(既にシートがたくさんあり、コードもびっしり記述してあります)で同様のことを行おうとするとエラーになってしまいます。 ※新しいシートを作成し、そのシートにコードをコピーして試しました。 セルの結合を解除すると正常に取得できるのですが、結合セルだとFindされてきません。 調べてみましたが、「Cells.Find」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • マクロで検索行・データが入力されている部分を変更したい

    下記4行目に入力されている行は常に変わる為、このままでは検索にかなりの時間が掛かってしまいます。出来ることならデータ入力の最終の行で検索終了したいのですがどうかご教授お願いいたします。 1 Sub Macro1() 2 For a = 1 To 3000 3 snum = Sheets(2).Cells(a, 11) 4 For b = 1 To 200 'ここはSheet1でデータが入力されてる行数 5 If snum = Sheets(1).Cells(b, 1) Then 6 Sheets(2).Cells(a, 12).Value = Sheets(1).Cells(b, 2) 7 Sheets(2).Cells(a, 13).Value = Sheets(1).Cells(b, 3) 8 Sheets(2).Cells(a, 14).Value = Sheets(1).Cells(b, 4) 9 Exit For 10 End If 11 Next 12 Next 13 End Sub

  • VBA 見つからなかった時の処理

    VBAで検索した文字が見つかったら処理をしますが、 見つからなかったらエラーになります。 見つからなかった場合に何もしない様に変えていただけないでしょうか? Sheets("Sheet3").Range("A1") = _ Sheets("Sheet1").Cells.Find("あああ").Offset(1, 0)

  • ブック内のシートを新規ブックにコピーしたい

    アクティブになっているブックの複数のシート(具体的には30シート)をデータ、書式のみをコピーし保存したいのですが、どうもうまくいきません。 アクティブブックのシートには、フォームコントロールのボタンや、関数、リスト形式で指定したデータ(入力規則を利用し別ブックのデータシートを元の値に指定)など、全てをコピーしてしまいます。 現在のコーディングは以下のようにしています。 For intRow2 = 1 To ThisWorkbook.Sheets.Count If intRow2 > 5 Then ’6シート目からコピー cpyshtname = Trim(ThisWorkbook.Sheets.Item(intRow2).Name) ThisWorkbook.Sheets(cpyshtname).Copy after:=opn_book.Sheets("Sheet1") Sheets(cpyshtname).Name = cpyshtname opn_book.Sheets(cpyshtname).Cells.Copy opn_book.Sheets(cpyshtname).Cells.PasteSpecial Paste:=xlPasteValues opn_book.Sheets(cpyshtname).Cells.PasteSpecial Paste:=xlPasteFormats End If Next さらに新規に作ったブックには変更ができないようにしたいと考えています。 いろいろ、試したり、調べたりしたのですが、どうしても、値と書式のみのコピーができません。 おまけに結合したセルも解除されたりしています。 どなたか、解決策をご存知の方、ご教授ください。宜しくお願いします。

  • シートをオブジェクト変数に格納しつつ、findで文

    前回、http://okwave.jp/qa/q7965940.html で質問したのですが、 シートをオブジェクト変数に格納しつつ、findで文字を検索する場合、どうすればいいでしょうか? Sub test() Dim sh1 As Worksheet Dim 行 As Long Set sh1 = Sheets("Sheet1") 行 = Cells.Find(What:="検索文字", LookAt:=xlWhole).Row End Sub こういう事を行いたいのですが、 Sheet2がアクティブな時にこのコードを実行すると実行時エラー91になります。 対処方法をお願いいたします。