エクセルマクロでFINDを使用して特定セルを探し出す方法

このQ&Aのポイント
  • エクセルマクロを使用して特定のセルを探し出し、それを起点にコピーする領域を設定する方法について質問します。
  • 質問者はFINDの部分でエラーが発生しているため、何が問題なのかわからず困っています。
  • エラー名は「実行時エラー13:型が一致しません」と表示されています。
回答を見る
  • ベストアンサー

エクセル マクロ FIND

いつも回答して頂き、心から感謝しています。 FINDで特定セルを探し出し、そこを起点にコピーする領域を設定しようかなと考えています。 で、FINDの部分で早くも分からなくなったので質問します。 下記のようなマクロを記述しましたが、FINDの記述の箇所でエラーが発生してしまいます。 何が悪いのかさっぱり分からないので、どなたか教えて下さい。 エラー名:実行時エラー13       型が一致しません。 Sub 作業状態の部分を作業名別に各シートに貼り付ける() Dim b1 As Variant With Worksheets("書面") Set b1 = .Columns("B").Find("作業状態", xlValues, xlWhole, xlByColumns, xlNext) b1.Select End With End Sub

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

sub macro1r1()  dim c as range  dim c0 as string  with worksheets("書面").columns("B:D")  set c = .find(what:="作業状態", lookin:=xlvalues, lookat:=xlwhole)  if c is nothing then exit sub  c0 = c.address  do   application.intersect(c.mergearea.entirerow, range("B:BQ")).select   msgbox "OK"   set c = .findnext(c)  loop until c.address = c0  end with end sub ホントに列範囲を限定する必要があるのか疑問ですが。

kero1192kero
質問者

お礼

返事が遅くなって申し訳ありませんでした。 列を指定したのは、添付図と同じのが2つ並んでいるからで、列の始まりと終わりを指定してあげないと、不要な隣の情報まで選択されてしまうと思ったからです。 貼り付けて確認し、思っていた通りに選択されました。ありがとうございました。

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

FindおよびFindNextのヘルプの使用例に、ほとんどそのまま利用できるサンプルがあります。が、そういやヘルプをパソコンで見られないんでしたっけ。 sub macro1()  dim c as range  dim c0 as string  with worksheets("書面").columns("B:D")  set c = .find(what:="作業状態", lookin:=xlvalues, lookat:=xlwhole)  if c is nothing then exit sub  c0 = c.address  do   c.mergearea.entirerow.select   msgbox "OK"   set c = .findnext(c)  loop until c.address = c0  end with end sub

kero1192kero
質問者

お礼

回答して頂き、ありがとうございました。 今回は家からなんで、HELPは見れましたが(実際見たのはエクセル大辞典)さっぱり分からなくて。色々書き直しましたが??でした。 今回の回答内容を見てみると、列の指定が間違っていた事が分かりました。(B列しか指定していなかった。)試しに、自分の記述Set b1 = .Columns("B")の部分のBをB:Dに変更したらうまくいきました。 あと、次の部分まで考えて下さりありがとうございました。かなり短い記述でほぼ自分が考えていた通りの動作が出来ていてびっくりしました。 で、質問ですが、c.mergearea.entirerow.selectの部分ですが列を指定する方法はないのでしょうか?(例:一つ目の選択エリアはB14:BQ23です。)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

例えば次のようなコードにします。 Sub 作業状態の部分を作業名別に各シートに貼り付ける() Dim b1 As Variant Dim i As Integer With Worksheets("Sheet3").Range("A1:A1000") Set b1 = .Find("作業状態", LookIn:=xlValues, SearchDirection:=xlByRows) If b1 Is Nothing Then End i = b1.Row Do i = i + 1 Loop Until Range("A" & i) <> "" Range(Cells(b1.Row, 1), Cells(i - 1, "X")).Select End With End Sub

kero1192kero
質問者

お礼

返事が遅れてしまい申し訳ありませんでした。 貼り付けて確認してみました。 作業状態の下に文字が入力されている場合は正確に選択されますが、作業状態の下に文字が入力されていない場合は、永久ループに入るようです。解決方法が分からなかったので、回答No.3を参考にさせてもらう事にしました。 貴重な時間をこの質問に費やして頂き、ありがとうございました。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

引数名省略の場合、カンマは省略できません。 又、見つからない場合は終了としましましょう。 Set b1 = .Columns("B").Find("作業状態", , xlValues, xlWhole, xlByColumns, xlNext) If b1 Is Nothing Then End 因みに、Set b1 = .Columns("B").Find(What:="作業状態", Lookin:=xlValues, Lookat:=xlWhole)でも可。

