2016-07-10 15 views
1

Ich bin relativ neu in VBA. Und als ich an einem Arbeitsblatt arbeitete, habe ich einen Code erstellt, der Zeilen basierend auf einer Bedingung in einer Spaltenzeile automatisch ein- und ausblendet (0 unhide/1 hide). Dieses relativ einfache Makro funktionierte gut, bis ich ein anderes Blatt hinzufügte. Da es keine Makros in diesem Blatt gibt, denke ich nicht, dass es verwandt ist. Aber jetzt gibt es jedes Mal einen Laufzeitfehler auf der END IF-Funktion und ich weiß nicht, wie ich es lösen soll. Es gibt wahrscheinlich eine einfache Lösung, aber ich kann sie nicht finden. HierVBA - Laufzeitfehler mit ENDE IF

ist der Code:

Private Sub Worksheet_Calculate() 
    Application.ScreenUpdating = False 
    Dim LastRow As Long, c As Range 
    Application.EnableEvents = False 
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row 
     On Error Resume Next 
     For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107") 
     If c.Value = 1 Then 
      c.EntireRow.Hidden = True 
     ElseIf c.Value = 0 Then 
      c.EntireRow.Hidden = False 
    End If 
    Next 
    On Error GoTo 0 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
    End Sub 
+0

Wahrscheinlich nicht die Quelle der Fehler, aber man könnte das ganze umfassen 'If ... Else ... End If' als' c.EntireRow.Hidden = CBool ​​(c.Value) ' – Jeeped

+1

Hat diesen Fehler sage * alles * mehr als "Laufzeitfehler"? – usr2564301

+0

Entfernen oder kommentieren Sie die 'On Error Resume Next' und wenden Sie eine übergeordnete Arbeitsblattverweis auf das Bereichsobjekt an. Das Arbeitsblatt kann flüchtige Formeln enthalten, die aufgrund von Änderungen auf dem anderen Arbeitsblatt ein Berechnungsereignis auslösen. – Jeeped

Antwort

1

entfernen oder kommentieren Sie die On Error Resume Next, wenn Sie mehr komplette Debug-Informationen abrufen möchten. Es sollte nicht in einem Ereignismakro erforderlich sein, das so oft wie Worksheet_Calculate ausgeführt wird.

Wenden Sie einen übergeordneten Arbeitsblattverweis auf das Bereichsobjekt an. Das Arbeitsblatt kann flüchtige Formeln enthalten, die aufgrund von Änderungen auf dem anderen Arbeitsblatt ein Berechnungsereignis auslösen.

Ich habe eine breite Bedingung hinzugefügt, so dass der Code nur ausgeführt wird, wenn das übergeordnete Arbeitsblatt die ActiveSheet property enthält. Das Arbeitsblatt kann flüchtige¹ Formeln enthalten, die aufgrund von Änderungen auf dem anderen Arbeitsblatt (oder sogar einer anderen Arbeitsmappe) ein Berechnungsereignis auslösen.

LastRow tut nichts nach seiner Zuweisung (was problematisch ist), also habe ich es entfernt.

Ich vereinfachte die Range.Hidden Eigenschaft zu einer einzelnen Zeile.

Private Sub Worksheet_Calculate() 
    If Me.Name = Activesheet.Name Then 
     Application.ScreenUpdating = False 
     Application.EnableEvents = False 
     Dim c As Range 
     For Each c In Me.Range("BA34:BA56,BA73:BA74,BA76:BA107") 
      c.EntireRow.Hidden = CBool(c.Value2) 
     Next c 
     Application.EnableEvents = True 
     Application.ScreenUpdating = True 
    End If 
End Sub 

¹ Flüchtige Funktionen, wenn irgendetwas in der gesamten Arbeitsmappe ändert, nicht nur, wenn etwas neu zu berechnen, die ihr Ergebnis Änderungen betroffen ist. Beispiele für flüchtige Funktionen sind INDIRECT, OFFSET, TODAY, NOW, RAND und RANDBETWEEN. Einige Unterfunktionen der Arbeitsblattfunktionen CELL und INFO machen sie ebenfalls volatil.

+0

Danke für Ihre Antwort. Tatsächlich war der anfängliche Fehler nur ein Laufzeitfehler und es dauerte lange, bis das Makro funktionierte. Das Blatt ist nur "Sheet1". Ersetzen Sie es mit Ihrem Vorschlag es heißt Laufzeitfehler "1004". Vielen Dank für Ihre Hilfe und schnelle Antwort. – AlmarM

+0

Nur um den Thread zu beenden. Ich löste es basierend auf einer Kombination aus dem Code, den du geschrieben hast, und meinem, da die 0 der Auslöser sein sollte, um auch zu verbergen. Ich vermute, dass die Fehlerlinie das Problem verursacht hat. – AlmarM

+0

Ich verstehe das Problem nicht wirklich, da 'CBool ​​(0)' in 'False' aufgelöst wird.In fast jeder Programmiersprache entspricht "False" null und in booleschen Begriffen ist alles, was nicht falsch ist, wahr; z.B. #define False 0: #define True Nicht False. – Jeeped

0

Nur um den Thread zu beenden. Ich löste es basierend auf einer Kombination aus dem Code, den du geschrieben hast, und meinem, da die 0 der Auslöser sein sollte, um auch zu verbergen. Ich vermute, dass die Fehlerlinie das Problem verursacht hat.

Private Sub Worksheet_Calculate() 
    Application.ScreenUpdating = False 
    Dim LastRow As Long, c As Range 
    Application.EnableEvents = False 
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row 
    On Error Resume Next 
    For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107") 
     If c.Value = 1 Then 
      c.EntireRow.Hidden = True 
     ElseIf c.Value = 0 Then 
      c.EntireRow.Hidden = False 
     End If 
    Next 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
    End Sub