Excel VBA - Code zum Überspringen von Zeilen / goto-Befehl

Excel VBA - Code zum Überspringen von Zeilen / goto-Befehl

Ich habe einen Code in Excel eingebaut, um die Daten aus einer Pivot-Tabelle zu nehmen und in ein Diagramm einzufügen. Ein direkt mit der Tabelle verknüpftes Pivot-Diagramm bietet mir jedoch nicht die gewünschte Flexibilität. Der Grund, warum ich mir die Mühe gemacht habe, einen so „komplizierten“ Code zu erstellen, ist, dass ich für jede Kombination aus Anlagen- und Testinformationen einen separaten Eintrag im Diagramm benötige.

Der Hauptzweck dieses Codes besteht darin, jede Kombination aus Anlage und Testinformationen (die verschachtelten For-Befehle) durchzugehen und dann die Daten in das Diagramm einzufügen. Mein Benutzer wird die Spaltenposition für x und y nicht ändern, daher funktionieren die Offsets einwandfrei.

Mein Problem ist, dass die Kombination aus Anlagen- und Testinformationen, wenn sie nicht existiert, trotzdem in das Diagramm eingetragen wird. Wenn ich versuche, den Befehl goto zu verwenden und ihn mit einem Fehlerhandle an Next PI2 zu senden, funktioniert das nicht (vielleicht wegen der verschachtelten if-Befehle). Ich habe nach einem Befehl gesucht, der meinen Code an eine bestimmte Zeile im Code senden könnte (also direkt nach den Grafikbefehlen), aber hatte kein Glück ...

Kennt jemand eine Möglichkeit, im Falle eines Fehlers zu einer bestimmten Zeile zu springen?

Ich habe den Befehlssatz hinzugefügt, um beim nächsten PI2 fortzufahren. Dabei sage ich: „Bei einem Fehler gehe zu Errhandler“ und dann vom Errhandler zur nächsten Iteration. Wenn ich den Code jedoch ausführe und ein Fehler auftritt, durchläuft er nicht diesen Weg, sondern stoppt stattdessen bei der Zeile „intersect“.

Sub CreatePivotChart()

 Dim PF1 As PivotField
 Dim PI1 As PivotItem
 Dim PI2 As PivotItem
 Dim PF2 As PivotField
 Dim chartcount As Integer
 Dim pt As PivotTable
 Set pt = Worksheets("Pivot Table").PivotTables("PivotTable")

'set up pivot field locations 1 - plant and unit , 2 - test conditions

 Set PF1 = Worksheets("PivotTable").PivotTables("PivotTable").PivotFields("Plant")

 Set PF2 = Worksheets("Pivot Table").PivotTables("PivotTable").PivotFields("Test Info")

 'clear the chart from previous run
  chartcount = 0
  Sheets("Pivot Table Graph").ChartObjects("Chart 1").Chart.ChartArea.ClearContents

  On Error GoTo ErrHandler

 'find each visible unit
  For Each PI1 In PF1.PivotItems

  If PI1.Visible = True Then
     Unit = PI1.Name

     For Each PI2 In PF2.PivotItems

     'for each unit and test condition find the information at their intersection
       If PI2.Visible = True Then
       TC = PI2.Name


    'find the information that corresponds to each unit/test condition combination
    Intersect(pt.PivotFields("Plant").PivotItems(Unit).DataRange.EntireRow, pt.PivotFields("Test Info").PivotItems(TC).DataRange).Select
    Selection.Offset(-1, 0).Select
    ForXRanges = "='Pivot Table'!" & Selection.Address
    Selection.Offset(0, 1).Select
    ForYRanges = "='Pivot Table'!" & Selection.Address
    ForRangesName = Unit & "_" & TC

    'for each combination create a new series on the chart
    chartcount = chartcount + 1
    Sheets("Pivot Table Graph").ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(chartcount).Name = ForRangesName
    ActiveChart.SeriesCollection(chartcount).XValues = ForXRanges
    ActiveChart.SeriesCollection(chartcount).Values = ForYRanges

End If

NextIteration:
Next PI2

End If
Next PI1

Exit Sub

ErrHandler:
Resume NextIteration:

End Sub

Antwort1

Ein besserer Ansatz wäre, Ihre Daten mit einer if-Anweisung zu testen, um sicherzustellen, dass Ihre Daten gültig sind. Wenn nicht, fahren Sie nicht mit dem Codeblock fort, da dies einen Fehler erzeugen könnte.

In Ihrem Beispiel könnte dies funktionieren. Ändern Sie Folgendes:

'find the information that corresponds to each unit/test condition combination
Intersect(pt.PivotFields("Plant").PivotItems(Unit).DataRange.EntireRow, pt.PivotFields("Test Info").PivotItems(TC).DataRange).Select
Selection.Offset(-1, 0).Select
ForXRanges = "='Pivot Table'!" & Selection.Address
Selection.Offset(0, 1).Select
ForYRanges = "='Pivot Table'!" & Selection.Address
ForRangesName = Unit & "_" & TC

'for each combination create a new series on the chart
chartcount = chartcount + 1
Sheets("Pivot Table Graph").ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(chartcount).Name = ForRangesName
ActiveChart.SeriesCollection(chartcount).XValues = ForXRanges
ActiveChart.SeriesCollection(chartcount).Values = ForYRanges

Hierzu:

'find the information that corresponds to each unit/test condition combination
Set isect = Application.Intersect(pt.PivotFields("Plant").PivotItems(Unit).DataRange.EntireRow, pt.PivotFields("Test Info").PivotItems(TC).DataRange)

If isect Is Nothing Then 
    'Msgbox "Ranges do not intersect"
Else
    isect.Select 

    Selection.Offset(-1, 0).Select
    ForXRanges = "='Pivot Table'!" & Selection.Address
    Selection.Offset(0, 1).Select
    ForYRanges = "='Pivot Table'!" & Selection.Address
    ForRangesName = Unit & "_" & TC

    'for each combination create a new series on the chart
    chartcount = chartcount + 1
    Sheets("Pivot Table Graph").ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(chartcount).Name = ForRangesName
    ActiveChart.SeriesCollection(chartcount).XValues = ForXRanges
    ActiveChart.SeriesCollection(chartcount).Values = ForYRanges
End If

Ich kann dies nicht testen, da ich Ihr Arbeitsbuch nicht habe, aber falls es nicht funktioniert, sollte es den Ansatz demonstrieren.

Antwort2

gotoSie können Fehler ohne VBA wie folgt behandeln :

Sub ErrorHandling()
Dim A, d

On Error Resume Next    
REM Line that throws an error
A = A / 0
REM Store details about your error before it gets cleared
d = Err.Description

On Error GoTo 0

REM You see and can handle your error message here
MsgBox d  
End Sub

On Error Resume NextDeaktiviert das Auslösen von Fehlern

On Error GoTo 0Ermöglicht das Auslösen von Fehlern und das Löschen des ErrObjekts

Antwort3

Ich habe mir schließlich selbst die Fragen beantwortet, indem ich weiter alte Beiträge usw. durchgesehen habe.http://www.cpearson.com/excel/errorhandling.htmäußerst hilfreich zu sein.

Es stellte sich heraus, dass ich versucht hatte, zwei goto-Befehle zu verwenden, zuerst, um zum Fehlerhandler zu gelangen, dann, um zur nächsten Iteration zu gelangen. Was ich tun musste, war, das zweite goto zu ändern, um fortzufahren.

Vielen Dank für all die Hilfe, Leute, der obige Code läuft perfekt!

verwandte Informationen