コピー貼り付けのマクロが動かなくなったが?

Question 25.4 Previous Next
こんにちわ! マクロを作ってて、どうしても気になることがあるので質問させてください。
私はExcel95→Excel97に変更してマクロを作っていますが、下のマクロで
Sub まくろ95()
10  Sheets("sheet1").Range(Cells(1, 5), Cells(1, 7)).Copy
20  Sheets("sheet2").Range(Cells(1, 5), Cells(1, 7)).Paste
End Sub
Excel95ではうまく出来たのですが、Excel97だと動かないのです。対策として、
Sub まくろ97()
30  Sheets("sheet1").Select
40  Range(Cells(1, 5), Cells(1, 7)).Select
50  Selection.Copy
60 '
70  Sheets("sheet2").Select
80  Range(Cells(1, 5), Cells(1, 7)).Select
90  Selection.Paste
End Sub
としましたが、Excel97だとSelectで指定しないと Copy/Paste は使えないのですか? 他のメソッドでも、使えないケースが ありますか? お忙しいところ申し訳ありませんが、大変気になるのでよろしくお願いします。
Answer   Copyright (C) 2000.2.24 永井善王
質問の「まくろ95」を Excel95と、Excel2000で試してみました。(97の環境が使えなかったため)
その結果を一覧表にまとめておきましたので、これを見ながら原因を考えてみましょう。
行目 sheets1が非アクティブ状態で sheets1をアクティブにしてから
Excel 95 でテスト Excel 2000 でテスト Excel 95 でテスト Excel 2000 でテスト
10 エラー1004:W エラー1004:A
20 エラー1004:W エラー1004:A
上表の「エラー1004:W」とは、Excel95の「実行時エラー'1004':WorksheetクラスのRangeメソッドが失敗しました」のことです。
また、「エラー1004:A」とは、Excel2000の「実行時エラー'1004':アプリケーション定義またはオブジェクト定義のエラーです」のことです。
Excelのバージョンによってエラーメッセージの表現は異なりますが、マクロの10行目でエラーが出るときは、sheets1が非アクティブである点は共通です。
そこで、sheets1をアクティプにしておいてから、マクロを実行してみました。すると、10行目は無事に実行されて、20行目でエラーが出ます。 20行目のマクロも、sheets2がアクティブになっていないとエラーになるようです。
20行目の直前に sheets2をアクティブにするマクロを挿入してみます。
18  Worksheets("sheet2").Activate
再び sheets1をアクティブにしておいてから、修正したマクロを実行した結果が下表です。
行目 sheets1がアクティブの状態で
Excel 95 でテスト Excel 2000 でテスト
10
20
90 エラー1001:R エラー438:A
上表のExcel95の「エラー1001:R」とは、「実行時エラー'1001':RangeにはPasteメソッドはありません」のことで、 Excel2000の「エラー438:A」とは、「実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません」のことです。 "一難去ってまた一難"と言いましょうか、90行目にも不具合があるようです。

貼り付けるマクロを自動記録すると、
ActiveSheet.Paste と記録されるので、 「ActiveSheet」の部分を 「Sheets("sheet2").Range("E1:G1")」のような表現に置き換えたくなりがちですが、それは間違いです。
Rangeメソッドは、クリップボードの内容をシートに貼り付けてくれますが、このメソッドを使う前に貼り付け先のセル範囲を選択しておくか、または、下記のように記述します。
20  ActiveSheet.Paste Destination:=Range(Cells(1, 5), Cells(1, 7))
school 以上でおわかりのことと思いますが、このケースの原因はExcelのバージョンの違いによるものではないようですね。
ご質問にある「他のメソッドでも、使えないケースが…」の回答としては、Excelのヘルプで検索して「隠しオブジェクト」の説明画面をまず表示させ、リンクをたどって進むと、 沢山の隠しメソッドを列挙した画面が表示されるはずですから、ゆっくり読んでください。 検索方法がわからなければ、VBAの標準モジュールのコード画面で「menu」と入力して選択しておいてから[f1]キーを押すと、表示されるはずです。

なお、シート間でコピー貼り付けするマクロのほかの書き方として、このホームページに
[コピー]-[1) すべてコピーする]-[クリップボードを経由せずにコピーして貼り付ける]があります。参考にしてください。
また、そのページには、PasteSpecialメソッドの使用例もいろいろ掲載してあります。そのメソッドを使った方が、すっきりした書き方が可能になるかと思います。

サンプルブックのダウンロードは ここをクリック (YNxv994_CopyPaste.xls 85KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

Excel VBA Macro