EXCEL VBA で FindNextを使いたいと思っています。

構文について教えて下さい。

シート1(元データ)
A列が整理番号
C列が合計金額

シート2(問い合わせデータ)
A列が整理番号

というWorkbookがあります。シート1には大量のデータが入っています。
シート2にはデータが全く入っていません(タイトルのみ入っています。)

シート1のA列はヌルがなく、C列には複数個の"#N/A"が入っていますので、
このC列の"#N/A"の行に該当するA列の整理番号を
シート2の整理番号に移したいと考えています。

マクロを下記のように記載したのですが、(長文のため、分けました。)
http://q.hatena.ne.jp/1231436099
とすると
Range クラスのFindNextプロパティを取得できません。
と言われてしまいます。
どのようにしたら良いか、教えて頂けないでしょうか。

なお、シート1とシート2を使ったお答をお願いします。
シート2を使わずに、シート1のみを使うという回答は、不適とさせて下さい。
また、シート1をコピーして、シート2とし、ソートして作るというのも、実際はシート1、シート2に様々なデータが入っているため、不適とさせて下さい。

何卒、よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人10回まで
  • 登録:
  • 終了:2009/01/09 14:48:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:beatgoeson No.2

回答回数128ベストアンサー獲得回数14

ポイント100pt

以下でいかがでしょうか?

Set myKekka = .FindNext(myKekka )

とすれば動くと思います。

-----------------------------

Sub NuruSagashi3()

Dim Row As Integer

Dim myFirst As String

Dim myKekka As Range

Sheets(1).Select

With Range("C1:C600")

Set myKekka = .Find(What:="#N/A")

If Not myKekka Is Nothing Then

myFirst = myKekka.Address

Do

x = Sheets(2).Cells(600, 1).End(xlUp).Offset(1, 0).Row

Sheets(2).Cells(x, 1).Value = Sheets(1).Cells(myKekka.Row, 1).Value

Set myKekka = .FindNext(myKekka)

Loop Until myKekka.Address = myFirst

End If

End With

End Sub

-----------------------------

また、Findを使わないで、1件づつ調べる方法もあります

-----------------------------

Sub NuruSagashi4()

Dim Row As Integer

Dim i As Long

Sheets(1).Select

Row = 2

Do While True

If Sheets(1).Cells(Row, 1) = "" Then Exit Do

If IsError(Sheets(1).Cells(Row, 3)) = True Then

x = Sheets(2).Cells(600, 1).End(xlUp).Offset(1, 0).Row

Sheets(2).Cells(x, 1).Value = Sheets(1).Cells(Row, 1).Value

End If

Row = Row + 1

Loop

End Sub

--------------------

http://www.moug.net/tech/exvba/0050116.htm

id:Motonori

まずは、マクロを確認させて頂きました。

ありがとうございます。

実行してみて、再度コメントさせて頂きたいと思います。

丁寧なマクロ、ありがとうございます。

2009/01/09 10:42:40

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント50pt

エラーを出なくするならば

Set myKekka = .FindNext()

とすればいいでしょう。

http://q.hatena.ne.jp/1231436613

id:Motonori

確かに、エラーは解除できたのですが、目的のことが出来ませんでした。

下記の作業をC列に#N/Aがあるもの全てを繰り返したいのですが・・・。

何か良い方法ありませんでしょうか。

Sub NuruSagashi2()

Dim Row As Integer

Dim myFirst As String

Dim myKekka As Range

Sheets(1).Select

Range("C1:C600").Select

