Findメソッドの検索範囲に指定した左上セルが最後に検索されてしまうが?

Question 98.3   Previous Next
はじめまして まったくの初心者なので、ここは難しいのですが調べながらなので勉強になります。
ありがとうございます。
わからないのは『FindNext』なのですが、検索開始位置が1つ下の行からになってしまいます。
左上図(Sheet1)の場合、『検索範囲を D2~D6と指定すると、D3(スタート)~D6、最後にD2』 と、なってしまいます。 いろいろ調べても、どこのサイトでも 「左上から検索します…」とあるのですが、どこが悪いのかチンプンカンプンです。
D2~F6までに値があれば、C列の対応する行の値を、左下図(Sheet2)の対応する列(曜日)に上から詰めて入れていきたいの です。

作ったマクロは下記のとおりです。

なお、セル削除も考えてみましたが後の作業上、詰めたくありませんので、検索→コピー→ペーストでいきたいのです。

マクロを使わず、関数で作ってみましたが、完成したらえらい容量になってしまいました。
そこでマクロに挑戦したのですが、初めてなので行き詰ってしまいました。 お手数とは思いますが、よろしくお願いします。
Sub 女性AMの移動()
 Dim 検索 As Range
 Dim Fアドレス As String
 Worksheets("Sheet2").Range("c2:i6").ClearContents
 For 列 = 4 To 10
    Set 検索 = Range(Cells(2, 列), Cells(6, 列)).Find(what:="女", _
        LookIn:=xlFormulas, matchbyte:=True, lookat:=xlPart)
     行 = 2
    If Not 検索 Is Nothing Then
        Fアドレス = 検索.Address
        Do
            Worksheets("Sheet1").Cells(検索.Row, 3).Copy
            Worksheets("Sheet2").Cells(行, 検索.Column - 1).PasteSpecial _
                xlPasteValues
            行 = 行 + 1
            Set 検索 = Range(Cells(2, 列), Cells(6, 列)).FindNext(検索)
        Loop While Not 検索 Is Nothing And 検索.Address <> Fアドレス
    End If
 Next 列
End Sub
Answer   Copyright (C) 2009.10.26 永井善王
結論から申し上げますと、マクロの6行目にある Set文を下記のとおり修正すれば解決すると思います。
    Set 検索 = Range(Cells(1, 列), Cells(6, 列)).Find(what:="女", _
        LookIn:=xlValues,  matchbyte:=True, lookat:=xlPart)
理由としましては、Range.Findメソッドは After引数で指定されたセルの次から検索が開始され、指定されたセルは最後に検索されるからです。 (念のためExcel 2007 VBAのヘルプでご確認ください。)
貴方の場合はAfter引数を省略しているので、
Range(Cells(2, 列), Cells(6, 列)) の 左上端セル、つまり、
Range(Cells(2, 列), Cells(2, 列)) が指定されたセルとみなされ、 その次のセルである
Range(Cells(3, 列), Cells(3, 列)) から検索が開始されます。

ついでですが、
LookIn:=xlFormulas と指定しているのを、LookIn:=xlValues に直しておいた方がいいと思います。
では、試してみて、上手くいったらお知らせください。
ありがとうございました
教えていただいたとおりに行ったところ、うまくいきました。 1週間以上悩んでいたので助かりました。本当にありがとうございます。
ネットや本で調べながら 「本来この場合は『FindNext』が適しているか?」、「ひょっとしたら最悪の方法で行っているのではないか?」とか、自分の選択に自信が持てるほどの知識がないどころかそれ以前の力量なので、常に自分に疑問を感じてしまいます。
まずは、そちらのHPにある内容がきちんと理解できるようがんばっていきたいと思います。
どうもありがとうございました。

 

Excel VBA Macro