Excel에서 셀을 보호하지만 VBA 스크립트로 수정하도록 허용
문제
나는 사용자 입력을 위해 특정 필드가 허용되고 다른 셀을 보호 해야하는 Excel을 사용하고 있습니다. 도구 보호 시트를 사용했지만이 작업을 수행 한 후에는 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
그만큼 약점 이 방법 중 코드가 중단되고 오류 처리가 캡처되지 않으면 워크 시트는 보호되지 않은 상태에 남을 수 있습니다.
코드가 될 수 있습니다 향상 이러한 행동을 취함으로써
- 다시 보호하십시오
- 수정하다
이를 수행하는 코드는 다음과 같습니다.
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로 설정되어 있습니다. 이를 통해 VBA 코드는 워크 시트를 수정할 수 있으며, 실행이 중단 되더라도 워크 시트를 UI를 통해 사용자 입력으로부터 보호합니다.
이 설정은입니다 잃어버린 통합 문서가 닫히고 다시 열 때. 워크 시트 보호는 여전히 유지됩니다.
따라서 워크 시트를 수정하려고 시도하거나 통합 문서가 열렸을 때 한 번만 실행할 수있는 절차의 시작 부분에 '다시 보호'코드가 포함되어야합니다.
나는 당신이 시트의 일부를 VBA 만 편집 할 수 있도록 설정할 수 있다고 생각하지 않습니다., 그러나 기본적으로 동일한 효과를 가진 작업을 수행 할 수 있습니다. 변경하기 전에 VBA에서 워크 시트를 보호 할 수 있습니다.
wksht.Unprotect()
완료 후 다시 보호하십시오.
wksht.Protect()
편집 :이 해결 방법이 Dheer의 즉각적인 문제를 해결 한 것처럼 보이지만 나중에이 질문/답변을 발견 한 사람에게는 Joe가 아래에서 지적한 것처럼 내 대답의 첫 부분에 대해 잘못되었습니다. 너 ~할 수 있다 VBA 전용에 의해 편집 가능한 시트를 보호하지만 코드에서 "Worksheet.Protect"를 호출 할 때만 "userInterfaceonly"옵션을 설정할 수 있습니다.
기본적이지만 이해하기 쉬운 답변 :
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
해결 방법으로, 당신은 a를 만들 수 있습니다 숨겨진 워크 시트, 변경된 값을 보유 할 것입니다. 가시적이고 보호 된 워크 시트의 셀은 간단한 공식을 사용하여 숨겨진 워크 시트의 값을 표시해야합니다.
너는 할 수있을 것이다 숨겨진 워크 시트를 통해 표시된 값을 변경하십시오, 사용자는 사용자가 편집 할 수 없습니다.
Sheet1에 고정 된 셀을 선택하고 제안 된 코드를 Open_Workbook () 함수에 배치하고 매력처럼 작동했습니다.
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True