これまでで一番「情けなかったとき」はいつですか?

EXCEL2000のVBAで、クリップボードにコピーしたデータ(複数のセル範囲)を、シート保護がかかった別のシートにコピーする操作を行ないたいと考えています。
手順としては「1.クリップボードにコピー」→「2.シート保護解除」→「3.貼り付け」→「4.シート保護」なのですが、下記マクロを作成して試してみたところ、2.のシート保護解除を行なった時点でクリップボードが空になるようで、「実行時エラー'1004':RangeクラスのPasteSpecialメソッドが失敗しました。」と表示され貼り付けができません。
これについて何か回避策はないでしょうか?

Range("A1:C3").Select
Selection.Copy
Sheets("貼り付け先シート").Select
ActiveSheet.Unprotect
Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

以上、よろしくお願いします。

A 回答 (5件)

ThisWorkbook 等の自動実行イベントに



Private Sub Workbook_Open()

With Sheets("貼り付け先シート")
.Unprotect
'保護されたシートでマクロを実行するお呪い!
.Protect UserInterfaceOnly:=True
End With

End Sub
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。
教えて頂いた方法を試したところ、クリップボードからデータを貼り付けることが出来ました!
この方法の場合、マクロが「標準モジュール」と「ThisWorkbook」の2箇所に分かれるため、できれば1つのマクロで完結させたいのですが無理があるのでしょうか?

お礼日時:2006/03/02 13:39

>できれば1つのマクロで完結させたいのですが無理があるのでしょうか?



一つのマクロで完結させるなら、処理開始前に保護解除をして、処理の終了時点で保護をする事になります。
いままでのプログラムの中の、保護解除や保護のタイミングを変えるだけで済みます。


ThisWorkbookモジュールではなくて、同じモジュールの中に別のプロシージャを書く方法もあります。
Auto_Open()
この場合、別のブックから呼び出された場合、実行されないので、そのような使い方がされる場合には適していません。

http://www.relief.jp/itnote/archives/001502.php
    • good
    • 0
この回答へのお礼

ありがとうございました。
マクロを一つにまとめる件、今日のところはうまくできなかったのですが、いくつかやり方を変えて試してみたいと思います。

お礼日時:2006/03/03 01:16

#2です。


クリップボードのデータ取得は
Dim CB As New DataObject
Dim Dt As String
With CB
.GetFromClipboard
Dt = .GetText
End With
でできます。
が、#3さんの方法がよさそうですね。
    • good
    • 0
この回答へのお礼

ありがとうございました。
#3さんの方法を使わせて頂きたいと思いますが、
クリップボードのデータ取得の方法、勉強になりました。

お礼日時:2006/03/03 01:15

変数に退避しておけばいいのでは?

この回答への補足

アドバイスいただきありがとうございます。
EXCEL VBAのヘルプも見たのですが、クリップボードの内容を変数に退避する方法が分かりません。よろしければ教えていただけないでしょうか?

補足日時:2006/03/02 13:09
    • good
    • 0

このやり方ではダメですか?


「1.シート保護解除」→「2.クリップボードにコピー」→「3.貼り付け」→「4.シート保護」
Sub test()
Sheets("貼り付け先シート").Unprotect
Range("A1:C3").Copy
Sheets("貼り付け先シート").Range("A1").PasteSpecial Paste:=xlValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheets("貼り付け先シート").Protect
End Sub

この回答への補足

ご返答いただきありがとうございます。
きちんとご説明できていなかったのですが、コピー元セル範囲は決まっておらず利用者が指定する必要があるため、マクロの中でRange("A1:C3").Copyといった定型的な指定が出来ないのです。
今のところ、シート保護と貼り付けを別々のマクロにする位しか回避策が思いつきません。

補足日時:2006/03/02 13:06
    • good
    • 0
この回答へのお礼

ありがとうございました。
定型的な処理であればご教示いただいた内容で対応できますので、別の機会に使わせて頂きたいと思います。

お礼日時:2006/03/03 01:18

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

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


おすすめ情報

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