標記のとおりの質問です。
あるブックAからブックBをOpenし、
UserInterfaceOnlyでロックしたものを編集しようとするのですが、
その際に
実行時エラー '1004':
変更しようとしているセルは保護されているため、読み取り専用となっています。
とのエラーが出てしまいます。
これはブックBで単独で実行するときには出ない症状です。
他ブックから開かれたブックはUserInterfaceOnlyが作用していないのでしょうか。
因みに、B.Closeを実行した中でのWorkbook_BeforeClose関数内での動作です。
どなたかご教示ください。よろしくお願いいたします。
No.1
- 回答日時:
共有ファイルなどでもそうですが、ファイル(ブック)が開いている際は、データの整合性をとるために排他ロック(トランザクション)がかかった状態となります。
「データの整合性」には、ファイル内部の設定も一式が含まれますので、その状況でprotectをかけることはできません。(っというか、設定を変更する処理は落ちます。)
今回の場合は、複数で開かれていないのであれば、A→Bの処理が「多重窓」と捉えられているのかもしれません。
ただ
UserInterfaceOnly = True
これは通ると思いますけどねぇ・・^^;
この回答への補足
>UserInterfaceOnly = True
>これは通ると思いますけどねぇ・・^^;
ですよね・・・
いわゆるトランザクション処理とも違うので、まさかとは思ったのですが。
仕様として諦めたほうがいいんでしょうか。。
No.3
- 回答日時:
>因みに、B.Closeを実行した中でのWorkbook_BeforeClose関数内での動作です。
ちょっとよくわからないんですが、
ブックBのWorkbook_BeforeCloseイベント内で.Protect userinterfaceonly:=True を発行しているという意味ですか?
もしそうなら、他マクロ実行で走ったWorkbook_BeforeCloseイベント内では Protectメソッド やUnprotectメソッドが効きません。
イベントプロシージャの場合、この『他マクロから呼び出される時』うまくいかない事例が多いです。
イベント自体は発生し、エラーなくコードも通るが、ある種のステートメントが無視される...といった感じです。
『メニュー コマンドが、BeforeSave イベントで動作しないプログラムで Excel でブックを保存と』
http://support.microsoft.com/kb/898511/ja
『XL2000: プログラムの優先 Workbook_Activate イベントが起動しません。』
http://support.microsoft.com/kb/294810/ja
普通はClose時にProtect userinterfaceonly:=Trueを発行する事はないんじゃないかと思いますが
仕様上、必要なんでしょうか。(ブックBのWorkbook_Openイベントではダメなのか)
どうしても今のままの仕様であれば、姑息な方法ですが ブックBを閉じるマクロを
Workbooks("ブックB.xls").Activate
Application.CommandBars.FindControl(ID:=106).accDoDefaultAction
などとして手動操作をエミュレートするようなマクロを実行すれば、
出来なくもない...といった所でしょうか。
あるいはブックBを閉じるマクロ内でProtect userinterfaceonly:=True を発行するとか。
もし、.Protect userinterfaceonly:=True がブックBのAuto_Openプロシージャに書かれている事が原因だったら
ブックBを開いた時に
.RunAutoMacros xlAutoOpen
RunAutoMacrosメソッドを実行するか、Workbook_Openイベントに書き換えれば良いです。
この回答への補足
ご回答ありがとうございます。
>ブックBのWorkbook_BeforeCloseイベント内で.Protect userinterfaceonly:=True を発行しているという意味ですか?
その通りです。その場合は効かないんですね・・・
>普通はClose時にProtect userinterfaceonly:=Trueを発行する事はないんじゃないかと思いますが
>仕様上、必要なんでしょうか。(ブックBのWorkbook_Openイベントではダメなのか)
・手動でシートを解除することがある
・ブックB単独で使うことがある
という条件から、このような仕様になっています。
>あるいはブックBを閉じるマクロ内でProtect userinterfaceonly:=True を発行するとか。
この方法が理想的なんですが、前述の条件があるのでちょっと複雑になりそうですね。。(検討の余地はあります)
提示していただいた他の方法でも試してみようと思います。
No.4
- 回答日時:
こんにちは。
何か、思い違いがあるのではありませんか?
>Workbook_BeforeCloseイベント内で.Protect userinterfaceonly:=True
これは意味ありません。Close の前に、UserInterFaceOnly したところで、その後に、作業するならわかるけれども、終了したら、UserInterFaceOnlyのモードは残りません。
>あるブックAからブックBをOpenし、
>UserInterfaceOnlyでロックしたものを編集しようとするのですが、
だったら、一旦、Book の該当シートをUnProtect してから、Protect , UserInterfaceOnlyにしなければなりません。
No.5
- 回答日時:
>・手動でシートを解除することがある
>・ブックB単独で使うことがある
>という条件から、このような仕様になっています。
この条件『のみ』ですか?
私が想像したのは『ブックBは作業中、常にProtect userinterfaceonly:=False でマクロによる変更も許さない』
という仕様なのかな、という事でした。
そうではなく、ユーザー操作による変更のみ制限したいなら
ブックBは
'ThisWorkbookModule
Option Explicit
Private Sub Workbook_Open()
Sheets(1).Protect userinterfaceonly:=True
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'終了前処理
Sheets(1).Cells(1).Value = Now() '例
End Sub
これで良い訳です。
ついでですが
>>あるいはブックBを閉じるマクロ内でProtect userinterfaceonly:=True を発行するとか。
>この方法が理想的なんですが、前述の条件があるのでちょっと複雑になりそうですね。。(検討の余地はあります)
ブックBのWorkbook_BeforeCloseイベントはそのまま
他ブックのマクロで
Sub test()
With Workbooks("ブックB.xls")
.Sheets(1).Protect userinterfaceonly:=True '■
.Close
End With
End Sub
とするだけです。
この回答への補足
確かにとても良い方法なのですが、
セキュリティ上どんなときでも他者に対してプロテクトが外れないようにしたいのです。
ブックAは管理者のみが実行でき、ブックBは特定の部署だけで使います。
(ブックBは各部署に対して存在します(B1,B2,B3,...))
ただし、ブックAは管理者しかアクセスできないのに対し、ブックBは全ての部署がアクセス可能です。
Workbook_Openのみだと、ブックB単独で使った場合
正規ユーザ:手動解除→保存→終了 のあとに
非正規ユーザ:ファイルを開く→マクロを実行しない
とするとプロテクトが外れたままなのがネックとなります。
本当に鋭い指摘で舌を巻くばかりです。
後出しが良くないのは解っているつもりなのですが、
ここまで話がこじれるとは思わなかったもので・・・
懇切に教えていただいているのに、大変すみません。
No.6
- 回答日時:
#5 の回答者です。
内容にミスがありました。
×だったら、一旦、Book の該当シートをUnProtect してから、Protect , UserInterfaceOnlyにしなければなりません。
O>だったら、ThisWorkbook.Open イベントで、再度、該当シートを、Protect , UserInterfaceOnlyにしなければなりません。
Excel VBAのヘルプより
「引数 UserInterfaceOnly に True を設定した Protect メソッドをブックのワークシートに適用した場合、保存して閉じた後でもう一度開いたブックに対しては、画面上からもマクロからも変更ができなくなります。」
ただし、Excel 2007 の保護の設定内容によっては、挙動の違うものが存在します。
この回答への補足
ご回答ありがとうございます。
下記と併せて回答致します。
>Close の前に、UserInterFaceOnly したところで、その後に、作業するならわかるけれども、終了したら、UserInterFaceOnlyのモードは残りません。
諸所で行う一連のProtect作業を関数化しているため、UserInterfaceOnlyが入っているだけです。
意味はありませんが、ユーザに対するProtectの効果は残るのでそのままにしています。
紛らわしくてすみません。
>>あるブックAからブックBをOpenし、
>>UserInterfaceOnlyでロックしたものを編集しようとするのですが、
>だったら、ThisWorkbook.Open イベントで、再度、該当シートを、Protect , UserInterfaceOnlyにしなければなりません。
それは行っています。
UserInterfaceOnlyの特性についても承知しております。
その部分ではエラーも出ていませんし、
今回の問題はブックAから実行した場合にのみ起こります。
編集という言い方がまずかったと思いますが、これはマクロから行っています。
Excelのバージョンは2003なので挙動に関しては想定内のはずです。
No.8
- 回答日時:
>正規ユーザ:手動解除→保存→終了 のあとに
>非正規ユーザ:ファイルを開く→マクロを実行しない
>とするとプロテクトが外れたままなのがネックとなります。
『非正規ユーザ:ファイルを開く→マクロを実行しない』これは、マクロ無効で開くという意味ですね?
正規ユーザーがマクロ無効で開くという想定は必要ないという事ですかね。
正規ユーザー:マクロ無効で開く→手動解除→保存→終了
この場合、Workbook_BeforeCloseイベントのみでは不十分なのは同じ事です。
正規|非正規ユーザーが混在し、不特定多数のユーザーにマクロブックを公開する場合、マクロ無効で開く事の対策は当然必要です。
http://homepage2.nifty.com/kmado/kvba.htm
E00M090[マクロを無効にする]で開くと使えないxlsファイル
(ここ参考にしてみてください)
ただ、そこまでやるならuserinterfaceonly:=Trueは選択肢としては有り得ないはず。
ちょっとしたマクロができるユーザーなら書き込みができてしまうという事ですから。
必要に応じてマクロ内にUnprotect/Protectを記述すれば良いのではないですか?
いずれにしてもWorkbook_BeforeSaveイベントにもProtectメソッドを記述しておけば済む話のような気がしないでもないですが。
'ThisWorkbookModule
Option Explicit
Private Sub Workbook_Open()
Sheets(1).Protect 'userinterfaceonly:=True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets(1).Protect 'userinterfaceonly:=True
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets(1).Unprotect
'終了前処理
Sheets(1).Cells(1).Value = Now()
ThisWorkbook.Save
End Sub
#BeforeCloseイベント内で保護シートの内容を書き換えるという事は、その後にSaveメソッドで保存しているはず。
上記は C:\Bbook.xlsに置いて他のテスト用ブックの標準Moduleに
Option Explicit
Sub Bopen()
Workbooks.Open Filename:="C:\Bbook.xls"
End Sub
Sub Bclose()
With Workbooks("Bbook.xls")
.Sheets(1).Unprotect
.Close True
End With
End Sub
>#BeforeCloseイベント内で保護シートの内容を書き換えるという事は、その後にSaveメソッドで保存しているはず。
この推測が外れてたらゴメンなさい。
どんな場合であっても必ず保存するという仕様は無いような気もしてるので。
No.9
- 回答日時:
ぅあ、全然ダメだ。
ゴメンなさい。Bclose→Workbook_BeforeCloseだとWorkbook_BeforeSaveが走らない...orz
【C:\Bbook.xls】
'ThisWorkbookModule
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets(1).Protect
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call BeforeClose
End Sub
'標準Module
Option Explicit
Sub BeforeClose()
With Sheets(1)
.Unprotect
.Cells(1).Value = Now()
.Protect
End With
ThisWorkbook.Save
End Sub
【他のテスト用ブック】
'標準Module
Sub Bclose()
With Application
.Run "Bbook.xls!BeforeClose"
.EnableEvents = False
Workbooks("Bbook.xls").Close
.EnableEvents = True
End With
End Sub
結局、最初の
Workbooks("Bbook.xls").Activate
Application.CommandBars.FindControl(ID:=106).accDoDefaultAction
の方がまだましかも。
No.10
- 回答日時:
何度もすみません。
>'標準Module
>Option Explicit
>Sub BeforeClose()
> With Sheets(1)
> .Unprotect
> .Cells(1).Value = Now()
> .Protect
> End With
> ThisWorkbook.Save
>End Sub
'標準Module
Option Explicit
Sub BeforeClose()
With ThisWorkbook
With .Sheets(1)
.Unprotect
.Cells(1).Value = Now()
.Protect
End With
.Save
End With
End Sub
初歩的なミスです。
#どうにもいけませんな...またしばらく修行のタビに出ます...
#失礼しました XD
この回答への補足
遅くなってすみません。
出張等が重なったこともあり、まだend-uさんの各種の提案について検討しきれておりません。
明日(9/7)は時間が取れそうなので、試してみたいと思います。
>http://homepage2.nifty.com/kmado/kvba.htm
>E00M090[マクロを無効にする]で開くと使えないxlsファイル
>(ここ参考にしてみてください)
こんな方法があったんですね。。
もっとよく調べておけばよかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) excelvbaのenableeventsについて 3 2022/08/30 11:20
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/09 12:17
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
ActiveSheet.Protect UserInterfaceOnly:=Trueの書き場所は
Excel(エクセル)
-
【エクセルVBA】「Protect UserInterfaceOnly」を2重にかけてはダメですか?
Visual Basic(VBA)
-
エクセルVBAでブック保護のUserInterfaceOnly:=Trueはダメ?
Excel(エクセル)
-
-
4
EXCEL 一部のオブジェクトだけを固定したい
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
Excel VBA で、マクロを実行するためのパスワード設定方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで保存しないで閉じると空の...
-
マクロの保存先、開いてるすべ...
-
【Excel VBA】マクロでExcel自...
-
エクセル関数>参照ファイル名...
-
複数のExcelブックを1つ...
-
excel VBA シート保存について...
-
エクセル;相対パスを絶対パスへ...
-
ファイルごとにセルの移動方向...
-
【Excel】特定セルの内容をテキ...
-
エクセルVBAで作成した別ブック...
-
【Excel】マクロの保存先について
-
Excel VBAで他のブックを選択...
-
マクロ 自動でパスワード及び指...
-
エクセルでメッセージボックス...
-
エクセルで読み取り専用の時に...
-
ブックを開いたとき自動的にバ...
-
エクセルで複数のファイル(ブッ...
-
エクセル 半角カナを全角に、...
-
エクセルマクロで(セルの削除...
-
名前の変わるブックをアクティ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで保存しないで閉じると空の...
-
エクセル関数>参照ファイル名...
-
【Excel VBA】マクロでExcel自...
-
エクセル;相対パスを絶対パスへ...
-
マクロの保存先、開いてるすべ...
-
【Excel】マクロの保存先について
-
excelで直前に参照していたブッ...
-
EXcelのマクロで相対パスでファ...
-
エクセルVBAで作成した別ブック...
-
複数のExcelファイルの印刷設定...
-
エクセルのvbaにて thisworkboo...
-
EXCELのボタンによるマクロの登...
-
エクセルVBA 個人用マクロブッ...
-
EXCELマクロで、開いてはいるが...
-
EXCELブックが勝手に開いて困っ...
-
エクセルで未保存に対するメッ...
-
[フィルターオプションの設定]...
-
【Excel】特定セルの内容をテキ...
-
ファイル名変更後も、マクロを...
-
名前の変わるブックをアクティ...
おすすめ情報