Schützen von Zellen in Excel, sondern lassen diese durch VBA-Skript geändert werden

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin mit Excel, wo bestimmte Felder für Benutzereingaben erlaubt sind und andere Zellen sind geschützt werden. Ich habe Werkzeuge Blatt Schützen verwendet, aber danach tun Ich bin nicht in der Lage, die Werte in der VBA-Skript zu ändern. Ich brauche das Blatt zu beschränken Benutzereingabe, die gleichzeitig erlaubt dem VBA-Code zu stoppen, um die Zellenwerte zu ändern basierend auf bestimmte Berechnungen.

War es hilfreich?

Lösung

Versuchen Sie es mit

Worksheet.Protect "Password", UserInterfaceOnly := True

Wenn die Userinterfaceonly-Parameter auf true gesetzt ist, kann VBA-Code geschützte Zellen ändern.

Andere Tipps

Sie können einen Bogen über den Code ändern, indem Sie diese Aktionen unter

  • Schutz aufheben
  • Ändern
  • Protect

Code dies wäre:

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 dieses Verfahrens besteht darin, dass, wenn der Code unterbrochen wird und die Fehlerbehandlung es nicht erfassen, könnte das Arbeitsblatt in einem ungeschützten Zustand belassen werden.

Der Code könnte sein, verbessert durch diese Aktionen unter

  • Re-Schutz
  • Ändern

Der Code, dies zu tun 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 auf dem Arbeitsblatt, sondern mit dem ‚Userinterfaceonly‘ auf true eingestellt. Auf diese Weise kann VBA-Code um das Arbeitsblatt zu ändern, während das Arbeitsblatt aus Benutzereingaben über die Benutzeroberfläche geschützt zu halten, auch wenn die Ausführung unterbrochen wird.

Diese Einstellung ist verloren , wenn die Arbeitsmappe geschlossen und wieder geöffnet. Der Blattschutz ist nach wie vor beibehalten.

So ist der ‚Re-Schutz‘ Code muss zu Beginn jeden Verfahrens einbezogen werden, die das Arbeitsblatt zu ändern versucht, oder kann nur ein einziges Mal ausgeführt werden, wenn die Arbeitsmappe geöffnet wird.

Ich glaube nicht, dass Sie einen Teil des Blattes festlegen können nur von VBA editierbar sein, aber man kann etwas tun, was im Grunde die gleiche Wirkung hat - können Sie das Arbeitsblatt in VBA unprotect bevor Sie Änderungen vornehmen müssen:

wksht.Unprotect()

und Wieder schützen, nachdem Sie fertig sind:

wksht.Protect()

Edit: Sieht aus wie diese Abhilfe Dheer unmittelbares Problem gelöst hat, aber für alle, die später über diese Frage / Antwort kommen, ich war falsch über den ersten Teil meiner Antwort, wie Joe unten weist darauf hin. Sie können ein Blatt schützen, indem VBA-nur bearbeitet werden, aber es erscheint die „Userinterfaceonly“ Option kann nur dann eingestellt werden, wenn „Worksheet.Protect“ im Code aufgerufen wird.

Eine einfache, aber einfach zu verstehen Antwort:

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

Als Abhilfe können Sie eine versteckt Arbeitsblatt erstellen, die den geänderten Wert halten würde. Die Zelle auf der sichtbaren, geschützte Arbeitsblatt sollte den Wert aus dem verborgenen Arbeitsblatt angezeigt werden, eine einfache Formel.

Sie werden in der Lage sein, den angezeigten Wert durch die versteckte Arbeitsblatt ändern , während der Benutzer nicht in der Lage sein, es zu bearbeiten.

Wie wähle ich die Zellen Ich wollte in sheet1 gesperrt und legen Sie den vorgeschlagenen Code in der open_workbook () Funktion und arbeitete wie ein Charme.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top