• ベストアンサー

EXCEL(VBA)でシート保護がかかったシートにクリックボードから貼り付けしたい

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 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

ThisWorkbook 等の自動実行イベントに Private Sub Workbook_Open() With Sheets("貼り付け先シート") .Unprotect '保護されたシートでマクロを実行するお呪い! .Protect UserInterfaceOnly:=True End With End Sub

tonaka
質問者

お礼

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

その他の回答 (4)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.5

>できれば1つのマクロで完結させたいのですが無理があるのでしょうか? 一つのマクロで完結させるなら、処理開始前に保護解除をして、処理の終了時点で保護をする事になります。 いままでのプログラムの中の、保護解除や保護のタイミングを変えるだけで済みます。 ThisWorkbookモジュールではなくて、同じモジュールの中に別のプロシージャを書く方法もあります。 Auto_Open() この場合、別のブックから呼び出された場合、実行されないので、そのような使い方がされる場合には適していません。 http://www.relief.jp/itnote/archives/001502.php

tonaka
質問者

お礼

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

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.4

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

tonaka
質問者

お礼

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

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

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

tonaka
質問者

補足

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

noname#123709
noname#123709
回答No.1

このやり方ではダメですか? 「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

tonaka
質問者

お礼

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

tonaka
質問者

補足

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

関連するQ&A