質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

552閲覧

VBA データ抽出しコピー

koko2

総合スコア21

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2020/05/21 13:43

'Sh1のデータをオートフィルターする With Sh1.Range("A1") .AutoFilter field:=1, Criteria1:=keyWord .CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1, 29).Select .Range("A:A, C:C, K:K, O:P, S:S, U:U, AA:AC").Copy End With

<やりたいこと>
A列からAC列まであるデータで、オートフィルター後、A,C,K,O:P,S,U,AA:ACだけを
Sheet2に転記したいです。

<エラー箇所>
上記を実行しますと、Sheet1でフィルターをかけた見出し(1行目)までコピーされてしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

With Sh1.Range("A1") .Range("A:A, C:C, K:K, O:P, S:S, U:U, AA:AC").Copy

こうRangeプロパティで列を指定すると、「シート上の列全体」を指定いることになります。
Columnsプロパティですると、元のセル範囲の列になるんですが、飛び飛びで指定できません。
なので、
1)列毎にコピペを繰り返す
2)コピーした後不要な列を削除する
というようなことをしても結果は同じなので、そのように書くことも可能です。
ですが、どうしてもセル範囲を限定したいということであれば、
Intersect関数という関数で、セル範囲の積集合を求めることが可能ですので、
それを使うことで可能になります。

ExcelVBA

1Sub test() 2 Dim rngFrom As Range 3 Dim rngTo As Range 4 Dim sKey As String 5 6 Set rngFrom = Worksheets("Sheet1").Range("A1").CurrentRegion 7 With Worksheets("Sheet2") 8 .UsedRange.ClearContents 9 Set rngTo = .Range("A1") 10 End With 11 sKey = "2" 12 13 With rngFrom 14 .AutoFilter field:=1, Criteria1:=sKey 15 .Range("A:A, C:C, K:K, O:P, S:S, U:U, AA:AC").Select 16 Intersect(.Cells, .Offset(1), .Range("A:A, C:C, K:K, O:P, S:S, U:U, AA:AC")).Select 17 Intersect(.Cells, .Offset(1), .Range("A:A, C:C, K:K, O:P, S:S, U:U, AA:AC")).Copy rngTo 18 End With 19End Sub

※Selectすることは無意味です。
ステップインで1行ずつ実行して、
どのようなセル範囲が特定できているかを視覚化し確認するためにSelectしています。
動作が重くなったり、画面がチラチラすることを防ぐため、
動作確認後、運用時にはその行を削除してください。

投稿2020/05/21 23:04

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koko2

2020/05/22 01:24

ありがとうございました。画面がチラチラも気になってました。 回答頂き、とても助かりました。
koko2

2020/05/22 03:28

Sheet2の最終行(先に抽出したデータの下)にデータを追加していくには rngToのところ下記に変えればいいでしょうか? =Cells(Rows.Count, "A").End(xlUp).Row + 1
koko2

2020/05/22 04:11

解決しました。すみませんでした。
mattuwan

2020/05/22 04:36

Set rngTo = .cells(.rows.count,"A").end(xlup).offset(1) ですね。ピリオドを忘れずに。 行番号だけをわざわざ取り出さずに、セルそのものを変数に代入することを覚えましょう。
koko2

2020/05/23 14:41

アドバイスありがとうございます。 そうですねこれからも勉強していきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問