プロが教える店舗&オフィスのセキュリティ対策術

エクセルでマクロを組み始めたばかりの者です。下記のようなマクロを組んでみましたが、27行目もしくは41行目のActiveSheet.Pasteで「実行時エラー‘1004‘: 変更しようとしているセルまたはグラフは保護されているため読み取り専用となっています…」というエラーメッセージが出て止まってしまいます。

しようとしている内容は、転送ボタンを押し各シートの指定セルへ一括転送(コピー)をしたいのです。
その際、転送先はシート保護をしておきたいのです。

エラーはエクセル2010で確認しましたが、職場のPCを使用するため2007や2003等他のバージョンを利用する可能性もあります。また、仕事で使用するため早急に使わなければならず焦っています。

Option Explicit
Private Sub CommandButton2_Click()
Call Macro2
End Sub


Sub Macro2()
Workbook.Open Filename:=”K:¥共有¥○○○.xlsm”
ActiveSheet.Unprotect
ThisWorkbook.Activate
Range(”D4:G20”).Select
Selection.Copy
Windows(”○○○.xlsm”).Activate
Range(”E7”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False

Workbook.Open Filename:=”C:¥Users¥Desktop¥×××.xlsm”
ActiveSheet.Unprotect
ThisWorkbook.Activate
Range(”D4:G20”).Select
Selection.Copy
Windows(”×××.xlsm”).Activate
Sheet(”△△△”).Select
Range(”AF18:AI34”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False

Workbook.Open Filename:=”K:¥共有¥□□□.xlsm”
ActiveSheet.Unprotect
ThisWorkbook.Activate
Range(”D4:G20”).Select
Selection.Copy
Windows(”□□□.xlsm”).Activate
Sheet(”▽▽▽”).Select
Range(”AF18:AI34”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False

MsgBox " 『○○○』と" & vbCrLf & "『×××』と" & vbCrLf & "『□□□』の" & vbCrLf & "規格を変更しました。"

End Sub


どの様に修正すれば良いのでしょうか?
マクロが原因でしょうか?または他の原因があるのでしょうか?
マクロ初心者のため、修正方法など具体的な詳細をお教えいただけないでしょうか。
お手数をおかけして申し訳ございませんが、よろしくお願いします。

質問者からの補足コメント

  • ActiveSheet.Unprotect の位置を変えましたが、同じエラーメッセージが出ます。実行時エラー1004 が出る要因があれば、その対処方法を教えて頂けないでしょうか。よろしくお願いします。

      補足日時:2016/06/01 08:05

A 回答 (6件)

「Sheet(”△△△”).Select」や「Sheet(”▽▽▽”).Select」でシートを切り替えてしまっているので、この後で「ActiveSheet.Unprotect」を使わないとダメです。


なお「Workbook.Open Filename:=”C:¥Users¥Desktop¥×××.xlsm”」や「Workbook.Open Filename:=”K:¥共有¥□□□.xlsm”」の後の「ActiveSheet.Unprotect」のせいで、どこかのシートの保護が解除されたままになっているはずです。
    • good
    • 1
この回答へのお礼

ありがとうございます。
このような感じで大丈夫でしょうか?

Workbook.Open Filename:=”C:¥Users¥Desktop¥×××.xlsm”
ThisWorkbook.Activate
Range(”D4:G20”).Select
Selection.Copy
Windows(”×××.xlsm”).Activate
Sheet(”△△△”).Select
ActiveSheet.Unprotect
Range(”AF18:AI34”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False

助かりました。
明日早速確認します。
本当にありがとうございました。

お礼日時:2016/05/31 22:11

ActiveSheetを使うなら、その前で、Sheets(シート名).Activateすべきです。



何が問題か、理解できていますか?
    • good
    • 0

提示した部分がエラーするのは判っていますが、これ以前のコードがどうなっているかが問題なので全体を提示してください。

    • good
    • 0

こんにちは



直接の回答ではありませんが、なんだか同じ内容の質問を連発なさっているようですね。
(質問者様には違うつもりでも、一般化すると同じ質問に読めます)

>「変更しようとしているセルまたはグラフは保護されているため
>読み取り専用となっています…」
シートに保護がかかっているため、セル等への書き込みができないという意味のエラーです。

>その際、転送先はシート保護をしておきたいのです
残念ながら、シートの保護をかけたままの状態で、直接。値などの変更をすることはできません。
(できてしまうと、シートの保護の意味がなくなってしまうので)
これまでに多くの方が回答なさっているように、扱いたいシートの保護を一旦解除して、値の変更等を行い、その後再度シートの保護をかけることで、変更することが可能になります。
(これは手作業でも同じで、それをマクロの記録で記録することもできます)

手順は上記の通りなので、その通りにコーディングすれば良いだけなのですが、ANo2様もご指摘なさっていらっしゃるように、処理の対象(シート)がどれであるのかわかりにくいコードになっており、質問者様がきちんと区別なさっているのか疑問です。

すこし考え方を変えて以下のような方向を目指すのが、遠回りに思えるかもしれませんが、実は、近道になると思います。
ActiveWorkbook、ActiveSheetなどの使用はできるだけ避け(目標としては使わない)、さらには、Activate、Select、Selectionなども排除することで、マクロ実行中の画面のチラつきも抑制できますし、実行速度の向上も望めます。
代わりに、対象のブックやシートを変数に代入しておいて、各種の処理を行う際には、必ず対象のブックやシートを明示したコードにする。
なによりも、このような記述にしておくことで、ご質問のような事態を回避できるであろうことと、さらには、将来時間が経ってから読み直してもわかりやすいものになっていることが期待できます。
おまけとして、コード全体を少しコンパクトにできる可能性も高いです。
(例として、頻出する Application.CutCopyMode = False を削除できます。)
    • good
    • 0

今度のコードと、どこでエラーになったか?を提示してください

    • good
    • 1
この回答へのお礼

すんません。

同じ場所「ActiveSheet.Protect 」で
実行時エラー'1004':
WorkSheetクラスのPasteメゾッドが失敗しました。

とエラーメッセージが出ます。

お礼日時:2016/06/01 09:28

ActiveSheet.


これ使うのやめましょう。
あなたは今アクティブなシートがどれなのか分かってませんよね?
だから、こういうことが起きるんです。
ActiveSheet.やSelectionをなるべく使わずコードを記述した方がいいですよ?
もしくは、デバッグ方法を勉強しましょう。
    • good
    • 1

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