Excel VBA - 줄을 건너뛰는 코드/goto 명령

Excel VBA - 줄을 건너뛰는 코드/goto 명령

피벗 테이블에서 데이터를 가져와 차트에 삽입하기 위해 Excel에 코드를 작성했습니다. 테이블에 직접 연결된 피벗 차트는 내가 찾고 있는 조작성을 제공하지 않습니다. 내가 이렇게 '복잡한' 코드를 만드는 수고를 겪은 이유는 각 플랜트 및 테스트 정보 조합에 대해 차트에 별도의 항목이 필요하기 때문입니다.

따라서 이 코드의 주요 요점은 각 플랜트 및 테스트 정보 조합(명령에 대해 중첩된 항목)을 살펴본 다음 데이터를 차트에 삽입하는 것입니다. 내 사용자는 x와 y의 열 위치를 변경하지 않으므로 오프셋이 제대로 작동합니다.

내 문제는 플랜트/테스트 정보 조합이 존재하지 않으면 어쨌든 차트에 입력된다는 것입니다. goto 명령을 사용하고 오류 핸들을 사용하여 Next PI2로 보내려고 하면 작동하지 않습니다(내포된 if 명령 때문일 수 있음). 내 코드를 코드의 특정 줄(예: 그래프 명령 바로 뒤)로 보낼 수 있는 명령을 찾으려고 노력했지만 운이 없었습니다...

오류 발생 시 특정 줄로 건너뛰는 방법을 아는 사람이 있나요?

다음 PI2에서 재개할 명령 세트를 추가했습니다. 여기서 오류가 발생하면 errhandler로 이동하고 errhandler에서 다음 반복으로 이동하지만 코드를 실행하고 오류가 발생하면 이 경로를 통과하지 않습니다. 대신 '교차' 선에서 멈춥니다.

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

답변1

더 나은 접근 방식은 if 문을 사용하여 데이터를 테스트하여 데이터가 유효한지 확인하는 것입니다. 그렇지 않은 경우 오류가 발생할 수 있는 코드 블록을 진행하지 마세요.

귀하의 예에서는 이것이 작동할 수 있습니다... 이것을 변경하십시오:

'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

이에:

'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

귀하의 통합 문서가 없기 때문에 이를 테스트할 수 없습니다. 그러나 작동하지 않으면 접근 방식을 보여 주어야 합니다.

답변2

goto다음과 같이 VBA 없이 오류를 처리할 수 있습니다 .

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 Next오류 발생을 비활성화합니다.

On Error GoTo 0오류 발생을 활성화하고 Err객체 를 지웁니다.

답변3

나는 이전 게시물 등을 계속해서 살펴보며 내 자신의 질문에 대답하게 되었습니다.http://www.cpearson.com/excel/errorhandling.htm매우 도움이 됩니다.

나는 두 개의 goto 명령을 사용하려고 시도하고 있었는데, 먼저 오류 처리기로 이동한 다음 다음 반복으로 이동하려고 했습니다. 내가 해야 할 일은 재개하기 위해 두 번째 goto를 변경하는 것이었습니다.

모든 도움을 주셔서 감사합니다. 위 코드는 완벽하게 실행됩니다!

관련 정보