• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロのCells.Findについて)

エクセルマクロのCells.Findについて

matsu_junの回答

  • ベストアンサー
  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.9

tktkmanureさん、おはようございます。 とりあえずはマクロの作成を始めておられると思います。 今回は利用しないかもしれませんが、参考になさってください。 前回は区切り文字が一つ(例では"、")としていましたが、今回は区切り文字を利用しないものを作成してみました。 また、Publicの関数としたので、標準モジュールないしはThisWorkbookモジュールに貼り付けてもらえばどこのシートからでも呼び出すことができます。 前回と同じ部分からはコメントを外しています。 '-----------------ここからコピー------------------- Public Function FindSpecial(TgtKey As String, TgtRng As Range, ExcKey() As String, AftRng As Range) As Range 'TgtKey : 検索対象となる文字 'TgtRng : 検索範囲(レンジで指定) 'ExcKey : 検索から除外する文字(配列で指定) 'AftRng : AftRngより先のセルから検索   Dim FirstFind As Range   On Error Resume Next  'AftRngが検索範囲外であった場合のエラー回避処理   Set FindSpecial = TgtRng.Find(TgtKey, After:=AftRng)     If Err.Number <> 0 Then       Set AftRng = TgtRng.Item(1)  'AftRngを、TgtRngの左上に再設定       Set FindSpecial = TgtRng.Find(TgtKey, After:=AftRng)  '再探索     End If   On Error GoTo 0   If Not (FindSpecial Is Nothing) Then     Set FirstFind = FindSpecial     If FindExeclude(TgtKey, FindSpecial.Value, ExcKey()) Then Exit Function  'SplKeyを撤去     Do Until (FindSpecial Is Nothing)       Set FindSpecial = TgtRng.FindNext(FindSpecial)       If FindSpecial.Address = FirstFind.Address Then Exit Do       If FindExeclude(TgtKey, FindSpecial.Value, ExcKey()) Then Exit Function 'SplKeyを撤去     Loop   End If   Set FindSpecial = Nothing End Function Private Function FindExeclude(TgtKey As String, TgtStr As String, ExcKey() As String) As Boolean 'FindSpecialの補助関数 'TgtKey : 検索する文字 'TgtStr : とりあえず検索したセルの中身(検索対象) 'ExcKey : 検索から除外する文字(配列で指定)   Dim TgtPt, ExcPt, CmpPt As Integer   'TgtPt : 検索対象文字中の検索文字の先頭位置   'ExcPt : 検索対象文字中の除外文字の先頭位置   'CmpPt : 除外文字中の検索文字の先頭位置      TgtPt = InStr(TgtStr, TgtKey)  '例:"プロゴスペル歌手とアマゴスペル歌手"中、"スペル"は、4文字目から始まる→TgtPt = 4      Do While (TgtPt <> 0)  '検索対象文字から検索対象が見つかっていれば以下の処理を実施     FindExeclude = True     For i# = 0 To UBound(ExcKey)  '除外文字の全てにおいて下記の処理を実施       CmpPt = InStr(ExcKey(i), TgtKey)  '例:"ゴスペル"中、"スペル"は、2文字目から始まる→CmpPt = 2       ExcPt = InStr(TgtStr, ExcKey(i))  '例:"プロゴスペル歌手とアマゴスペル歌手"中、"ゴスペル"は、3文字目から始まる→CmpPt = 3       If ExcPt <> 0 And ExcPt + CmpPt - 1 = TgtPt Then  'TgtStr中、検索されたTgtKeyとExcKeyが同じかどうかの判断         FindExeclude = False         Exit For  '同じものであれば、次の検索対象へ検索を移行       End If     Next i     If FindExeclude Then Exit Function     TgtStr = Right(TgtStr, Len(TgtStr) - TgtPt)  '検索対象文字に複数の検索文字があることを想定し、左端の検索済みの文字を削除     '例:検索対象を「プロゴスペル歌手とアマゴスペル歌手」→「ペル歌手とアマゴスペル歌手」     TgtPt = InStr(TgtStr, TgtKey)     '例:1回目の処理だと、TgtPt = 9となるが、2回目は、「ペル歌手」しか残らないので、2回目はTgtPt = 0となる   Loop    End Function '-----------------ここまでコピー------------------- 以下、試験用のサンプルプログラムです。 Private Sub CommandButton1_Click()   Dim JOGAI() As String   Dim ResultRange As Range   n# = 0   Do While (Cells(n + 1, 3) <> "")     ReDim Preserve JOGAI(n)     JOGAI(n) = Cells(n + 1, 3).Value     n = n + 1   Loop   FindSpecial(Range("B1"), Range("A:A"), JOGAI, ActiveCell).Select End Sub 今回は前回と趣向を変え、A列に検索対象文字を羅列してもらって、B1セルに検索したい文字、C列に除外したい文字列を1つずつ下向きに入れてもらうこととしました。 前回は、Split関数を用いて配列に値を格納する方法の例示としてあげましたが、今回は実際に配列を操作する時に、配列の上限をフレキシブルに変更する例(ReDim Preserve)として書いてみました。 では、良きVBAライフを。

