こんにちは。
このような場合は、言葉で、きちんと説明したほうがよいのではないでしょうか?
その8行めはどういうもので、空白のどこにどのようにコピーをするとか。
「可視セルへコピーする方法」ということと、空白行にコピーするというのは、同義ではありません。
質問は、失敗したマクロを直してほしいという意味のようには思えるのですが、そのマクロでは、ほとんど、意味が伝わってきません。少なくとも、オートフィルタで、空白行を検索すること自体はよいにしても、その後、Select したら、一旦、オートフィルタを解除しなければなりません。その確保したRangeオブジェクトは、2列にまたがっていますから、それは、1つのセルに対するものではなく、Areas として処理しなければなりません。そういう点で、今のコードを直すのは難しくなってしまいます。
また、Copy を最初にしていますが、必ずしも、そういう必要性はないのです。
また、
Range("A17:V" & Range("B5").End(xlDown).Row).Select
こういうような、逆になっているものは、A17 以前にもコピーするという意味にも取れます。それでは、意味が通じないのです。
'-----------------------------------
'WorksheetFunction.CountA(c.Resize(, j))
'は、A列目からV列目までが、空白行であるという判定をしています。
'もし、最初の2列だけなら CountA(c.Resize(, 2) となります。
'B列の判定だけでよいなら、c.Offiset(,1) となります。
'今回は、A列からコピーしているので、For Each c In .Range("A5:A" & i) はそのままですが、i は、B列の最終セル行を取ってもよいです。
'-----------------------------------
Sub CopyDownward()
Dim rng As Range
Dim uRng As Range
Dim c As Range
Dim i As Long
Dim j As Long
With ActiveSheet
With .UsedRange
i = .Cells(.Cells.Count).Row
End With
Set rng = .Range("A8:V8")
If rng Is Nothing Then MsgBox "コピー元がありません", 48: Exit Sub
j = rng.Columns.Count
For Each c In .Range("A5:A" & i)
If WorksheetFunction.CountA(c.Resize(, j)) = 0 Then
If uRng Is Nothing Then
Set uRng = c.Resize(, j)
Else
Set uRng = Union(c.Resize(, j), uRng)
End If
End If
Next c
rng.Copy uRng
End With
Set rng = Nothing
Set uRng = Nothing
End Sub
補足
説明が下手で申し訳ありません。 1.まず空白行を"計"の下に挿入し(このマクロはできました) 2.次に8行目(常に8行目は固定)をコピーして 3.オートフィルタでB列の空白行をソートします。 4.可視セルを選択してペーストします。 空白行の先頭はいつも17行目とは限らないということです。 よろしくお願いします