حماية الخلايا في Excel ولكن يسمح تعديل بواسطة VBA النصي

StackOverflow https://stackoverflow.com/questions/125449

  •  02-07-2019
  •  | 
  •  

سؤال

أنا باستخدام 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 إلى تعديل ورقة العمل ، مع الحفاظ على ورقة العمل محمية من إدخال المستخدم من خلال واجهة المستخدم ، حتى إذا كان التنفيذ هو توقف.

هذا الإعداد هو فقدت عندما يتم إغلاق المصنف وإعادة فتحها.ورقة عمل الحماية لا تزال تحتفظ.

وبالتالي فإن إعادة حماية' رمز يحتاج إلى تدرج في بداية أي إجراء محاولات لتعديل ورقة العمل أو يمكن أن يكون مجرد تشغيل مرة واحدة عندما يتم فتح المصنف.

أنا لا أعتقد أنك يمكن أن يحدد أي جزء من ورقة للتحرير فقط عن طريق VBA, ولكن يمكنك أن تفعل شيئا في الأساس نفس التأثير-يمكنك إلغاء حماية ورقة العمل في VBA قبل أن تحتاج إلى إجراء تغييرات:

wksht.Unprotect()

وإعادة حمايته بعد الانتهاء من ذلك:

wksht.Protect()

تحرير:يبدو أن هذا الحل قد يكون حلها Dheer الفوري عن أي شخص يأتي عبر هذا السؤال/الجواب في وقت لاحق, كنت مخطئا حول الجزء الأول من جوابي ، جو النقاط أدناه.لك يمكن حماية ورقة أن تكون قابلة للتعديل عن طريق VBA فقط ، ولكن يبدو أن "UserInterfaceOnly" الخيار يمكن فقط تعيين عند استدعاء "ورقة العمل.حماية" في التعليمات البرمجية.

الأساسية ولكن بسيطة لفهم الجواب:

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

كحل ، يمكنك إنشاء إخفاء ورقة العمل, الذي يعقد القيمة المتغيرة.الخلية على مرئية ، حماية ورقة العمل يجب عرض القيمة من إخفاء ورقة العمل باستخدام صيغة بسيطة.

سوف تكون قادرة على تغيير عرض القيمة من خلال إخفاء ورقة العمل, ، في حين أن المستخدمين لن تكون قادرة على تحريره.

تحديد الخلايا أردت تأمين في الورقة1 و المكان المقترح البرمجية في open_workbook() وظيفة تعمل مثل السحر.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top