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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

マクロ

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

Q&A

解決済

1回答

826閲覧

EXCEL VBA(For~if)での抽出結果を値のみ貼付する手段について

RANDS_CHANP

総合スコア18

VBA

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

マクロ

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

0グッド

1クリップ

投稿2022/09/14 23:37

EXCELのマクロにて、データベースのシートからIFで条件に合った行を抽出し、別シートに結果を貼付ているのですが貼付先のシートの書式を活かしたいため、抽出結果を値のみ貼付をしたいと思っています。
データ量が大きくオートフィルターで行くと動作が重くなるため、少しでも高速に出来るよう添付の通りFor~ifで作りたくいのですが、PasteSpecialのようなことができる方法が分かられる方、ご教授お願いできますでしょうか。

Sub TEST1() Dim N With Worksheets("貼付先") For i = 7 To 5006 'D列が「キャップ」の場合 If Worksheets("データベース").Cells(i, "B") = "キャップ" Then '貼付先のB列を見て最終行を取得 N = .Cells(Rows.Count, "C").End(xlUp).Row '一致したデータのB列から11列分をコピーして最終行の1行下に貼付け Worksheets("データベース").Cells(i, "B").Resize(, 17).Copy .Cells(N + 1, "C") End If Next End With End Sub

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

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

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

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

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

guest

回答1

0

ベストアンサー

値のみの貼り付けをしたいということですね。
下記で値のみ貼り付けになります。

vba

1 Worksheets("データベース").Cells(i, "B").Resize(, 17).Copy 2 .Cells(N + 1, "C").PasteSpecial Paste:=xlPasteValues

あるいは、Value への代入の方が少し高速です。

vba

1 .Cells(N + 1, "C").Resize(, 17).Value = Worksheets("データベース").Cells(i, "B").Resize(, 17).Value

ただ、ループで1行ずつ転記していくより、オートフィルターで抽出して1回でコピーした方が高速だと思いますが、遅かったですか。

あと、高速化の定番の画面更新の停止、再計算の停止は試してみましたか。


オートフィルターを使ったコード例ですが、下記で遅いですか。

vba

1Sub TEST2() 2 Application.ScreenUpdating = False 3 Application.Calculation = xlCalculationManual 4 5 With Worksheets("データベース").Range("B6:R5006") 6 .AutoFilter Field:=1, Criteria1:="キャップ" 7 .Offset(1).Copy 8 End With 9 10 Worksheets("貼付先").Cells(Rows.Count, "C").End(xlUp).Offset(1).PasteSpecial xlPasteValues 11 12 Application.ScreenUpdating = True 13 Application.Calculation = xlCalculationAutomatic 14End Sub

投稿2022/09/15 00:07

編集2022/09/15 08:54
hatena19

総合スコア33715

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

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

RANDS_CHANP

2022/09/15 01:03

さっそくご教授頂き有難うございます。とても嬉しく思います。 画面停止Application.ScreenUpdatingは入れておりますが、VBAが達者で無いため代わりに使用しているシート上の幾つかの関数が重いのだと思います。 元コードの8行目'一致したデータのB列から11列分をコピーして最終行の1行下に貼付け’コメントの下に 一番初めに頂いたコードに置き換えて実施すると2行目(.Cells(N + 1, "C") .PasteSpecial Paste:=xlPasteValues)で止まってしまいます。何故か分からないです。 記載頂いたオートフィルターのほうで実施してみると空白が貼付けられるため、こちらは少し原因 調べてみて改めて結果ご報告させて頂きます。
RANDS_CHANP

2022/09/15 07:25

hatena19様 オートフィルターのほう、当方のセル番地がズレていただけで正常に貼付できました。有難うございます。 ただ、やはりシート上で使っている関数が重いのか、処理は15~20sec.くらいかかっています。 2つ目に記載頂いた   Worksheets("データベース").Cells(i, "B").Resize(, 17).Copy .Cells(N + 1, "C").Resize(, 17) .Value = Worksheets("データベース").Cells(i, "B").Resize(, 17).Value を比べてみたかったのですが、こちらが何故か止まってしまいます。
RANDS_CHANP

2022/09/15 08:30 編集

hatena19様 もし宜しければ、 Worksheets("データベース").Cells(i, "B").Resize(, 17).Copy .Cells(N + 1, "C").Resize(, 17) .Value = Worksheets("データベース").Cells(i, "B").Resize(, 17).Value のほう、構文エラーが出るので誤りをご教授頂けると幸いです。
hatena19

2022/09/15 08:57

タイプミスしてました。 .Cells(N + 1, "C") .PasteSpecial Paste:=xlPasteValues .PasteSpecial の前の半角スペースを削除してください。 .Cells(N + 1, "C").Resize(, 17) .Value = Worksheets("データベース").Cells(i, "B").Resize(, 17).Value .Value の前の半角スペースを削除してください。 回答の方は修正しておきました。
RANDS_CHANP

2022/09/15 09:22

hatena19様 有難うございます。無事確認できました。比較しましたところほぼ同じですが、仰るように 若干オートフィルターの方が速かったです。 私が元々作成していたオートフィルターの方法より7~8秒早くなりました。 日々使用していますので、速くなって嬉しいです。 早急なご連絡本当に有難うございました。
hatena19

2022/09/15 09:40

EXCELのバージョンはなんでしょうか。 スピルに対応しているバージョンなら、FILTER関数を使うと早くなるかもしれません。
vann_2921

2022/09/16 07:18

シート内の再計算が遅いのであればマクロの最初に自動計算をオフにして終わりに再計算をするともっと速くなると思います。少なくとも貼り付け秒単位かかるのは考えにくいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問