Selection.Find(What:="#N/A", After:=ActiveCell, LookIn:=xlFormulas, _

LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate

Row = ActiveCell.Row

x = Sheets(2).Cells(600, 1).End(xlUp).Offset(1, 0).Row

Sheets(2).Cells(x, 1).Value = Sheets(1).Cells(Row, 1).Value

End Sub

2009/01/09 08:51:09
id:beatgoeson No.2

回答回数128ベストアンサー獲得回数14ここでベストアンサー

ポイント100pt

以下でいかがでしょうか?

Set myKekka = .FindNext(myKekka )

とすれば動くと思います。

-----------------------------

Sub NuruSagashi3()

Dim Row As Integer

Dim myFirst As String

Dim myKekka As Range

Sheets(1).Select

With Range("C1:C600")

Set myKekka = .Find(What:="#N/A")

If Not myKekka Is Nothing Then

myFirst = myKekka.Address

Do

x = Sheets(2).Cells(600, 1).End(xlUp).Offset(1, 0).Row

Sheets(2).Cells(x, 1).Value = Sheets(1).Cells(myKekka.Row, 1).Value

Set myKekka = .FindNext(myKekka)

Loop Until myKekka.Address = myFirst

End If

End With

End Sub

-----------------------------

また、Findを使わないで、1件づつ調べる方法もあります

-----------------------------

Sub NuruSagashi4()

Dim Row As Integer

Dim i As Long

Sheets(1).Select

Row = 2

Do While True

If Sheets(1).Cells(Row, 1) = "" Then Exit Do

If IsError(Sheets(1).Cells(Row, 3)) = True Then

x = Sheets(2).Cells(600, 1).End(xlUp).Offset(1, 0).Row

Sheets(2).Cells(x, 1).Value = Sheets(1).Cells(Row, 1).Value

End If

Row = Row + 1

Loop

End Sub

--------------------

http://www.moug.net/tech/exvba/0050116.htm

id:Motonori

まずは、マクロを確認させて頂きました。

ありがとうございます。

実行してみて、再度コメントさせて頂きたいと思います。

丁寧なマクロ、ありがとうございます。

2009/01/09 10:42:40
id:SALINGER No.3

回答回数3454ベストアンサー獲得回数969

ポイント100pt

Findメソッドのafter引数はRange型なのでエラーとなるわけですが、

#N/Aの判定をFindでするよりは単純に以下の方法でいいんじゃないかな。

    Dim rastRow As Long
    Dim i As Long
    rastRow = Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row + 1
    For i = 1 To 600
        If Application.WorksheetFunction.IsNA(Sheets(1).Cells(i, 3)) Then
            Sheets(2).Cells(rastRow, 1).Value = Sheets(1).Cells(i, 1).Value
            rastRow = rastRow + 1
        End If
    Next i

http://q.hatena.ne.jp/

id:Motonori

実行してみましたところ、

上手くいきました。

ありがとうございます、

2009/01/09 12:02:32
  • id:Motonori
    皆様ありがとうございます。

    beatgoeson様
    SALINGER 様

    に教えて頂きました方法で、
    上手にマクロが稼動しました。

    今回の例では、上手くいきましたため、
    実際に使うデータで試してみまして、
    再度挑戦してみます。

    御礼申しあげます。
  • id:SALINGER
    Set myKekka = .Find(What:="#N/A")
    ではエラーを検出しないと思います。
    Findが使えればデータが多い場合高速なんですけどね。
    また、IsErrorだと#N/A以外のエラーもTrueを返します。
  • id:beatgoeson
    C列に式が入ってるのですね。
    それでは、
    Set myKekka = .Find(What:="#N/A", LookIn:=xlValues)
    としてみてください。
  • id:Motonori
    SALINGER 様
    beatgoeson 様

    丁寧なマクロの上に、アフターフォローまで頂きまして、
    誠にありがとうございます。

    おかげさまで、対応できました。

    C列には、本来式が入っているのですが、その部分をコピー&値として貼り付けを
    しておりまして、値となっております。

    また、データの移項ですが、今回の式では、Cells間の移動となっていますが、
    Range間での移動(一度に列C、列D、列E等、同行隣り合う複数列間の移動)は、
    可能なのでしょうか。

    とても丁寧なご対応を頂きまして、ありがとうございます。

    御礼申しあげます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません