|
|
| Excel VBA Macro ・ コピー ・ FAQ |
|
コピー貼り付けのマクロが動かなくなったが?
|
|
|
|
Question 25.4 |
|
 |
 |
|
|
こんにちわ! マクロを作ってて、どうしても気になることがあるので質問させてください。
私は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))
以上でおわかりのことと思いますが、このケースの原因はExcelのバージョンの違いによるものではないようですね。
ご質問にある「他のメソッドでも、使えないケースが…」の回答としては、Excelのヘルプで検索して「隠しオブジェクト」の説明画面をまず表示させ、リンクをたどって進むと、
沢山の隠しメソッドを列挙した画面が表示されるはずですから、ゆっくり読んでください。
検索方法がわからなければ、VBAの標準モジュールのコード画面で「menu」と入力して選択しておいてから[f1]キーを押すと、表示されるはずです。
なお、シート間でコピー貼り付けするマクロのほかの書き方として、このホームページに
[コピー]−[1) すべてコピーする]−[クリップボードを経由せずにコピーして貼り付ける]があります。参考にしてください。
また、そのページには、PasteSpecialメソッドの使用例もいろいろ掲載してあります。そのメソッドを使った方が、すっきりした書き方が可能になるかと思います。
サンプルブックのダウンロードは ここをクリック
(YNxv994_CopyPaste.xls 85KB) ※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。
|
|
|
|
| |
|
|