人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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に様々なデータが入っているため、不適とさせて下さい。

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

●質問者: Motonori
●カテゴリ:コンピュータ
✍キーワード:#N/A Excel VBA クラス コピー
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●50ポイント

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

Set myKekka = .FindNext()

とすればいいでしょう。

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

◎質問者からの返答

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

下記の作業を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


2 ● beatgoeson
●100ポイント ベストアンサー

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

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

◎質問者からの返答

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

ありがとうございます。

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

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


3 ● SALINGER
●100ポイント

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/

◎質問者からの返答

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

上手くいきました。

ありがとうございます、

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