アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルのマクロ初心者です。
いつもここで他の方のQ&Aを参考にしたり、自分で質問したりしてお世話になっています。

今回は、参照先のブックを開かずにその内容をコピーする方法についてお聞きしたいです。
現在、下記のようなマクロを組んでいます。

Workbooks.Open FileName:="BookA.xls"
Sheets("Sheet1").Activate
Range("B4:H4").Copy
Windows("BookB.xls").Activate
Sheets("Sheet2").Select
Range("B1").Select
Sheets("Sheet2").Paste
Workbooks("BookA").Close
Windows("BookB").Activate

つまり、BookAのセルの一部分をコピーしてBookBのセルに貼り付けるという内容なんですが、コピー参照先のBookAを一度開いてコピーしてからBookBに行って貼付け、さらにBookAを閉じた後でBookBに再び戻る、という動作になっているため、画面がパラパラと切り替わる時間があって少々うっとおしいのです。
BookAをいちいち開かずに内容をコピーする方法があると思うのですが、どのような構文を使えばいいでしょうか?
ご回答よろしくお願いします。

A 回答 (4件)

>画面がパラパラと切り替わる時間があって少々うっとおしいのです。


これだけならマクロの最初と最期で
Application.ScreenUpdating = False
処理
Application.ScreenUpdating = True
とすればいいのでは?
    • good
    • 3
この回答へのお礼

こんな簡単な一文でまとめられるものだったんですね!
大変参考になりました。
ありがとうございました。

お礼日時:2007/04/10 10:33

ANo.3です。


BookAは、開きます。
小生の環境では、スクリプトは問題なく働きます。
ステップ動作で、エラーになった場所、及び、エラーメッセージを
教えていただけませんか?

注:小生の示したスクリプトでは、"Sheet1"になっていました。
貴兄のサンプルでは、"Sheet2"でしたが・・・・・

この回答への補足

私がNo.3の意図を取り違えていたのですね…。
BookAもBookBも開いているというのが最初の設定でしたか。
ただ私は、BookB上で作業中にBookAを閉じたままその内容をコピーして来たかったんです。
説明不足ですみませんでした。
No.1の回答をくれた方の方法で、パーフェクトではないですが何とかなりそうなので応用してみます。
お手数おかけしました。ありがとうございました。

補足日時:2007/04/11 09:30
    • good
    • 0

下記のスクリプトを見ていただけますか。


2つのファイルは開いているのですが、表に出ているファイルは、BookBのままです。
裏に存在するBookAから、そっとコピーしてきて、表に見えているBooKAに貼り付けてくれます。

Sub test()
mydirectory = ThisWorkbook.Path
Workbooks.Open Filename:=mydirectory & "\" & "BookA.xls"
Workbooks.Open Filename:=mydirectory & "\" & "BookB.xls"
Workbooks("BookA.xls").Worksheets("Sheet1").Range("B4:H4").Copy Workbooks("BookB.xls").Worksheets("Sheet1").Range("B1")
Workbooks("BOOKA.XLS").Close SaveChanges:=False
End Sub

小生も、その昔は、すべてActive或いは、selectしてやっていました。
でも、上に示すような方法で、今では、activate、selectは、ほとんど使っていません。

ソートなんかも、下記のように書けば、裏でやってくれます。

Workbooks("BookA.xls").Worksheets("Sheet1").Range("A1:C20").Sort _
Key1:=Workbooks("BookA.xls").Worksheets("Sheet1").Columns("A"), _
Key2:=Workbooks("BookA.xls").Worksheets("Sheet1").Columns("B"), _
header:=xlYes

bookや、sheetを明示的に、示すことで、いちいち、selectすることは必要ないのです。
ここで、いちいち、Workbooks("BookA.xls").Worksheets("Sheet1").と書くのは
面倒だと言うことになります。そのためには、 withを使います。

With Workbooks("BookA.xls").Worksheets("Sheet1")
.Range("A1:C20").Sort _
Key1:=.Columns("A"), _
Key2:=.Columns("B"), _
header:=xlYes
end with

貴兄の目標に対し、上記は、きっと役に立つのではないかと考えました。
参考にしていただければ、幸いです。
    • good
    • 1
この回答へのお礼

ご丁寧な説明をありがとうございました。
ソートのやり方も、今後の参考になると思います。プラス@のご提案までありがとうございます。

ただ、教えていただいたものを応用してみてもエラーが出てうまく作動はしてくれませんでした…。
BookAもしっかり開いてしまいました…。

お礼日時:2007/04/10 11:02

将来も使える保証はありませんが


>参照先のブックを開かずに
が重要なら、MACRO4.0機能を用いてBookA.XLSを開かずにセルの値を取得することは可能です。

Sub Macro()
 Dim i as Integer
  For i = 2 To 8 'B列からH列まで繰り返し
   WorkSheets("Sheet2").Cells(2 , i).Value = ExecuteExcel4Macro ( _
    "'d:\Temp\[BookA.xls]Sheet1'! R4" & "C" & i )
  Next i
End Sub

ExecuteExcel4Macro内のセルはR1C1形式で指定する必要があります。
過去の質問や、Googleで検索すると色々なサンプルが見つかります。
    • good
    • 0
この回答へのお礼

MACRO4.0機能というのがよくわからず、今回この方法を採用するのは見送らせてもらいましたが、こういうやり方もあるというので参考になりました。
ありがとうございました。

お礼日時:2007/04/11 09:47

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

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


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