tktkmanure
質問者

お礼

matsu_jun様 お礼が遅くなりました。上記マクロ、大変ありがとうございました。少し修正して実際に使用させていただきました。修正したのは、大文字/小文字や全角/半角の区別有/無を指定してFindSpecialを実行できるようにしました。 Public Function FindSpecial(TgtKey As String, TgtRng As Range, ExcKey() As String, AftRng As Range) As Range Private Function FindExclude(TgtKey As String, TgtStr As String, ExcKey() As String) As Boolean ↓Find関数におけるMatchCaseとMatchByteのようなパラメータ追加 Public Function FindSpecial(TgtKey As String, TgtRng As Range, ExcKey() As String, AftRng As Range, myMatchCase As Boolean, myMatchByte As Boolean) As Range Private Function FindExclude(TgtKey As String, TgtStr As String, ExcKey() As String, myMatchCase As Boolean, myMatchByte As Boolean) As Boolean FindExcludeで使用されているInStr関数は、デフォルトでは大文字・小文字を区別し、全角・半角は区別しないようなので、例えばFindExclude内TgtPtの計算を下記のように2×2=4通りに場合分けしました。 TgtPt = InStr(UCase(TgtStr), UCase(TgtKey)) TgtPt = InStr(TgtStr, TgtKey) TgtPt = InStr(1, UCase(TgtStr), UCase(TgtKey), vbBinaryCompare) TgtPt = InStr(1, TgtStr, TgtKey, vbBinaryCompare) Findと同じ感覚でFindSpecialを使用できるので、今後重宝しそうです。本当にありがとうございました!

