Excel VBA-код для пропуска строк / перейти к команде

Я построил код в excel, чтобы взять данные из сводной таблицы и вставить его в диаграмму, сводная диаграмма, непосредственно связанная с таблицей, не даст мне возможности управления, которую я ищу. Причина, по которой я столкнулся с проблемой создания такого "сложного" кода, заключается в том, что для каждой комбинации информации о заводе и тесте мне нужно, чтобы она была отдельной записью в диаграмме.

таким образом, основной смысл этого кода состоит в том, чтобы пройти через каждое растение и проверить комбинацию информации (вложенную для команды) затем вставьте данные в диаграмму. Мой пользователь не будет изменять расположение столбцов для x и y, поэтому смещения работают нормально.

моя проблема в том, что если комбинация завод / тестовая информация не существует, она все равно попадает на график. Когда я пытаюсь использовать команду goto и отправить ее на следующий PI2, используя errorhandle, она не работает (возможно, из-за вложенных команд if). Я искал вокруг, пытаясь найти команду, которая могла бы отправить мой код в определенную строку код (i.e сразу после команд графика), но не повезло...

кто-нибудь знает, как перейти к определенной строке в случае ошибки?

Я добавил набор команд для возобновления на следующем PI2, где я говорю об ошибке goto 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
24
задан Sarah Hartman
08.02.2023 0:33 Количество просмотров материала 2433
Распечатать страницу

3 ответа

вы можете обрабатывать ошибки без 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 объект

0
отвечен Vojtěch Dohnal 2023-02-09 08:21

Я закончил тем, что ответил на свои вопросы, продолжая просматривать старые сообщения и т. д., I found http://www.cpearson.com/excel/errorhandling.htm быть весьма полезно.

оказалось, что я пытался использовать две команды goto: сначала перейти к обработчику ошибок, затем перейти к следующей итерации. Что мне нужно было сделать, так это изменить второй goto, чтобы возобновить.

Спасибо за всю помощь, ребята, приведенный выше код работает отлично!

0
отвечен Sarah Hartman 2023-02-09 10:38

было бы лучше, чтобы проверить ваши данные с помощью 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

Я не в состоянии проверить это, так как у меня нет вашей книги, но если он не работает, он должен продемонстрировать подход.

0
отвечен picklemonkey 2023-02-09 12:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх