2016-11-24 2 views
-1

Sieht aus wie etwas falsch mit meinem Code. Aber ich bin nicht in der Lage, das Problem zu verstehen. Ich habe 2 Tabs auf Arbeitsmappe. Hauptblatt und Unterblatt. Wenn Sie in der Dropdown-Liste auf dem Hauptblatt "Ja" auswählen, wird das Unterblatt für die Eingabe aktiviert. Wenn Sie im Dropdown-Menü auf dem Hauptblatt "Nein" auswählen, werden die Zellen im Unterblatt deaktiviert.VBA-Code aktiviert Zelle nicht

Mein Problem: Wenn ich "Nein" wähle, sehe ich nicht die "Aktive Zelle" auf einem der Blätter. Was ich mit Active Cell meine, ist der grüne Rand, den wir bekommen, wenn wir auf Zelle klicken (Screenshot beigefügt). enter image description here

-Code auf Hauptblatt

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
     If Not Intersect(Target, Range("R12")) Is Nothing Then 
      If Target.Value = "YES" Then 
       Call Enabler 
      Else 
       Call Disabler 
      End If 
     End If 
    Application.EnableEvents = True 
End Sub 

-Code auf Module

Public Sub Disabler() 
    With ThisWorkbook.Sheets("SubSheet") 
     .Unprotect Password:="xyz" 
     .Range("E13:E14").Locked = True 
     .Protect Password:="xyz" 
    End With 
End Sub 

Public Sub Enabler() 
    With ThisWorkbook.Sheets("SubSheet") 
     .Unprotect Password:="xyz" 
     .Range("E13:E14").Locked = False 
     .Protect Password:="xyz" 
    End With 
End Sub 
+0

hinzufügen 'ThisWorkbook.Sheets (" SubSheet "). Aktivieren Sie' in Ihrem 'Sub Disabler()' und 'Sub Enabler()'. – Andy

+0

Was ist Ihre Excel-Version? . – Andy

Antwort

0

So etwas wie das folgende sollte für Sie arbeiten ...

Private Sub Worksheet_Change(ByVal Target As Range) 
On Error GoTo ExitSub 
    Application.EnableEvents = False 
    If Target.Address <> "$R$12" Then Exit Sub 
    If Target.Value = "YES" Then 
     Call LockRange(False) 
    Else 
     Call LockRange(True) 
    End If 

ExitSub: 
    Application.EnableEvents = True 
End Sub 

Private Function LockRange(bFlag As Boolean) As Boolean 
    On Error Resume Next 
    With ThisWorkbook.Sheets("SubSheet") 
     .Unprotect Password:="xyz" 
     .Range("E13:E14").Locked = bFlag 
     .Protect Password:="xyz" 
     'Debug.Print bFlag 
    End With 
    LockRange = True 
End Function 
+0

'Mit ThisWorkbook.Sheets ("Grundblatt") .Activate .Range ("E13") Wählen Sie .Unprotect Passwort: = "xyz" .Range ("E13: E14") Locked = False .Schutz. Passwort: = "xyz" End With' wird besser sein. – Andy

+0

@Flephal. Unglücklicherweise, Code, den du zur Verfügung stellst, mache ich die gleiche Aufgabe wie meine, die mir hilft, die aktive Zelle zu finden. Wenn ich auf irgendeine Zelle klicke, sehe ich den grünen Rand nicht als Screenshot früher. Hinweis: Ich kann die Zelle bearbeiten. – sady

+0

@Andy Problem immer noch persis :( – sady

0

Ich denke, Sie müssen Geben Sie ein:

.EnableSelection = xlNoRestrictions 

BTW können Sie Ihren Code durch verschmelzendenDisabler() und Enabler() U-Boote in einem Sub verkürzen:

Public Sub DisableSubSheet(disable As Boolean) 
    With ThisWorkbook.Worksheets("SubSheet") 
     .Unprotect Password:="xyz" 
     .Range("E13:E14").Locked = disable 
     .Protect Password:="xyz" 
     .EnableSelection = xlNoRestrictions '<--| make it possible for user to select cells 
    End With 
End Sub 

damit Ihr Worksheet_Change Event-Handler-Code wie folgt zu ändern:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    If Not Intersect(Target, Range("R12")) Is Nothing Then 
     If Target.Value = "YES" Then 
      DisableSubSheet False '<--| in place of previous 'Call Enabler' 
     Else 
      DisableSubSheet True '<--| in place of previous 'Call Disabler' 
     End If 
    End If 
    Application.EnableEvents = True 
End Sub 
Verwandte Themen