関連するQ&A

  • エクセルマクロ・Cells.Find のエラー

      VBA初心者です。 ファイルA の C列 に入力されているデータが ファイルB に含まれているかどうか検索するマクロを Cells.Find を使って作ろうとしています。 データがファイルBに存在する場合は問題ありませんが存在 していない場合エラーが出て止まってしまいます。 ヘルプを見ると「セルが見つからなかった場合は、Nothingを返します」 と書かれていますが、どうもNothingとは返ってきません。 このエラーを回避する方法を教えてください。 例えばこんなマクロを組みました。  For tate = 0 To 19    Windows("ファイルA.xls").Activate    Range("C1").Offset(tate, 0).Select    データ = Range("C1").Offset(tate, 0)    Windows("ファイルB.xls").Activate    Cells.Find(データ, MatchCase:=False).Activate  Next tate 例えば最後の2行を    結果 = Cells.Find(What:=ISISDate, MatchCase:=False).Activate      MsgBox (結果)  Next tate とするとデータが含まれている場合は「True」と返ってきますが、 含まれていない場合は MsgBox が表示される前にエラーとなってしまいます。 とりあえずこのエラーを回避する方法をご存知でしたらお教えください。  

  • マクロCellsがわからなくて困っています

    マクロのCellsについて、夜も眠れないほど悩んでいます。 助けてください。 相談は以下です。 Cells(1,1).Select の行、列部分に、他のセルに入力済みの数値を指定したり、算出することはできますか? たとえば、あらかじめセルに数値が入っていたら Cells(1,A1).Select Cells(1,B1-A1).Select のように。(誤った文章ですが・・・) またこの方法に使えるCells以外の言葉があれば、教えてくださいませ!

  • 文字検索マクロで質問です。

    文字検索マクロで質問です。 下記のマクロを作成したのですが、A1に検索する文字を入力してA列(A5:11700)のみを検索して該当が有ったらそのセルを色を付けし、又,該当が無ければMSG BOXで”該当なし”と表示するマクロを御教授頂けますか。 Cells.Find(What:=Range("A1").Value, After:=ActiveCell, LookIn:=xlFormulas,   LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate 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」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • Excelファイル内の検索マクロがエラーになってしまいますので、その解

    Excelファイル内の検索マクロがエラーになってしまいますので、その解決方法を教えて戴きたいと思います。 (ExcelのVer.はPCによって異なり2002と2003です) 現在3つのExcelシートがありまして、内訳は ・検索.xls : 検索文字列入力用、マクロ実行用 ・文字列が含まれない.xls : データベース(検索文字列が含まれない) ・文字列が含まれる.xls : データベース(検索文字列が含まれる) となっております。 (デバッグの為にデータベースは意図的に作成しております) ここで『検索.xls』のマクロで以下のように作成をしてみました。 Sub 検索() Dim SearchWord As String Workbooks("検索.xls").Activate SearchWord = Worksheets("Sheet1").Cells(1, 1) ' 検索.xlsのSheet1のA1に検索文字入力 Workbooks.Open Filename:="D:\文字列が含まれない.xls" Windows("文字列が含まれない.xls").Activate Cells.Find(What:=SearchWord).Activate Workbooks.Open Filename:="D:\文字列が含まれる.xls" Windows("文字列が含まれる.xls").Activate Cells.Find(What:=SearchWord).Activate End Sub しかし、このマクロを実行しますと『文字列が含まれない.xls』の処理でエラーになってしまいます。 この『文字列が含まれない.xls』の処理をコメントアウトしますと『文字列が含まれる.xls』の処理はちゃんと実行してくれますので、データベースに検索文字が無かった場合の処理のさせかたが問題だとは思うのですけど、ネット検索をしても、上手なキーワードが思い浮かばずに欲しい情報がヒットしてくれません。 なにか単純な問題だと思うのですけれども、Excelにお詳しいかたがいらっしゃいましたら、回避策を教えて戴きたいと思います。

  • マクロのFINDメソッドで質問です。

    マクロの初心者で、いつもお世話になっております。 FINDメソッドを使って別々のシートから同じIDを探す処理をしたいのですが、IDが片方にしか無い場合に検索2rangeが"nothing"になってしまい止まってしまいます。 抜粋ですか以下の様にコーディングしました。 解る方がいましたらアドバイスをお願いします。 IDはIDがセットされている列です。 シート2を上から1つずつ見ていき、 シート1から該当するIDを探す処理をします。 最終的には該当したIDの行数を記憶して、 シート1とシート2をマッチングさせたいのですが。 Dim 検索range As Range Dim 検索2range As Range ID = Sheet2.Cells(LOOP_C1, 検索列).Value Set 検索Range = Range(Sheet1.Cells(F2TOP,検索列),Sheet1.Cells(LASTRow, 検索列)) Set 検索2range = 検索Range.Find(What:=ID, LookAt:=xlWhole, SearchOrder:=xlByRows, searchformat:=True).Row ※ If 検索2range Is Nothing Then Else   検索2range.Activate End If ・ ・ ・ ※の箇所で止まってしまいます。

  • ブック全体の文字列検索について

    Excelでセルに任意の文字列をペーストします。そのセルは別のブックにリンクしているのでペーストする度にリンク先のセルでは文字列が更新されます。リンク先のブックにはワークシートが10あっていづれかのシートのA列にその文字列がある事になっています。更新された文字列を検索する作業を繰り返すのでマクロで組み込もうと思ったのですがFIND関数にしても、VBでCell.Find(What:=....と書くにも参照する文字列を直接指定してやらないと動きません。参照する文字列が相対的に変化するので「特定のセルの中に入力された文字列」を参照してブック内を検索したいということなのですが、実現するにはどうしたらようでしょうか?と質問して moji = "B1" Set c = Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then c.Select というコードをしめしていただきました。このままだと検索対象がRangeオブジェクトになっているのでActivesheet上でしか検索がかからないのでCellsにすればブック内のすべてのシートに検索がかけられるかな?と思っていたのですがエラーがでます。ブック内を検索範囲に入れるためにはどうしたらよいでしょうか?

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

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

  • エクセルのマクロ コマンドのCells

    マクロ初心者です Cells(4,5)=5 とかで目的のセルに数字を代入したいのですが全然違うところに代入されてしまいます。 (一行目ばっかりにはいる、しかも列もずれている) なぜでしょうか? ご存知の方お願いします。

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。