特定のフィールドがユーザー入力に許可され、他のセルが保護されるExcelを使用しています。 Tools Protectシートを使用しましたが、これを行った後、VBAスクリプトの値を変更できません。シートを制限してユーザー入力を停止すると同時に、VBAコードが特定の計算に基づいてセル値を変更できるようにする必要があります。
使用してみてください
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
このメソッドのweaknessは、コードが中断され、エラー処理でキャプチャされない場合、ワークシートが保護されていない状態のままになる可能性があることです。
これらのアクションを実行することで、コードを改善にすることができます
これを行うコードは次のとおりです。
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コードでワークシートを変更できます。
この設定は、ワークブックを閉じて再度開いたときにlostです。ワークシートの保護は引き続き維持されます。
そのため、「再保護」コードは、ワークシートを変更しようとするか、ワークブックを開いたときに一度だけ実行できるプロシージャの開始時に含める必要があります。
シートのどの部分もVBAだけが編集できるように設定できるとは思わない、しかし基本的に同じ効果を持つ何かをすることができます-変更を加える必要がある前にVBAでワークシートの保護を解除できます:
wksht.Unprotect()
完了したら再保護します:
wksht.Protect()
編集:この回避策はDheerの差し迫った問題を解決したように見えますが、後でこの質問/回答に出くわした人にとっては、ジョーが以下に指摘するように、私の答えの最初の部分については間違っていました。 can VBAのみで編集できるようにシートを保護しますが、「UserInterfaceOnly」オプションは、コードで「Worksheet.Protect」を呼び出す場合にのみ設定できます。
基本的だが理解しやすい答え:
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
回避策として、変更された値を保持するhidden worksheetを作成できます。表示され、保護されているワークシートのセルには、単純な式を使用して非表示のワークシートの値が表示されます。
非表示のワークシートで表示値を変更するが可能になりますが、ユーザーは編集できません。
Sheet1でロックアウトしたいセルを選択し、提案されたコードをopen_workbook()関数に配置して、チャームのように機能しました。
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True