2016-11-29 4 views
1

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.

+0

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

+0

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

+0

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

Antwort

0

Es sollte nicht so langsam sein, obwohl ich wirklich keine Ahnung habe, wie schnell dein PC ist und wie groß die Daten sind.Aber hier ist etwas, was Sie besser machen können:

Sub ClearDomesticHotWater() 

    For Each cell In [DataInput_DomesticHotWater] 
    If cell.Interior.Color = RGB(226, 239, 218) Then 
     cell.ClearContents 
    End If 
    Next 

End Sub 

und entfernen Sie alle Auswahl, sie verlangsamen Sie. Gehen Sie sie so umher: How to avoid using Select in Excel VBA macros

+0

Die Größe meiner Daten ist die oben genannten multipliziert mit 12 Abschnitten, ausschließlich des ProtectWorksheet-Moduls. Ich habe auch eine Menge Formeln in den Zellen, die ich zeige/verstecke. Vielen Dank für das Entfernen wählt Artikel, ich lese das jetzt durch – Haley

Verwandte Themen