Ich bin sehr neu zu VBA und habe mir selbst bei der Erstellung meiner aktuellen Excel "Vertrag" beigebracht. Mein Ziel ist es, eine Liste von Vertragsoptionen zu erstellen, die in Abhängigkeit von den entsprechenden Kontrollkästchen angezeigt oder ausgeblendet werden. Es gibt insgesamt 12 Optionen mit Bereichen, die ich in 4 Arbeitsblättern anzeigen/entfernen kann.Excel VBA: Schutz meiner Arbeitsblätter verlangsamt meinen VBA-Code erheblich
In Bezug auf die Organisation habe ich Module basierend auf jeder Aktion verwendet. Ich benannte auch alle meine Bereiche
Bevor ich mein Arbeitsblatt beschütze, wenn ich ein Kontrollkästchen ankreuze, werden alle 4 Bereiche über alle 4 Arbeitsblätter sofort angezeigt. Wenn ich die Auswahl aufheben, löschen sie sofort ihren Inhalt und verstecken sich. Yay!
Sobald ich mein Arbeitsblatt schützen, werden die Dinge entweder zu einem Crawl verlangsamen oder ich erhalte einen Fehler. In meinem ProtectWorksheet-Modul funktionieren die auskommentierten Zeilen, aber wenn ich andere Stapelüberlauf-Artikel lese, sieht es besser aus, den Code zu verwenden, den ich habe. Ungeschützt funktioniert es großartig. Geschützt bekomme ich den "Error 1004 ': Kann die Hidden-Eigenschaft der Range-Klasse nicht setzen". Wenn ich meinen auskommentierten Code stattdessen geschützt verwende, funktioniert er, ist aber sehr langsam.
Technisch kann ich alles zur Arbeit bekommen ... aber von einer Benutzerschnittstelle aus ist es schrecklich.
Unten ist die erste Vertragsoption, die ich getestet habe. Bitte und danke für jede Hilfe!
unter den Excel-Objekte - sheet2 (Data Input)
Private Sub chkDomesticHotWater_Click()
ProtectOFF
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
If chkDomesticHotWater = True Then
AddDomesticHotWater
Else
'Remove the lines, clear the data, and move the mouse to the top
RemoveDomesticHotWater
ClearDomesticHotWater
Range("A1").Select
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
ProtectON
End Sub
unter dem Modul: Ankreuzfelder
Sub AddDomesticHotWater()
[DataInput_DomesticHotWater].EntireRow.Hidden = False
[Contract_DomesticHotWater].EntireRow.Hidden = False
[Invoice_DomesticHotWater].EntireRow.Hidden = False
[ExpectedCost_DomesticHotWater].EntireRow.Hidden = False
End Sub
Sub RemoveDomesticHotWater()
[DataInput_DomesticHotWater].EntireRow.Hidden = True
[Contract_DomesticHotWater].EntireRow.Hidden = True
[Invoice_DomesticHotWater].EntireRow.Hidden = True
[ExpectedCost_DomesticHotWater].EntireRow.Hidden = True
End Sub
Unter dem Modul Cleardata
Sub ClearDomesticHotWater()
Range("DataInput_DomesticHotWater").Select
For Each cell In Selection
If cell.Interior.Color = RGB(226, 239, 218) Then
cell.ClearContents
End If
Next
Range("DomesticHotWaterStart").Select
End Sub
unter dem Modul ProtectWorksheet
Sub ProtectON()
Dim ws As Worksheet
Dim pwd As String
pwd = "123" ' Put your password here
For Each ws In Worksheets
ws.Protect Password:=pwd, UserInterfaceOnly:=True
Next ws
'Worksheets("Data Input").Protect Password:="123"
'Worksheets("Contract").Protect Password:="123"
'Worksheets("Invoice").Protect Password:="123"
'Worksheets("Expected Cost").Protect Password:="123"
End Sub
Sub ProtectOFF()
Dim ws As Worksheet
Dim pwd As String
pwd = "123" ' Put your password here
For Each ws In Worksheets
ws.Unprotect Password:=pwd
Next ws
'Worksheets("Data Input").Unprotect Password:="123"
'Worksheets("Contract").Unprotect Password:="123"
'Worksheets("Invoice").Unprotect Password:="123"
'Worksheets("Expected Cost").Unprotect Password:="123"
End Sub
EDIT Ich konnte es nur ein klein wenig beschleunigen, indem mein Protect On/Off-Code unten zu aktualisieren, aber es ist immer noch eine 3-5 Sekunden Verzögerung, wenn ich auf meine Kontrollkästchen klicke:
Sub ProtectON()
Dim ws As Worksheet
Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
For Each ws In WSArray
ws.Protect Password:="123"
Next
End Sub
Sub ProtectOFF()
Dim ws As Worksheet
Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
For Each ws In WSArray
ws.Unprotect Password:="123"
Next
End Sub
BEARBEITEN - LÖSUNG? Also ich denke nicht, das ist Best Practice, noch habe ich wirklich meine Verzögerung "gelöst", aber ich habe einen Workaround gefunden. Ich habe die Verzögerung beseitigt, wenn ich auf meine Kontrollkästchen geklickt habe, indem ich den Schutz eingeschaltet und die Zeilenformatierung zugelassen habe. Technisch ist mein Blatt nicht mehr 100% ig vor dem Basteln von Benutzern geschützt, aber ich denke, dass es sich lohnt, solch eine lästige Wartezeit nach dem Klicken zu beseitigen.
Sie können Zeilen nicht ausblenden, wenn das Blatt geschützt ist, es sei denn Sie explizit diesen Parameter beim Schützen festlegen, um Ihnen zu ermöglichen, dies zu tun. – Kyle
Ich schalte den Schutz am Anfang meines Checkbox-wurde-geklickt Code. Wie würde ich den Parameter einstellen, damit ich das auch schütze? Müsste ich die Formatierung von Zeilen zulassen? Vielen Dank! – Haley
Ich konnte es nur ein kleines bisschen beschleunigen, indem ich meinen Protect On/Off-Code unten aktualisierte, aber es ist immer noch eine 3-5 Sekunden Verzögerung, wenn ich auf meine Kontrollkästchen oder andere Tasten klicke: Sub ProtectON() Dim ws Als Arbeitsblatt Sets WSArray = Sheets (Array ("Dateneingabe", "Vertrag", "Rechnung", "Erwartet Kosten")) For Each ws In WSArray ws.Protect Passwort: = "123" Weiter End Sub – Haley