[[20181011164808]] 『可視セルの選択及びコピーをVBAでしたい』(ニコ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『可視セルの選択及びコピーをVBAでしたい』(ニコ)

可視セル範囲(A列〜D列)を選択し、
別のワークシートに貼り付けたいのですが、
1つ制限があり、処理方法で困っています。
現状の処理内容を記載しますので、教えて下さい。

困っている事項は、
可視セル範囲で選択した範囲の最下段の1行を
選択せずに別のワークシートにコピーしたいです。
(データ量は日々変化しますので、行の数は可変です。)

現状の処理方法。(最下段を含んだ可視セルの選択となっています。)

Sheets("Sheet1").Select

    Range("A1:D1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy

< 使用 Excel:Excel2010、使用 OS:Windows8 >


スマホからなので具体的なコードは提供できませんが、
>選択せずに別のワークシートにコピーしたい
そもそも、コピーするのに選択をする必要がありません。
(もこな2) 2018/10/11(木) 20:03

例えば
 Option Explicit

 Sub test()
    Dim r As Range

    Set r = Range("A1").CurrentRegion.Columns("A:D")
    Set r = r.Resize(r.Rows.Count - 1)

    r.SpecialCells(xlCellTypeVisible).Copy

 End Sub

(マナ) 2018/10/11(木) 20:07


マナさんのコードでちょっと確認ですが、
    Set r = r.Resize(r.Rows.Count - 1)

なんでここ、1行減らすんです?減らす必要はないような・・・

ちなみに、質問とは関係ないですが、ニコさんが提示されたコードの最終行を取り出すところだけ整理しなおすと

 Debug.Print Range("A1:D1").End(xlDown).Row

↑みたいな感じになるとおもいますが、この場合返ってくるのは、A列の最終行であって、B〜D列は考慮されないと思いますので、マナさんのように一旦表としてとらえて、表の最終行をしらべるなり、↓のように各列の最終行を一度求めてからそのうち最大値を最終列として採用するようにしたほうがよいとおもいます。

 Sub 実験()
    Dim MyROW(1 To 4) As Long
    Dim i As Long

    For i = 1 To 4
        MyROW(i) = Cells(1, i).End(xlDown).Row
    Next i

    Range("A1:D1").Resize(Application.Max(MyROW)).SpecialCells(xlCellTypeVisible).Copy

 End Sub

(もこな2) 2018/10/11(木) 22:12


 可視範囲の最終行だけを省くんですか。

 最終行判定はA列で問題ないなら、以下でどうですか?

 Sub test()

    Range("D1", Range("A" & Rows.Count).End(xlUp).Offset(-1)).SpecialCells(xlCellTypeVisible).Copy

 End Sub

 xlDownじゃないと不具合あるなら以下で。

 Sub test2()

    Range("D1", Range("A1").End(xlDown).Offset(-1)).SpecialCells(xlCellTypeVisible).Copy

 End Sub

 test2を追記しました。(6:36)

(sy) 2018/10/12(金) 06:27


あぁなるほど。。。

>可視セル範囲で選択した範囲の最下段の1行を選択せず
というのは、”選択”されることが問題じゃなくて、コピー範囲範囲に含まれちゃうことが問題だったんですね。失礼しました。

(もこな2) 2018/10/12(金) 09:53


 よくよく考えたらコピペの場合は .SpecialCells(xlCellTypeVisible) は無くても良かったです。
 以下で良かったです。

 Sub test2()

    Range("D1", Range("A1").End(xlDown).Offset(-1)).Copy

 End Sub

(sy) 2018/10/12(金) 19:58


>コピペの場合は .SpecialCells(xlCellTypeVisible) は無くても良かったです。

そうでした。わたしも元のコードにつられてしまいました。

(マナ) 2018/10/12(金) 20:06


 マナさんのコード、CurrentRegionは非表示セルも対象になってしまうので、
 最終行が非表示の時には、可視セルの最終行を省く事が出来ませんね。

(sy) 2018/10/12(金) 20:11


はい、わたしは、それでいいのだと思いました。

(マナ) 2018/10/12(金) 20:18


↑ちょっと、表現が間違っていました。

「それでもいいのだと思いました。」

が正しいです。

わたしが推測していたのは

実際のデータはテーブル設定になっていて、最終行が集計行。
で、フィルターで非表示になっている行がある。
なので、最終行は、いつも表示されているけれども
コピーはしたくないのかと。

妄想です。

(マナ) 2018/10/12(金) 20:35


 テーブルって使った事ないから知らなかった。
 最終行の下に集計行を挿入できたんですね。
 ちゃんと範囲の増減も可能とは。

 失礼しました。
 マナさんの読み(妄想(笑))通りの可能性が高いですね。

(sy) 2018/10/12(金) 21:12


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.