- ベストアンサー
「罫線を除く全ての貼り付け」をマクロ化したい
「罫線を除く全ての貼り付け」をマクロ化したいと思いマクロの記録をすると、 Selection.PasteSpecial Paste:=xlAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False のようなマクロができあがるのですが、これを実行すると RangeクラスのPasteSpecialメソッドが失敗しましたと出て実行できません。 どうも形式を選択して貼り付けが全てそのようになるようです。 原因と解決方法がわかる方いらっしゃったらお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Help を見ると、 PasteSpecial メソッド は、 Range オブジェクトの場合、指定された範囲にクリップボードのデータを貼り付けます。 とあります。 この場合(記録されたマクロ)はRangeオブジェクトのメソッドです。 『RangeクラスのPasteSpecialメソッドが失敗しました』とメッセージが出る理由としては、クリップボードに正しくコピーされていない可能性があります。(と思います) 質問ではマクロの一部しかわかりませんのでこれ以上は推測になりそうです。全文があれば理由がわかるかもしれません。 Range("D6:F12").Select Selection.Copy Range("G15").Select Selection.PasteSpecial Paste:=・・・・・・・・・・・ のように記述すればうまくいくと思います。 コピーして、貼り付け先を選択してPasteします。コピーしていない可能性が一番高いです。 しかし、質問にあるマクロ記録の Selection.PasteSpecial Paste:=xlAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False はマクロ記録の誤りです。(Excel2000では正しく記録できないようです) Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False と修正する必要があります。こう書けば、エラーが発生しないで値複写できます。 下も参考にして下さい。 [XL2000]マクロ記録でPasteSpecialの引数Pasteが正しく記録されない http://support.microsoft.com/default.aspx?scid=kb;ja;JP415379
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17070)
お礼の部分拝見しました。 ●(1)Sub test01() Selection.Copy End Sub (2)Sub test02() Selection.PasteSpecial Paste:=xlValue, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Sub だとうまく行きます。不思議です。 (1)の前に範囲指定すること。 また(2)の前にどこかセルを(1つまたは同形セル集合)指定すること。 ●(2)は Sub test02() ActiveCell.PasteSpecial Paste:=xlValue, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Sub でもうまく行く。 ●Sub test02() Range("g5").Select ActiveSheet.Paste End SubはOK ●Sub test02() Range("g5").Select Selection.Paste End SubはNO ●Sub test02() Range("g5").Select ActiveCell.Paste End SubはNO 済みません。もう少し考えます。
お礼
エラーが出る問題とうまくコピーできない問題がごっちゃになって混乱していました。質問の仕方も悪かったようですが、No.3の方の参考URLで解決できました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17070)
私も数年来コピーのVBAに付いては疑問を持っていて、今改めて考え ほぼ本問の回答になりそうなところへ来たと思います。 ただ一段の上の示唆を識者から期待したいですが、 本にも載っていなくて、Mougの大村あつしさんの本や WEBに載るかも知れない期待ぐらいで探しています。 下記はPasteSpecialでなくPasteの例にしましたが、PasteSpecialでも 同じと思います。 下記を実際にテストしてみて下さい。 (1)Sub Macro2() Selection.Copy End Sub Selectionに敢えてしたのは、範囲指定の一般性を持たせるためです。 前もって手動で範囲指定をして(1)を実行すると、範囲を囲んだ四角の点線ブリンク状態になります。 これはコピー操作と(編集-コピーをした直後と)同じ状態になります。 (クリップボードエリアに記憶されたのでしょう。) (2)Sub macro4() Selection.Paste End Sub コピー先のセルの先頭(または全域)を指定して、(2)を実行すると エラーになります。Selectionはこの場合Rangeオブジェクトに対しであると おもうが、RangeObjectに対してPasteできないわけです。 (3)Sub macro3() ActiveSheet.Paste End Sub それに対して、VBAの実行エラーをリセットして(A)コピー元の範囲指定をして(B)(1)を実行し (C)例えばG1をポイント(=Select)して(3)を実行すると うまく行きます。 (D)指定セルを変えて(3)を実行すると何度何箇所でも貼りつけ出来る。 (E)別シートのセルをポイントして指定して(3)を実行すると 別シートにも貼りつく。 (F)別ブックには出来ないし、別アプリには出来ないでしょう。Sheet といっているのだから。この場合はクリップボードからとってきて、貼りつける別コーディングが必要でしょう。 (結論) PasteメソッドはRangeオブジェクトには出来ない。 改めてある本のPasteメソッドの個所を見ると、対象となるオブジェクトはChart/Pictures/Point/series/seriescollection/dialogsheet/WorksheetオブジェクトとありRangeオブジェクトはない。 (疑問) しからばなぜにマクロ記録で Sub Macro1() Selection.Copy Range("g1").Select Selection.PasteSpecial Paste:=xlAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Sub と出て、Activesheetが出てこないのか、疑問は残る。 記録しただけで、再実行が出来ないのはおかしい。 今までにこういうのはVBAマクロ記録で初めて。 (対策) (一般性を持たせたい場合) ActiveSheetに持ちこむために、間にコピー先を手動で指定するステップが欲しいがコピーフェーズと貼りつけフェーズを別ボタンにしなければ ならないかもしれない。 (コピー先が決まっている時) Range("G1").Select ActiveSheet.Pasteのようにして、Sheetに対するメソッドに持ちこめばいい。
お礼
ご丁寧な回答ありがとうございます。 しかし、 ActiveSheet.Paste でも「WorkshetクラスのPasteメソッドが失敗しました」と出てしまいます。 何が悪いのでしょうか。 ちなみにバージョンはExcel2000です。
お礼
エラーが出る問題とうまくコピーできない問題がごっちゃになって混乱していました。質問の仕方も悪かったようですが、参考URLで解決できました。 ありがとうございました。