• 締切済み

マクロ 可視セルへコピーする方法

こんにちは。よろしくお願いします。 A~V列、300~400行程度の表を作っています。 8行目をコピーして空白行へペーストしたいのですがどのようにすれば良いでしょうか。 マクロの記録でつくったものは ActiveSheet.Paste でエラーになります。 またペースト開始行をA17ではなくて可変なものに変えたいです。 よろしくお願いします。 Sub 下までコピー() Range("A8:V8").Select Selection.Copy Selection.AutoFilter Field:=2, Criteria1:="=" Range("A17:V" & Range("B5").End(xlDown).Row).Select Selection.SpecialCells(xlCellTypeVisible).Select ActiveSheet.Paste Application.CutCopyMode = False Selection.AutoFilter Field:=2 End Sub

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 このような場合は、言葉で、きちんと説明したほうがよいのではないでしょうか? その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

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です。補足ありがとうございました。 でも元々の目的は「空白行に8行目をコピーしたい」ではないのですか? #01では目的にかないませんでしたか?  #01を   Set bRng = Range(Range("A9"), Range("A65536").End(xlUp)).SpecialCells(xlCellTypeBlanks) に変更すれば、挿入された空白行が9行目以降のどこにあってもコピーできると思います。 私はこの処理にオートフィルタを用いる必要を感じませんが、mnhc33さんご自身が書かれたマクロで動かしたいなら、少なくとも > Range("A17:V" & Range("B5").End(xlDown).Row).Select > Selection.SpecialCells(xlCellTypeVisible).Select では、貼り付け先の範囲はとびとびになるため > ActiveSheet.Paste を実行すると「複数の範囲に対しては実行できません」になるのではないかと思います。#01を参考にしてB列の可視セルだけを選択しFor Each ~ Nextでセル毎に貼り付ければよいでしょう。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

コードを見ても質問がよく分かりません。 A17以降の行のうちA列が空白の行全てにA8:V8をコピーするなら以下のようなマクロでもできます。でも細かいところが理解できていないので手を加えないと期待通りの動作にはならないと思います。 Sub Macro1() Dim r, bRng As Range   Set bRng = Range("A17").Resize(1000, 1).SpecialCells(xlCellTypeBlanks)   For Each r In bRng     Range("A8:V8").Copy Destination:=r   Next r End Sub >ペースト開始行をA17ではなくて可変なものに変えたいです も意味が理解できていないので考慮していません。

mnhc33
質問者

補足

説明が下手で申し訳ありません。 1.まず空白行を"計"の下に挿入し(このマクロはできました) 2.次に8行目(常に8行目は固定)をコピーして 3.オートフィルタでB列の空白行をソートします。 4.可視セルを選択してペーストします。 空白行の先頭はいつも17行目とは限らないということです。 よろしくお願いします

関連するQ&A

専門家に質問してみよう