• ベストアンサー

【Excel】他ブックからOpenされたブックはUserInterfaceOnlyが効かない?

標記のとおりの質問です。 あるブックAからブックBをOpenし、 UserInterfaceOnlyでロックしたものを編集しようとするのですが、 その際に 実行時エラー '1004': 変更しようとしているセルは保護されているため、読み取り専用となっています。 とのエラーが出てしまいます。 これはブックBで単独で実行するときには出ない症状です。 他ブックから開かれたブックはUserInterfaceOnlyが作用していないのでしょうか。 因みに、B.Closeを実行した中でのWorkbook_BeforeClose関数内での動作です。 どなたかご教示ください。よろしくお願いいたします。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.12

再現性? 【Q】 '"C:\TestBook_B.xls"ThisWorkbookModule Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)   On Error GoTo errHndlr   With ThisWorkbook.Sheets(1)     .Protect UserInterfaceOnly:=True     .Range("A1").Value = Time   End With errHndlr:   With Err     If .Number = 0 Then       MsgBox "ok"     Else       MsgBox .Number & vbTab & .Description       Debug.Print .Number & vbTab & .Description     End If   End With End Sub A)上記コード単独で実行=TestBook_B.xlsを手作業で閉じる。エラーは発生せず。 B)下記のコードを他Bookより実行=他マクロからTestBook_B.xlsのWorkbook_BeforeCloseが呼ばれる。エラー発生。 Sub Macro1()   Workbooks.Open(Filename:="C:\TestBook_B.xls").Close End Sub  ▼ 【A】#3 (B)のエラー発生原因は#3にてアドバイス済み。 対策も#3にて3点アドバイス済み。 C)TestBook_B.xlsのWorkbook_Openイベントで.Protect UserInterfaceOnly:=True を実行するように変更ではダメなのか。 D)他BookからTestBook_B.xlsを閉じるマクロを、手動操作をエミュレートするようなマクロに変更してはどうか。 E)他BookからTestBook_B.xlsを閉じるマクロで、Protect UserInterfaceOnly:=True を実行するようにしてはどうか。  ▼ 【Q】#3 (C)に対しては >・手動でシートを解除することがある >・ブックB単独で使うことがある >という条件から、このような仕様になっています。  ▼ 【A】#5 それだけの理由ならという条件付で、Private Sub Workbook_Open()コードを提案。 (ついでに(E)の具体例も)  ▼ 【Q】#5 >正規ユーザ:手動解除→保存→終了 のあとに >非正規ユーザ:ファイルを開く→マクロを実行しない >とするとプロテクトが外れたままなのがネックとなります。  ▼ 【A】#8 『非正規ユーザ:ファイルを開く→マクロを実行しない』これは、マクロ無効で開くという意味ですね? 不特定多数のユーザーにマクロブックを公開する場合、マクロ無効対策も必要。 さらにUserInterfaceOnly:=TrueでのProtectは避けたほうが良いのでは。  ▼  ▼  ▼ という事でUserInterfaceOnly:=Trueを省くコードを提案。(間違っちゃいましたけどね) 結局、 >ただ、そこまでやるならuserinterfaceonly:=Trueは選択肢としては有り得ないはず。 これは私の勘違いです。撤回します。 通常の運用の時はProtect UserInterfaceOnly:=False状態である。 Workbook_BeforeCloseイベント内のコードが走る時だけUserInterfaceOnly:=Trueにすれば良い。 ...ですよね。 他マクロからTestBook_B.xlsのWorkbook_BeforeCloseが呼ばれる時はProtectメソッドが効かないので >E)他BookからTestBook_B.xlsを閉じるマクロで、Protect UserInterfaceOnly:=True を実行するようにしてはどうか。 のセンで。(Workbook_BeforeSaveイベントでのProtectも必要でしょうけど) あるいはWendy02さんのSub MacroTest_A()、Open時にUserInterfaceonly:=Trueでも。 >このエラー・メッセージが正確なものかはわかりませんが、ご質問者さんのコードもみないで、回答者が一方的な想像で、空回りしているような気がします。どの時点で、エラーが発生しているのかは、回答者側では確認できていません。 どうも。スルドいご指摘、ありがとうございます。

saotome210
質問者

お礼

ご回答ありがとうございます。 あれから仕様の変更が起こってしまい、 この部分になかなか手を付けられなくなってしまいました。 長期間放置するのも良くないので、一旦締めさせていただきます。 私の拙い説明を元に色々と紐解いていただき、感謝しております。 落ち着いたらまたじっくりやってみたいと思います。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (11)

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

共有ファイルなどでもそうですが、ファイル(ブック)が開いている際は、データの整合性をとるために排他ロック(トランザクション)がかかった状態となります。 「データの整合性」には、ファイル内部の設定も一式が含まれますので、その状況でprotectをかけることはできません。(っというか、設定を変更する処理は落ちます。) 今回の場合は、複数で開かれていないのであれば、A→Bの処理が「多重窓」と捉えられているのかもしれません。 ただ UserInterfaceOnly = True これは通ると思いますけどねぇ・・^^;

saotome210
質問者

補足

>UserInterfaceOnly = True >これは通ると思いますけどねぇ・・^^; ですよね・・・ いわゆるトランザクション処理とも違うので、まさかとは思ったのですが。 仕様として諦めたほうがいいんでしょうか。。

すると、全ての回答が全文表示されます。

関連するQ&A