web-dev-qa-db-ja.com

Excelのセルを保護しますが、VBAスクリプトによってこれらを変更できます

特定のフィールドがユーザー入力に許可され、他のセルが保護されるExcelを使用しています。 Tools Protectシートを使用しましたが、これを行った後、VBAスクリプトの値を変更できません。シートを制限してユーザー入力を停止すると同時に、VBAコードが特定の計算に基づいてセル値を変更できるようにする必要があります。

57
Dheer

使用してみてください

Worksheet.Protect "Password", UserInterfaceOnly := True

UserInterfaceOnlyパラメーターがtrueに設定されている場合、VBAコードは保護されたセルを変更できます。

87
Joe

これらのアクションを実行することにより、コードを介してシートを変更できます

  • 保護を解除
  • 変更する
  • 保護する

コードでは、これは次のようになります。

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です。ワークシートの保護は引き続き維持されます。

そのため、「再保護」コードは、ワークシートを変更しようとするか、ワークブックを開いたときに一度だけ実行できるプロシージャの開始時に含める必要があります。

16
Robert Mearns

シートのどの部分もVBAだけが編集できるように設定できるとは思わない、しかし基本的に同じ効果を持つ何かをすることができます-変更を加える必要がある前にVBAでワークシートの保護を解除できます:

wksht.Unprotect()

完了したら再保護します:

wksht.Protect()

編集:この回避策はDheerの差し迫った問題を解決したように見えますが、後でこの質問/回答に出くわした人にとっては、ジョーが以下に指摘するように、私の答えの最初の部分については間違っていました。 can VBAのみで編集できるようにシートを保護しますが、「UserInterfaceOnly」オプションは、コードで「Worksheet.Protect」を呼び出す場合にのみ設定できます。

2
Kevin Crumley

基本的だが理解しやすい答え:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub
2
user2059216

回避策として、変更された値を保持するhidden worksheetを作成できます。表示され、保護されているワークシートのセルには、単純な式を使用して非表示のワークシートの値が表示されます。

非表示のワークシートで表示値を変更するが可能になりますが、ユーザーは編集できません。

1
hegemon

Sheet1でロックアウトしたいセルを選択し、提案​​されたコードをopen_workbook()関数に配置して、チャームのように機能しました。

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
0
Alan