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

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

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

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

Q&A

解決済

1回答

17968閲覧

VBAページをアクティブにせずに異なるシートへコピペする方法を教えてください。

rickey

総合スコア24

VBA

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

0グッド

0クリップ

投稿2018/11/08 00:55

編集2018/11/08 00:56

エクセルVBAにおいて、シート5のA1~A2をシート6のB1~B2にコピペしたいときに、
ページをアクティブにせずにやる方法を探しています。

https://www.relief.jp/docs/excel-vba-cell-copy-paste-no-sheet-change.html
を参考に以下のコードを作成しました。

VBA

1Sub コピペ() 2' 1)シート5のA1~A2をシート6のB1~B2にコピペしたい 3 ThisWorkbook.Worksheets("5").Range("A1").Copy Destination:=ThisWorkbook.Worksheets("6").Range("B1") 4 ThisWorkbook.Worksheets("5").Range("A1:A2").Copy Destination:=ThisWorkbook.Worksheets("6").Range("B1:B2") 5 6'2)下の二つはエラーになる。 7 ThisWorkbook.Worksheets("5").Range(Columns(1), Columns(2)).Copy Destination:=ThisWorkbook.Worksheets("6").Range(Columns(3), Columns(4)) 8 ThisWorkbook.Worksheets("5").Range(Cells(1, 1), Cells(1, 2)).Copy Destination:=ThisWorkbook.Worksheets("6").Range(Cells(2, 1), Cells(2, 2)) 9 10 '2-1)ただし、同じシートへのコピペで、 11     シート5をアクティブな状態で実行したらエラーにはならない。 12 ThisWorkbook.Worksheets("5").Range(Columns(1), Columns(2)).Copy Destination:=ThisWorkbook.Worksheets("5").Range(Columns(3), Columns(4)) 13 ThisWorkbook.Worksheets("5").Range(Cells(1, 1), Cells(1, 2)).Copy Destination:=ThisWorkbook.Worksheets("5").Range(Cells(2, 1), Cells(2, 2)) 14End Sub

1)の方法でできたのですが、
以下のページにあるように、
Range("A" & i)と書くよりもCells(i,1)としたほうが、変数を用いるときに使いやすいので、
なんとか2)のようなCells(i,1)のやりかたで、アクティブにせずに他のシートにコピペする方法を
探しております。ご教授ください。よろしくお願い致します。

https://sugoikaizen.com/excelvba/column_80/

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

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

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

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

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

guest

回答1

0

ベストアンサー

ただ単にCellsと書くとアクティブシートが対象になってしまうので、ここで明示的にシートを指定してあげる必要があります。

VBA

1ThisWorkbook.Worksheets("5").Range(Cells(1, 1), Cells(1, 2)).Copy Destination:=ThisWorkbook.Worksheets("6").Range(ThisWorkbook.Worksheets("6").Cells(2, 1), ThisWorkbook.Worksheets("6").Cells(2, 2))

ただ、上記のように書くと長いし見づらいですよね。
そこでWithを使ったりシートをオブジェクト変数に入れたりするのが定番です。
このケースなら私はwithは使わないので、こう書きます。

VBA

1Set src = ThisWorkbook.Worksheets("5") 2Set dst = ThisWorkbook.Worksheets("6") 3src.Range(src.Cells(1, 1), src.Cells(1, 2)).Copy Destination:=dst.Range(dst.Cells(2, 1), dst.Cells(2, 2))

VBAではアクティブシートを前提にした作りは破綻しやすいので避けたほうがよいでしょう。
上記のようにシートをオブジェクト変数に入れておき、それを対象に処理することで解決できます。

投稿2018/11/08 01:03

ttyp03

総合スコア16996

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

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

rickey

2018/11/08 01:43

できました。このように指定するやり方をサイトを見ていても探せたことがなく、 こういうやりかたがあるんですうね。本当に感謝します。 過去に何度も同様に件で悩み、ページをアクティブにしてごまかして対応してました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問