構文について教えて下さい。
シート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に様々なデータが入っているため、不適とさせて下さい。
何卒、よろしくお願いいたします。
以下でいかがでしょうか?
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
--------------------
確かに、エラーは解除できたのですが、目的のことが出来ませんでした。
下記の作業を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
以下でいかがでしょうか?
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
--------------------
まずは、マクロを確認させて頂きました。
ありがとうございます。
実行してみて、再度コメントさせて頂きたいと思います。
丁寧なマクロ、ありがとうございます。
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
実行してみましたところ、
上手くいきました。
ありがとうございます、
まずは、マクロを確認させて頂きました。
ありがとうございます。
実行してみて、再度コメントさせて頂きたいと思います。
丁寧なマクロ、ありがとうございます。