激凹みから立ち直る方法

【質問】
以下のコードは、転記元ブックから転記先ブックへセルの値をコピー・貼付します

最初、Workbooks("転記元.xlsm").Activate の記述をしなかった場合エラーとなりました

追加後は動きました


ここで質問ですが


以下の記述の前にも Workbooks("転記先.xlsm").Activate を入れなくても

動くのでしょうか?(なぜ動くのでしょうか)
Workbooks("転記先.xlsm").Worksheets("Sheet1").Cells(1, 1).PasteSpecial xlPasteValues

という質問です

自分のイメージは以下のイメージなためです

●転記元ブック アクティブ
⇒転記元ブックのデータをコピー

●転記先ブック アクティブ・・・・・この記述がないと、マクロが転記先へ移動しないと思います
が実際は、移動して、貼付の実行をしてくれます

⇒転記先へデータを貼付


ご存じの方、ご指導お願いします

【コード動きます】
Sub 転記()

Dim lastrow As Long

lastrow = Workbooks("転記元.xlsm").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row



Workbooks("転記元.xlsm").Activate



Workbooks("転記元.xlsm").Worksheets("Sheet1").Range(Cells(1, 1), Cells(lastrow, 3)).Copy



Workbooks("転記先.xlsm").Worksheets("Sheet1").Cells(1, 1).PasteSpecial xlPasteValues



End Sub

A 回答 (4件)

こんばんは



エクセルの気持ち(?)になって考えてみましょう。

「A1セルの値を読んで」と言われても、シートが沢山あるとどのシートのA1セルのことなのかわかりません。
この場合は、エクセルはアクティブなシートのA1セルを読みに行きます。

同様に、複数のブックが開いているときに、
「シート1のA1セルを読んで」と言われても、どのブックかわからないので、アクティブなブックのシート1を読みに行きます。

一方で、
「ブックAのシート1のA1セルを読んで」と言われれば、曖昧なところはなくなるので、アクティブなブックやシートが何であっても、正しく「ブックAのシート1のA1セル」を読みに行きます。

それだけの話です。
    • good
    • 1
この回答へのお礼

ありがとうございます。複数ブックをいききするときは
ブックの指定必須ですね

お礼日時:2024/08/18 01:03

複数のブック、シート間を行き来する場合は、withを使ってブック、シートを指定すると簡単ですし、可読性もよくなります。

    • good
    • 0

>>Rangeの中でCellsを使う場合は、前もって.Activate記述が要ります。


vbaの仕様です。

Rangeの中でと言う事じゃ無いです。
この場合、たまたまそうなってるだけです。

RangeはWorkbooksとWorksheetsを明示して使ってるけど、Cellsは何も明示しないでイキナリCellsを使ってるからです。
    • good
    • 0

Workbooks("転記元.xlsm").Worksheets("Sheet1").Range(Cells(1, 1), Cells(lastrow, 3)).Copy



この記述が問題なのです。
Rangeの中のCellsは、ブック・シートを省略するとアクティブブック・シートの事になります。

転送先のSheet1がアクティブになっていたり、転記元の別シートがアクティブになってたとしたら、変な事になります。

なので、Rangeの中でCellsを使う場合は、前もって.Activate記述が要ります。

vbaの仕様です。

Activate記述をしたく無いなら、以下の様にCellsにブック・シートを指定したフル記述します

Workbooks("転記元.xlsm").Worksheets("Sheet1").Range(Workbooks("転記元.xlsm").Worksheets("Sheet1").Cells(1, 1), Workbooks("転記元.xlsm").Worksheets("Sheet1").Cells(lastrow, 3)).Copy
    • good
    • 2
この回答へのお礼

以下、勉強になりました。ご指摘ありがとうございます。

Rangeの中でCellsを使う場合は、前もって.Activate記述が要ります。
vbaの仕様です。

お礼日時:2024/08/18 01:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A