kero1192kero
質問者

お礼

回答ありがとうございました。 質問していた問題ですが、回答No.3の記述事例を確認して、列の指定が間違っていた事が分かりました。(B列しか指定していなかった。)試しに、自分の記述Set b1 = .Columns("B")の部分のBをB:Dに変更したらうまくいきました。 貴重な時間を私の質問に費やして頂き、ありがとうございました。

関連するQ&A

  • EXCELマクロのこの記述の意味を教えてください。

    こんにちは。 以前、教えてもらったマクロですが もう少し深く勉強したいので、記述の 意味(翻訳?)を教えてください。 Sub Test5() Dim FR1 As Range, FR2 As Range With ActiveSheet Set FR1 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByRows, xlPrevious) Set FR2 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByColumns, xlPrevious) End With Range("A1", Cells(FR1.Row, FR2.Column)).Select Set FR1 = Nothing: Set FR2 = Nothing End Sub また、この範囲をA列だけを見る場合、つまりA列の最終行を範囲とする場合は、どう記述すればよいのでしょうか? ぜひ、教えてください。

  • Findの使い方について教えてください

    資材算出のシートのD3の値をこのシートのJ1に貼り付け、J1の値をA5~A1000の間で完全一致で検索し、そのセルをアクティブにしたいのですが、検索がエラーが発生し上手くいきません。 Whatは文字の指定をしなければならなのでしょうか? 最終的には資材算出のD3の値を別のシートのA5~A1000の間で検索をかけたいです。 Private Sub CommandButton3_Click() worksheets("資材算出").Range("D3") = Range("J1") Range("A5:A1000").Find(What:=Range("J1") _ , After:=ActiveCell _ , LookIn:=xlValues _ , LookAt:=xlWhole _ , SearchOrder:=xlByColumns _ , SearchDirection:=xlNext _ , MatchCase:=False _ , MatchByte:=False _ , SearchFormat:=False).Activate End Sub よろしくお願いいたします。

  • EXCEL マクロでの検索をお教えください

     下記のようなマクロを使いたいのですがこの場合×があるときは良いのですが、  無いときエラーが出ます。どの様にすれば良いのかお教えください。  無いときエラーは オブジェクト変数または With ブロック変数が設定されていません。  となります。 Sub 検索()    Range("K12:K70").Select    Cells.Find(What:="×", After:=ActiveCell, LookIn:= _    xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _    xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub

  • マクロ findを使用しての列番号検索

    いつも回答して頂き、とても感謝しています。 質問内容ですが、 FINDを使用して列番号を検索する時、FINDでセル位置を取り出し、そのセル位置を元に列番号を取り出しています。FINDの記述部分で列番号を検索するにはどうしたらよろしいのでしょうか?宜しくお願い致します。 Dim 項目1 As Range Dim c1 As Long If Application.CountIf(Rows(4), "みかん") = 1 Then Set 項目1 = ws2.Rows(4).Find(what:="みかん", LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, searchdirection:=xlPrevious) c1 = 項目1.Column End If

  • 改行のあるセルを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のFINDの質問です。

    エクセルVBAのFINDの質問です。 シート1    A    B    C     D 1 コード1 コード2 コード3 名 称 2  4    1     1 3  4    2     2 4  4    3     1 シート2    A    B 1 コード1 名 称 2  1   名称1 3  2   名称2 やりたいことは、シート1のD列に、シート1のコード3をもとにシート2から名称を取得したいのです。 下記に記したプログラムだと最初のFINDNEXTは動くのですが、 2回目でエラーになってしまい、次を読んでくれません。 どなたか、ご教授頂けますでしょうか。 シート1の検索条件はコード1の"4"です。 シート1のコード1は重複キーで、一レコードずつ読んで行き、各レコード毎にシート2を読みたい のです。 Dim シート1 As Worksheet Dim シート2 As Worksheet Dim obj As Object Dim Lin As Integer Dim mykey As Integer Dim obj1 As Object Dim Lin1 As Integer Dim mykey1 As Integer Dim st_Lin As Integer Set シート1 = ThisWorkbook.Worksheets("シート1") Lin = シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row mykey = "4" Set obj = シート1.Range("A1", "A" & Lin).Cells.Find(What:=mykey, _ LookIn:=xlValues, _ lookat:=xlWhole, _ SearchOrder:=xlByColumns) If obj Is Nothing Then   MsgBox ("異常です")   Exit Sub Else   st_Lin = obj.Row   Do Until obj.Row <> st_Lin    Set obj = シート1.Range("A1", "A" & Lin).FindNext(obj)    If obj Is Nothing Then     Exit Do    Else     Set シート2 = ThisWorkbook.Worksheets("シート2")       With シート2          Lin1 = .Cells(シート2.Rows.Count, 1).End(xlUp).Row          mykey1 = シート1.Cells(obj.Row, 3).Value          Set obj1 = .Range("A1", "A" & Lin1).Cells.Find          (What:=mykey1,LookIn:=xlValues,lookat:=xlWhole,SearchOrder:=xlByColumns)          If obj1 Is Nothing Then           MsgBox ("名称取得できませんでした")           Exit Sub          Else            シート1.Cells(obj.Row, 4).Value = .Cells(obj1.Row, 2).Value          End If       End With    End If   Loop End If

  • マクロ 困っています

    いつも回答して頂き、感謝しています。 作りかけで全然出来ていないんですが、 下記の文のFINDの箇所でエラーが発生します。 原因が分からないので、どうしたら解消されるか教えて頂けないでしょうか? 宜しくお願い致します。 ちなみにFINDで検索している行の最初の列は下記の数式が入力されています。 =FLOOR(NOW(),"1:00") 隣の列から下記の式が入力されています。 =RC[-6]+TIME(1,0,0) セルの書式設定のユーザー定義で時間だけ表示するようにしています。 Option Explicit Sub スケジュール表作成() Dim 始点 As Date, 終点 As Date, 開始 As Date, 終了 As Date Dim 開始c As Integer, 終了c As Integer Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("スケジュール表") 始点 = ws1.Cells(3, 3).Value 終点 = ws1.Cells(3, 249).Value 開始 = Application.WorksheetFunction.Floor(ws1.Cells(10, 2), (1 / 24)) If 始点 <= 開始 And 開始 <= 終点 Then 開始c = ws1.Rows(3).Find(what:=開始, LookIn:=xlValues, lookat:=xlWhole, _ searchorder:=xlByColumns, searchdirection:=xlNext).Column End If End Sub

  • 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」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • エクセルVBA セルを参照した文字検索でシートをアクティブにする

    VBA初心者で困っています。 ブックAのシート1の“A1”の値が、同一ブック内の違うシートにあるかどうか検索し、あればそのセルをアクティブにして黄色に色づけ、なければメッセージを返すという処理をVBAで行いたいです。 似たような質問があってそれを参考にしてみましたが どうも上手く動いてくれません。 参考にさせていただいたのは   Set r = Workbooks("ブックB.xls").Sheets("シート1").Columns("A") _     .Find(What:=Workbooks("ブックA.xls").Sheets("シート1").Range("A1").Value, _        LookIn:=xlValues, _        LookAt:=xlWhole, _        SearchOrder:=xlByColumns, _        SearchDirection:=xlNext, _        MatchCase:=True)   If r Is Nothing Then     MsgBox "no data"   Else     Application.Goto r     Set r = Nothing   End If End Sub というコードです どなたか、わかる方教えてください。

  • マクロ FIND 検索方向の変更

    いつも回答ありがとうございます。 FINDを使用した検索方向の変更についての質問です。以下のFINDの記述方法で、上から一発目に捉えられたキーワードではなく、下から一発目に捉えられたキーワードに変更するにはどうしたらよろしいでしょうか?それとも、FINDの記述方法を大幅に変えなければいけないのでしょうか?御指導の程宜しくお願い致します。 Sub TEST() Dim d As Integer Dim e As Integer Worksheets("一覧").Activate d = 3 e = 3 Do While Worksheets("一覧").Cells(d, 2).Value <> "" Dim c As Variant Dim R As Range Dim s As Range With Worksheets(Worksheets("一覧").Cells(d, 2).Value) Set c = .Columns("H").Find("増", , xlValues, 1) If Not c Is Nothing Then Set R = .Range(c.Offset(1, -4), .Cells(Rows.Count, "D").End(xlUp)) Set s = c.Offset(, -5) With Worksheets("編集用一覧") .Range(.Cells(e, 4), .Cells(e, 5)).ClearContents .Cells(e, 4).Value = s .Cells(e, 5).Value = Application.Sum(R) End With End If End With d = d + 1 e = e + 4 Loop End Sub

専門家に質問してみよう