[[20230401214302]] 『Find Nextの引数について(初心者の質問です。)』(ビギナー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Find Nextの引数について(初心者の質問です。)』(ビギナー)

VBAを始めたばかりの者です。
同じ検索条件で検索するコードを作っています。


Sub データの検索()
    Dim fndRng As Range, srcRng As Range

    '変数fAddressには、Findメソッドで最初に見つかったセルの場所を格納
    Dim fAddress As String, r As Long

    '検索結果を書き出すセル範囲E4;G4の値を消去
    Range("E4:G4").ClearContents

    '変数srcRngにセルA3を含む表の3列目(「会員区分」列)を代入
    Set srcRng = Range("A3").CurrentRegion.Columns(3)

    '検索キーワードはセルF1の値で完全一致検索を行う
    '変数srcRngの範囲を検索し、最初に見つかったセルを変数fndRngに代入
    Set fndRng = srcRng.Find(What:=Range("F1").Value, _
                          LookAt:=xlWhole)

    '検索値が見つかった場合(fndRngがNothingでない場合)
    If Not fndRng Is Nothing Then
    'Findメソッドで最初に見つかったセルの場所を格納
      fAddress = fndRng.Address
      r = 4 '検索結果を書き出す最初の行数(4行目)を代入

    Do
      '見つかったセルとそのセルの左側2つのセルの値をセルE4:G4に入力
      Cells(r, "E").Value = fndRng.Offset(, -2).Value
      Cells(r, "F").Value = fndRng.Offset(, -1).Value
      Cells(r, "G").Value = fndRng.Value

      '見つかったセルの次から同じ条件で検索を続行し、
      '見つかったセルを変数fndRngに代入
    ★ Set fndRng = srcRng.FindNext(after:=fndRng)
      r = r + 1

      '変数fndRngのセル番地が、fAddressと同じになるまで検索を繰り返す
      Loop Until fndRng.Address = fAddress

    '検索値が見つからなかった場合(fndRngがNothingの場合)
    Else
      MsgBox "該当区分がありませんでした"
    End If

    'セルへの参照を解除
    Set fndRng = Nothing
    Set srcRng = Nothing
End Sub

上記コードで★印をいれている部分なのですが、「after:=fndRng」で行いたい作業はできているのですが、この部分はセルを指定すると、指定したセルの次のセルから再検索をかけるという認識でいることより、「after:=fAddress」でも出来るのか?と思い変更してみると、「rangeクラスのFindNextプロパティを取得できません」というエラーになります。

ただ、「after:=fAddress」で指定できたとしても「fAddress」は絶対参照のセルとなっているため、繰り返しとなり求めている作業は出来ないと認識しているのですが、なぜエラーが発生してしまうのか、「fAddress=C5」ではないのか?を教えて頂くお知恵をお貸し頂ければと思います。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 >「after:=fndRng」・・この部分はセルを指定すると、・・次のセルから再検索をかける
 >「after:=fAddress」でも出来るのか?

 文字列なので不可です。セル(Range型)を指定する必要があります。(※1)
 fAddressは Stringt型の為、型ミスマッチとなるハズです。

 ※1 ヘルプの記述では「Variant型」と説明されていますが、しょうもない間違いです。

(半平太) 2023/04/01(土) 23:03:17


半平太 様

ご返信有難うございます。
意味が分かりました。

1点だけ私の認識が誤っていないか確認なのですが、

「Loop Until fndRng.Address = fAddress」

このコードは元々「変数fAddressに格納されている情報がC5」だった場合、
「検索したセルの参照がC5セルとなった場合に終了」という認識ではなく、
C5を文字列との認識より「C5からC6,C7・・・と検索スタートして、あくまでも文字としてみてもう一度C5になったら終了」という読み方になるのでしょうか?
(ビギナー) 2023/04/01(土) 23:41:54


 >C5からC6,C7・・・と検索スタートして、
 >あくまでも文字としてみてもう一度C5になったら終了」という読み方になるのでしょうか?
 違います。
 Until fndRng.Address = fAddressですから
 マッチしたセルのアドレスが、最初にマッチしたセルのアドレスと一致するまで、
 つまり「一周したら」という意味です。
  
(γ) 2023/04/02(日) 06:12:32

 「文字としてみて」の意味が不明だったが、アドレス文字列という意味ならそれでOKです。
 いずれにしても、
 ・fAddressになにが入っていて、
 ・fndRng.Addressは何か、
 というのを、
 ローカルウインドウなり、変数のうえにカーソルを置いて値をポップアップさせたり、
 イミディエイトウインドウで確認するなり、
 その実体をご自分で確認することです。
 そうすれば納得されるでしょう。
  
(γ) 2023/04/02(日) 06:58:12

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.