あなたの「必」の書き順を教えてください

A列に名前が入力されています。
同姓同名のセルを把握し、その行の情報を取得したいと思い、下記のコードを作成しました。
しかしなぜか、行の情報が上から表示してくれず、途中の情報から表示が始まり、その後上から表示されます。
上から順に表示される様にしたいのですが、コードをご教授願えませんでしょうか。

Private Sub CommandButton1_Click()

Dim 人物名 As Range
Dim 最初に見つかった人物 As Range
Dim 結果 As Range

Set 人物名 = Cells.Find(What:="佐藤 太郎", SearchOrder:=xlByColumns) ’上から検索としてみたのですが・・・
Set 最初に見つかった人物 = 人物名
Set 結果 = 人物名

Do
Set 人物名 = Columns(1).FindNext(人物名)
If 人物名.Address = 最初に見つかった人物.Address Then
MsgBox 最初に見つかった人物.Row
Exit Do
Else
Set 結果 = 人物名
MsgBox 結果.Row
End If
Loop

End Sub

「VBA 検索結果の行を取得。上から順に取」の質問画像

A 回答 (3件)

No.1です。



例えばこんなデータで

行 A列
1 a
2 a
3 a
4 a
5 a

Sub megu()
Dim r As Range
Dim st As String

Set r = Range("A:A").Find("a") '無指定

If Not r Is Nothing Then

st = r.Address

Do

Debug.Print r.Row

Set r = Range("A:A").FindNext(r)

If r.Address = st Then Exit Do

Loop

End If

Set r = Nothing

Debug.Print "---"

Set r = Range("A:A").Find("a", After:=Range("A" & Rows.Count)) '指定あり

If Not r Is Nothing Then

st = r.Address

Do

Debug.Print r.Row

Set r = Range("A:A").FindNext(r)

If r.Address = st Then Exit Do

Loop

End If

Set r = Nothing

End Sub

結果:

2
3
4
5
1
---
1
2
3
4
5

この違いって事ですよね?
    • good
    • 0
この回答へのお礼

そうです。これが実現したかった事です。「FindNext」を使うのがポイントだったんですね。調べたら「FindNextメソッドは引数で指定したセルの直後のセルから検索」と書いてありました。
ご指導ありがとう御座いました。

お礼日時:2021/06/10 18:43

こんにちは



多分仕様を勘違いなさっているものと思います。

FINDメソッドの場合、afterが無指定の場合は範囲の最初のセルとみなしますので、最初のセルがヒットしている場合は、「2番目のヒットが最初にヒット」することになります。
最初のセルがヒットしていない場合は、実質的に「最初のセルがヒット」することになるので、多分、ご期待通りになるものと思います。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

※ どうせなら直感的な仕様にして欲しいものですが、そこがM$さんお得意の「仕様です」なので・・・
    • good
    • 1

>Set 人物名 = Cells.Find(What:="佐藤 太郎", SearchOrder:=xlByColumns)



Findメソッドは余り省略すると予期しない動きをしますからね。
検索開始セルを指定するとその次のセルから検索しますから、この場合(指定してない)正常に動いてはいますけどね。


Set 人物名 = Cells.Find(What:="佐藤 太郎", After:=Range("A" & Rows.Count), SearchOrder:=xlByColumns)

かな?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報