[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロを有効にして操作させる』(フォーキー)
お世話になります。
マクロ有効化で操作させたいファイルがあり、
1、マクロが無効だとシート保護状態
2、マクロ有効でシート保護解除
3、閉じる前にシート保護&保存して閉じる
という手順をとっています。
3の処理に、
保存しない場合もシートは保護する。
を追加するにはどうすればいいですか?
シート保護を有効にするには保存して閉じなければならないので、現在の手順では無理な気がします。
解決方法があれば、ご教授お願いします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
保存しなければ、次開くときはシート保護がかかったままなのでは? ちがうのかな? (´・ω・`) 2021/12/10(金) 22:50
(´・ω・`)さん、きまぐれおじさんのおっしゃる通り、途中で上書き保存することを想定した質問でした。言葉足らずで申し訳ありません。
きまぐれおじさん、
Private Sub Workbook_BeforeClose(Cancel As Boolean) Worksheets("Sheet1").Protect
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True With Worksheets("Sheet1") .Protect ThisWorkbook.Save .Unprotect End With End Sub
Private Sub Workbook_Open() Worksheets("Sheet1").Unprotect End Sub
こんなコードで試してみましたが、うまくいきません。
BeforeSaveイベントで
シート保護→保存→保護解除
の動きをしているのは確認できたのですが、保存するとこのコードも消えてしまいます。
やり方が間違っていると思うので、いろいろ試してみます。
ありがとうございました。
(フォーキー) 2021/12/10(金) 23:35
>保存するとこのコードも消えてしまいます。 マクロ有効ブック(xlsm)で保存してますか? ThisWorkbook.Saveする前に Application.EnableEvents = False しないと、再帰的にBeforeSaveが呼ばれて Cacel=Trueになるので いつまでも保存されません
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True ThisWorkbook.Worksheets("Sheet1").Protect Application.EnableEvents = False ' これ大事 ThisWorkbook.Save Application.EnableEvents = True ' 復帰 ThisWorkbook.Worksheets("Sheet1").Unprotect End Sub (´・ω・`) 2021/12/11(土) 00:27
Option Explicit
Private Sub Workbook_Open() Worksheets("Sheet1").Unprotect End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Worksheets("Sheet1").Protect End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True ThisWorkbook.Worksheets("Sheet1").Protect Application.EnableEvents = False ThisWorkbook.Save Application.EnableEvents = True ThisWorkbook.Worksheets("Sheet1").Unprotect End Sub
上のコードで、マクロが有効下でのみ編集させることができました。ありがとうございます。
少し不可解な状況に当たったので教えてください。
閉じるボタンを押して、保存するかしないかのダイアログボックスの「保存」を押したとき、他のエクセルファイルが開いた状態だと、ダイアログが無限に表示されます。
会社のExcel2016、Windows10だと、他に開いているエクセルファイルが未保存のファイルでも発生します。
自宅のWindows11、Excel2010だと未保存のエクセルファイルの時は発生しませんが、名前をつけて保存済みのファイルだと無限ループが発生します。
ステップ実行でコードを追っても原因がよくわかりません。
解決策があれば教えてください。
(フォーキー) 2022/01/26(水) 17:47
・マクロブックのみ
閉じるボタンクリック→ダイアログ表示(必ず発生)→保存をクリック→クローズ
・他のエクセルファイル起動時
閉じるボタンクリック→ダイアログ表示→保存→ダイアログ表示→保存→ダイアログ表示……
という状況が発生します。
(フォーキー) 2022/01/26(水) 19:00
Workbook_BeforeSaveイベントの最後に、
ThisWorkbook.Saved = True
を追加して確認してみてください。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.saved
(tkit) 2022/01/27(木) 08:42
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True With ThisWorkbook .Worksheets("Sheet1").Protect Application.EnableEvents = False ThisWorkbook.Save Application.EnableEvents = True .Worksheets("Sheet1").Unprotect .Saved = True '追加 End With End Sub
ThisWorkbook.Saved = True を追加してみましたが、挙動は変わりませんでした。 (フォーキー) 2022/01/27(木) 08:50
保存前イベントでは、Sheet1をプロテクトします。 ↓ 保存 ↓ 保存後イベントで、プロテクト解除+保存後変更無し状態にします。
クローズ前イベントは必要無く、希望の動作となると思います。
Private Sub Workbook_Open() Me.Worksheets("Sheet1").Unprotect End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) With Me .Worksheets("Sheet1").Protect End With End Sub
Private Sub Workbook_AfterSave(ByVal Success As Boolean) With Me .Worksheets("Sheet1").Unprotect .Saved = True End With End Sub
(tkit) 2022/01/27(木) 09:36
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.