エクセルでマクロを組み始めたばかりの者です。下記のようなマクロを組んでみましたが、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
どの様に修正すれば良いのでしょうか?
マクロが原因でしょうか?または他の原因があるのでしょうか?
マクロ初心者のため、修正方法など具体的な詳細をお教えいただけないでしょうか。
お手数をおかけして申し訳ございませんが、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
「Sheet(”△△△”).Select」や「Sheet(”▽▽▽”).Select」でシートを切り替えてしまっているので、この後で「ActiveSheet.Unprotect」を使わないとダメです。
なお「Workbook.Open Filename:=”C:¥Users¥Desktop¥×××.xlsm”」や「Workbook.Open Filename:=”K:¥共有¥□□□.xlsm”」の後の「ActiveSheet.Unprotect」のせいで、どこかのシートの保護が解除されたままになっているはずです。
ありがとうございます。
このような感じで大丈夫でしょうか?
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
助かりました。
明日早速確認します。
本当にありがとうございました。
No.4
- 回答日時:
こんにちは
直接の回答ではありませんが、なんだか同じ内容の質問を連発なさっているようですね。
(質問者様には違うつもりでも、一般化すると同じ質問に読めます)
>「変更しようとしているセルまたはグラフは保護されているため
>読み取り専用となっています…」
シートに保護がかかっているため、セル等への書き込みができないという意味のエラーです。
>その際、転送先はシート保護をしておきたいのです
残念ながら、シートの保護をかけたままの状態で、直接。値などの変更をすることはできません。
(できてしまうと、シートの保護の意味がなくなってしまうので)
これまでに多くの方が回答なさっているように、扱いたいシートの保護を一旦解除して、値の変更等を行い、その後再度シートの保護をかけることで、変更することが可能になります。
(これは手作業でも同じで、それをマクロの記録で記録することもできます)
手順は上記の通りなので、その通りにコーディングすれば良いだけなのですが、ANo2様もご指摘なさっていらっしゃるように、処理の対象(シート)がどれであるのかわかりにくいコードになっており、質問者様がきちんと区別なさっているのか疑問です。
すこし考え方を変えて以下のような方向を目指すのが、遠回りに思えるかもしれませんが、実は、近道になると思います。
ActiveWorkbook、ActiveSheetなどの使用はできるだけ避け(目標としては使わない)、さらには、Activate、Select、Selectionなども排除することで、マクロ実行中の画面のチラつきも抑制できますし、実行速度の向上も望めます。
代わりに、対象のブックやシートを変数に代入しておいて、各種の処理を行う際には、必ず対象のブックやシートを明示したコードにする。
なによりも、このような記述にしておくことで、ご質問のような事態を回避できるであろうことと、さらには、将来時間が経ってから読み直してもわかりやすいものになっていることが期待できます。
おまけとして、コード全体を少しコンパクトにできる可能性も高いです。
(例として、頻出する Application.CutCopyMode = False を削除できます。)
No.2
- 回答日時:
ActiveSheet.
これ使うのやめましょう。
あなたは今アクティブなシートがどれなのか分かってませんよね?
だから、こういうことが起きるんです。
ActiveSheet.やSelectionをなるべく使わずコードを記述した方がいいですよ?
もしくは、デバッグ方法を勉強しましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/01/27 13:15
- Visual Basic(VBA) ワイルドカード「*」を使うとうまくいかないマクロの添削をお願いします 3 2022/03/26 09:39
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/03/28 14:52
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
XL:BeforeDoubleClickが動かない
-
セルの値によって、シート見出...
-
【ExcelVBA】全シートのセルの...
-
【VBA】色のついたシート名を取得
-
エクセルのシート名変更で重複...
-
ブック名、シート名を他のモジ...
-
ExcelVBA シート名を複数セルか...
-
VBAでオブジェクト変数にsetし...
-
Worksheet_Changeの内容を標準...
-
同じ作業を複数のシートに実行...
-
VBAの天才来てください
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
別のシートを参照して計算する方法
-
【VBA】指定した検索条件に一致...
-
ExcelのVBAのマクロで他のシー...
-
【Excel VBA】Worksheets().Act...
-
excelのマクロで該当処理できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
同じ作業を複数のシートに実行...
-
ExcelVBA シート名を複数セルか...
-
【ExcelVBA】全シートのセルの...
-
Excel マクロについての相談
-
VBA 存在しないシートを選...
-
実行時エラー'1004': WorkSheet...
-
特定の文字を含むシートだけマ...
-
ExcelのVBAのマクロで他のシー...
-
ブック名、シート名を他のモジ...
-
XL:BeforeDoubleClickが動かない
-
VBA 複数の各シートに行を追加...
-
エクセルのシート名変更で重複...
-
【Excel VBA】Worksheets().Act...
-
シートが保護されている状態で...
-
Excel VBA 複数行を数の分だけ...
-
for 文の 繰り返し処理に使える...
おすすめ情報
ActiveSheet.Unprotect の位置を変えましたが、同じエラーメッセージが出ます。実行時エラー1004 が出る要因があれば、その対処方法を教えて頂けないでしょうか。よろしくお願いします。