it-swarm.com.de

Zellen in Excel schützen, jedoch durch VBA-Skript ändern

Ich verwende Excel, wo bestimmte Felder für die Benutzereingabe zulässig sind und andere Zellen geschützt werden sollen. Ich habe Tools Protect Sheet verwendet, aber danach kann ich die Werte im VBA-Skript nicht ändern. Ich muss das Blatt einschränken, um die Benutzereingabe zu stoppen. Gleichzeitig darf der VBA-Code die Zellenwerte basierend auf bestimmten Berechnungen ändern.

51
Dheer

Versuchen Sie es mit 

Worksheet.Protect "Password", UserInterfaceOnly := True

Wenn der Parameter UserInterfaceOnly auf true festgelegt ist, kann der VBA-Code geschützte Zellen ändern.

83
Joe

Sie können ein Blatt per Code ändern, indem Sie diese Aktionen ausführen

  • Schützen Sie sich nicht
  • Ändern
  • Schützen

Im Code wäre das:

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

Die Schwäche dieser Methode besagt, dass das Arbeitsblatt möglicherweise im ungeschützten Zustand verbleibt, wenn der Code unterbrochen wird und der Fehler nicht erfasst wird.

Der Code könnte verbessert sein, wenn diese Aktionen ausgeführt werden

  • Wieder schützen
  • Ändern

Der Code dafür wäre:

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

Dieser Code erneuert den Schutz des Arbeitsblatts, wobei jedoch "UserInterfaceOnly" auf "true" gesetzt ist. Dadurch kann der VBA-Code das Arbeitsblatt ändern, während das Arbeitsblatt über die Benutzeroberfläche vor Benutzereingaben geschützt bleibt, auch wenn die Ausführung unterbrochen wird.

Diese Einstellung ist verloren, wenn die Arbeitsmappe geschlossen und erneut geöffnet wird. Der Arbeitsblattschutz bleibt erhalten.

Der 'Re-Protection'-Code muss also zu Beginn einer Prozedur eingefügt werden, die versucht, das Arbeitsblatt zu ändern, oder er kann nur einmal ausgeführt werden, wenn die Arbeitsmappe geöffnet wird.

16
Robert Mearns

Ich glaube nicht, dass Sie einen Teil des Blattes so einstellen können, dass er nur von VBA bearbeitet werden kann, aber Sie können etwas tun, das im Grunde den gleichen Effekt hat - Sie können das Arbeitsblatt in VBA aufheben, bevor Sie Änderungen vornehmen müssen:

wksht.Unprotect()

und schützen Sie es wieder, nachdem Sie fertig sind:

wksht.Protect()

Edit: Sieht so aus, als hätte diese Problemumgehung das unmittelbare Problem von Dheer vielleicht gelöst, aber für jeden, der später auf diese Frage/Antwort gestoßen ist, habe ich mich im ersten Teil meiner Antwort geirrt, wie Joe unten erklärt. Sie can schützen ein Blatt so, dass es nur von VBA bearbeitet werden kann. Die Option "UserInterfaceOnly" kann jedoch nur beim Aufruf von "Worksheet.Protect" im Code festgelegt werden.

3
Kevin Crumley

Eine einfache, aber einfach zu verstehende Antwort:

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

Als Problemumgehung können Sie ein ausgeblendetes Arbeitsblatt erstellen, das den geänderten Wert enthalten würde. Die Zelle im sichtbaren, geschützten Arbeitsblatt sollte den Wert des ausgeblendeten Arbeitsblatts mit einer einfachen Formel anzeigen. 

Sie können den angezeigten Wert über das ausgeblendete Arbeitsblatt ändern , während Ihre Benutzer es nicht bearbeiten können.

1
hegemon

Ich habe die Zellen ausgewählt, die ich in Sheet1 ausgesperrt haben wollte, und den vorgeschlagenen Code in die Funktion open_workbook () einfügen und wie ein Zauber gearbeitet.

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