2016-03-29 10 views
3

Ich habe ein paar andere gelesen, die mein Problem teilweise gelöst haben, aber ein kompletter VB-Amateur kann ich nicht dazu bringen, dass dies funktioniert. Das fragliche Arbeitsblatt ist geschützt, also habe ich versucht, einen Befehl zum Schutz/Schutz in den Code einzufügen. Es wird am Anfang den Schutz aufgehoben, aber dann Probleme auftreten. Jede Hilfe wäre willkommen.Runtime 1004 Problemumgehung - Schutz/Schutz in Worksheet_Change

Private Sub Worksheet_Change(ByVal Target As Range) 

    Sheet1.Unprotect Password:="mypassword" 

    If Target.Cells.Count > 1 Then Exit Sub 

     If Not Intersect(Target, Range("B11")) Is Nothing Then 
     Select Case Target.Value 
      Case Is = "" 
       Target.Value = "Product Name (IE Product123)" 
       Target.Font.ColorIndex = 15 
      Case Else 
       Target.Font.ColorIndex = 1 

     End Select 
    End If 

    If Not Intersect(Target, Range("B12")) Is Nothing Then 
     Select Case Target.Value 
      Case Is = "" 
       Target.Value = "Version " 
       Target.Font.ColorIndex = 15 
      Case Else 
       Target.Font.ColorIndex = 1 

     End Select 
    End If 

    Sheet1.Protect Password:="mypassword" 

End Sub 
+0

Sie verlassen das Arbeitsblatt ungeschützt 'If Target.Cells.Count> 1'. – Jeeped

+0

In diesem Fall ... warum sollten Sie das Arbeitsblatt überhaupt ungeschützt machen? Wenn der Benutzer B11: B12 ändern kann, dann kann auch workheet_change. – Jeeped

+0

Also mein Arbeitsblatt ist ein Formular. Mein ursprüngliches Ziel war, dass 2 dieser Zellen "B11" und "B12" einen "Standard" -Grautwert haben. Wenn Text eingegeben wird, erscheint er schwarz. Wenn es gelöscht wird, kehrt es zu dem ursprünglichen ausgegrauten Wert zurück. Dies funktionierte ziemlich gut, bis es geschützt wurde, so dass nur bestimmte Zellen ausgewählt/bearbeitet werden können. Wenn es geschützt wird, erzeugt es den Laufzeitfehler und der Code funktioniert nicht mehr. Ich bin mir sicher, es gab wahrscheinlich eine elegantere Lösung für den Anfang, aber ich arbeite mit begrenztem Wissen :(Aus der Forschung konnte ich sehen, die beste Lösung war das Hinzufügen der Schutz/Reprotect in –

Antwort

2

Sie haben nicht die Application.EnableEvents property ausgeschaltet, aber es gibt eine Chance, dass Sie etwas zu dem Arbeitsblatt schreiben. Dies würde den Ereignishandler erneut auslösen und das Worksheet_Change Ereignismakro würde versuchen, über sich selbst zu laufen.

Es gibt nichts, was verhindert, dass jemand gleichzeitig den Inhalt von B11 und B12 löscht. Anstatt die Verarbeitung aufzugeben, sollten Sie die Möglichkeit nutzen und beide Zellen verarbeiten, wenn sich zwei Zellen im Ziel befinden.

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Range("B11:B12")) Is Nothing Then 
     On Error GoTo bm_Safe_Exit 
     'turn off event handling 'cause we might write something 
     Application.EnableEvents = False 
     'why this unprotect necessary?? 
     'Me.Unprotect Password:="mypassword" 
     Dim rng As Range 
     For Each rng In Intersect(Target, Range("B11:B12")) 
      Select Case rng.Value2 
       Case vbNullString 
        If rng.Address(0, 0) = "B11" Then 
         rng = "Product Name (IE Product123)" 
        Else 
         rng = "Version " '<~~ why the trailing space?? 
        End If 
        rng.Font.ColorIndex = 15 
       Case Else 
        rng.Font.ColorIndex = 1 
      End Select 
     Next rng 
    End If 

bm_Safe_Exit: 
    'if unprotect is not necessary, neither is protect 
    'Me.Protect Password:="mypassword" 
    Application.EnableEvents = True 

End Sub 

Vielleicht wollen Sie auch in die des Worksheet.Protect method Userinterfaceonly Parameter suchen. Wenn Sie dies auf "true" setzen, können Sie in VBA alles tun, was Sie möchten, ohne das Arbeitsblatt zu deaktivieren.

Addendumm:

Wenn der Benutzer den Inhalt der B11 verändern können: B12 dann müssen diese Zellen werden nicht gesperrt. Wenn sie nicht gesperrt sind, muss das Arbeitsblatt nicht deaktiviert werden, bevor (möglicherweise) der Inhalt geändert wird.

+0

Nur getestet und obwohl der Standardtext ein Leerzeichen ersetzt es nicht t starten als grau oder zurück zu dem grauen Text, wenn die Zelle gelöscht wird? –

+0

Es funktionierte auf meinem Test in einem streng ungeschützten Arbeitsblatt. Vielleicht Formatierung einer der Einschränkungen in Ihrem Arbeitsblattschutz ...? – Jeeped

+0

Erlauben Sie Benutzern, die gesperrten zu formatieren Das Blatt funktioniert wunderbar, aber ich möchte nicht, dass jemand die Formatierung ändert :( –