2016-06-14 2 views
1

Ich weiß nicht, wo ich falsch gelaufen bin. Das Skript funktioniert, aber es wird nicht automatisch ausgeführt, wenn ich nicht in die VBA-Anwendung gehe und auf die Wiedergabeschaltfläche klicke, um das Skript auszuführen. Kann jemand helfen?VBA Excel nicht ausgeführt, es sei denn, ich klicke auf Play-Taste

Private Sub HideChart1() 

    If ActiveWorkbook.Sheets("User Interface").Range("F8") = "Yes" Then 

     ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True 

    Else 

     ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False 

    End If 

End Sub 
+3

Warum sollten Sie erwarten, dass es automatisch ausgeführt wird? –

+0

Ich kann nur annehmen, dass Sie versuchen, ein Worksheet_Change-Ereignis ausgelöst durch F8 – jcarroll

Antwort

1

Sie möchten ein Ereignis Worksheet Change verwenden.

Nicht getestet, sollte aber funktionieren. Setzen Sie diese in Ihrem „User Interface“ Arbeitsblatt Modul .:

Private Sub Worksheet_Change(ByVal target As Range) 
If target = Range("F8") And target.Value = "Yes" Then 
    ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True 
Else 
    ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False 
End If 
End Sub 

Mit Worksheet Change, das glaube ich nicht (Stichwort „denken“) Sie das Arbeitsblatt angeben müssen die Range("F8") erwartet wird, auf sein, da es durch Definition, das Aktivblatt. Wenn Sie möchten, fügen Sie den Blattnamen vor, um sicher zu sein.

+0

zu erstellen. Thanks dies funktionierte großartig – Leofig123

+0

Sollte vielleicht 'ActiveWorkbook' zu' ThisWorkbook' für zusätzliche Robustheit ändern (vorausgesetzt, das Diagramm befindet sich in der gleichen Arbeitsmappe wie der Code) Handler können ausgeführt werden, ohne dass die Arbeitsmappe notwendigerweise aktiv ist. –

1

Wenn mein Kommentar korrekt ist, dann werden Sie so etwas wie dieses benötigen:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Target.Worksheet.Range("F8")) Is Nothing Then 
     If Target.Worksheet.Range("F8").Value = "Yes" Then 
      ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True 
     Else 
      ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False 
     End If 
    End If 
End Sub 

Sie können mehr Informationen über das Arbeitsblatt Änderungsereignis automatically execute an Excel macro on a cell change

Der Schlüssel zum Mitnehmen finden Sie hier von Diese Frage besteht darin, den Code in das Arbeitsblattmodul, kein reguläres Modul oder das Arbeitsmappenmodul zu schreiben.

5

Handle SheetChange, und rufen Sie Ihre Prozedur dort auf.

Private Sub Worksheet_Change(ByVal Target As Range) 
    HideChart1 
End Sub 

Fertig. Implementiere keine Logik in Event Handlern, es ist das erste Tor der Hölle und Spaghettifikation. Eine separate, dedizierte Prozedur dafür ist perfekt - alles, was Sie brauchen, ist etwas, das es automatisch aufruft.

Wenn HideChart1 in einem eigenen Standardmodul implementiert ist, müssen Sie es Public machen, um es aus dem Code-Behind eines Arbeitsblatts aufrufen zu können; Fügen Sie am Anfang des Moduls Option Private Module hinzu, um zu vermeiden, dass Elemente als Makros und/oder Arbeitsblattfunktionen angezeigt werden.

+0

Können Sie etwas erweitern oder direkt auf einige Ressourcen verweisen, in denen detailliert beschrieben wird, warum die Verwendung von Logik in Ereignishandlern vermieden werden sollte? Es ist das erste Mal, dass ich dies erwähnt habe, und ich würde gerne mehr wissen: D – BruceWayne

+2

@BruceWayne einfach weil Best Practice ist, Dinge in ihrer eigenen Funktion zu implementieren. Für welchen Code ist es einfacher, automatisierte Komponententests zu schreiben? Die spezialisierte Methode, die in einem dedizierten Klassenmodul implementiert ist, oder der does-it-all-Ereignishandler, der privat ist und durch Ändern einer bestimmten Arbeitsblattzelle ausgelöst wird? Selbst wenn Sie niemals einen Komponententest in VBA schreiben (obwohl [Sie könnten] (http://www.rubberduckvba.com)), ist Code einfacher zu pflegen, wenn er nicht in Handlern verstreut ist. –

+0

Ah, gute Punkte. Es hat mich tatsächlich daran erinnert, dass eines meiner Arbeitshefte ein ziemlich kompliziertes "Worksheet_Change" -Ereignis hat, das davon profitieren würde, in ihre eigenen Subs auszubrechen. Danke für Ihre Kommentare, hat mir geholfen! – BruceWayne

Verwandte Themen