特定のフィールドにユーザー入力を許可し、他のセルを保護する Excel を使用しています。Tools Protect シートを使用しましたが、これを行った後、VBA スクリプトの値を変更できません。シートを制限してユーザー入力を停止すると同時に、VBA コードが特定の計算に基づいてセル値を変更できるようにする必要があります。
6 に答える
使ってみて
Worksheet.Protect "Password", UserInterfaceOnly := True
UserInterfaceOnly パラメーターが true に設定されている場合、VBA コードは保護されたセルを変更できます。
これらのアクションを実行することにより、コードを介してシートを変更できます
- 保護解除
- 変更
- 守る
コードでは、これは次のようになります。
Sub UnProtect_Modify_Protect()
ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect
ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect
End Sub
この方法の弱点は、コードが中断され、エラー処理がそれをキャプチャしない場合、ワークシートが保護されていない状態のままになる可能性があることです。
これらのアクションを実行することでコードを改善できます
- 再保護
- 変更
これを行うコードは次のようになります。
Sub Re-Protect_Modify()
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
'Protect, even if already protected
ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify
End Sub
このコードは、ワークシートの保護を更新しますが、'UserInterfaceOnly' を true に設定します。これにより、実行が中断された場合でも、UI を介したユーザー入力からワークシートを保護しながら、VBA コードでワークシートを変更できます。
この設定は、ブックを閉じて再度開くと失われます。ワークシートの保護は引き続き維持されます。
そのため、ワークシートを変更しようとする手順の開始時に「再保護」コードを含める必要があります。または、ワークブックを開いたときに一度だけ実行することもできます。
基本的だが理解しやすい答え:
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
シートのどの部分も VBA だけで編集できるように設定することはできないと思いますが、基本的に同じ効果を持つ何かを行うことができます。変更を加える前に、VBA でワークシートの保護を解除できます。
wksht.Unprotect()
完了したら再保護します。
wksht.Protect()
編集:この回避策はDheerの差し迫った問題を解決したようですが、後でこの質問/回答に出くわした人にとっては、Joeが以下で指摘しているように、私の回答の最初の部分について間違っていました. シートを VBA のみで編集できるように保護することはできますが、コードで「Worksheet.Protect」を呼び出す場合にのみ「UserInterfaceOnly」オプションを設定できるようです。