피벗 테이블에서 데이터를 가져와 차트에 삽입하기 위해 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를 변경하는 것이었습니다.
모든 도움을 주셔서 감사합니다. 위 코드는 완벽하게 실행됩니다!