Ошибка времени выполнения 91 при использовании On Error GoTo logic - PullRequest
0 голосов
/ 05 ноября 2019

В настоящее время я сталкиваюсь с проблемой, когда у меня есть некоторая логика в Excel VBA, которая позволяет мне пропускать части функции. Проблема в том, что он работает в некоторых областях, но не работает в других областях. У меня есть 3 зоны для катания на лыжах, и первые две работают, но последняя не кажется. В настоящее время я получаю сообщение об ошибке 91: переменная объекта или переменная с блоком не установлены, но я очень четко установил переменную до начала раздела кода.

Я пытался жестко кодировать переменную, ииспользуя отдельные переменные, но, к сожалению, кажется, что ничего не работает для этого последнего куска.

Sub Tester()
'FIRST PART - BUILD HIGH LEVEL METRICS
    Application.DisplayAlerts = False
    Dim tSheet, sARR As Worksheet
    Dim dateSel, rFinder, rFinderTemp As Variant
    Dim pTable As PivotTable
    Dim pRange As Range
    Dim lastRow, lastCol, i, j, rnum As Long
    Dim pAddy As String

    dateSel = "11/17/2019"

    Application.DisplayAlerts = False
    Sheets.Add before:=ActiveSheet
    ActiveSheet.Name = "TempTable"
    Set tSheet = Worksheets("TempTable")
    Set sARR = Worksheets("All_Risk_Report")

    lastRow = sARR.Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = sARR.Cells(1, Columns.Count).End(xlToLeft).Column

    Set pRange = sARR.Cells(1, 1).Resize(lastRow, lastCol)
    pAddy = sARR.Name & "!" & pRange.address

    Set pTable = ActiveWorkbook.PivotCaches.Create( _
            SourceType:=xlDatabase, _
            SourceData:=pAddy).CreatePivotTable( _
                TableDestination:=tSheet.Cells(2, 2))

    With pTable
        .PivotFields("GROUPDATE").Orientation = xlPageField
        .PivotFields("GROUPDATE").CurrentPage = dateSel
        .PivotFields("CRL").Orientation = xlColumnField
        .PivotFields("Org_Category").Orientation = xlRowField
        .PivotFields("Change_Request").Orientation = xlDataField
    End With

    With pTable.PivotFields("Sum of Change_Request")
        .Function = xlCount
    End With

    Sheets("TempTable").Activate
    ActiveSheet.Cells(1, 1).Select

    rFinder = 0
    On Error GoTo Skipper1

       Let rFinder = Sheets("TempTable").Cells.Find("Enterprise").Row

        If rFinder > 0 Then
            Sheets("TempTable").Range("C" & rFinder & ":H" & rFinder).Select
            Selection.Copy
            Sheets("Calendar").Activate
            ActiveSheet.Range("K4:P4").Select
            Selection.PasteSpecial Paste:=xlPasteValues
            rFinderTemp = rFinder
        End If

Skipper1:

    Sheets("TempTable").Activate
    ActiveSheet.Cells(1, 1).Select
    rFinder = 0

    On Error GoTo Skipper2
        Let rFinder = Sheets("TempTable").Cells.Find("Home Office").Row

        If rFinder > 0 Then
            Sheets("TempTable").Range("C" & rFinder & ":H" & rFinder).Select
            Selection.Copy
            Sheets("Calendar").Activate
            ActiveSheet.Range("K5:P5").Select
            Selection.PasteSpecial Paste:=xlPasteValues
            rFinderTemp = rFinder
        End If

Skipper2:

    Sheets("TempTable").Activate
    ActiveSheet.Cells(1, 1).Select
    rFinder = 0

    On Error GoTo Skipper3
        Let rFinder = Sheets("TempTable").Cells.Find("WIMT").Row

        If rFinder > 0 Then
            Sheets("TempTable").Range("C" & rFinder & ":H" & rFinder).Select
            Selection.Copy
            Sheets("Calendar").Activate
            ActiveSheet.Range("K6:P6").Select
            Selection.PasteSpecial Paste:=xlPasteValues
            rFinderTemp = rFinder
        End If

Skipper3:

    Sheets("TempTable").Activate
    ActiveSheet.Cells(1, 1).Select

    rnum = rFinder + 1

    If rFinderTemp > rFinder Then
        rnum = rFinderTemp + 1
    End If

        Sheets("TempTable").Range("C" & rnum & ":H" & rnum).Select
        Selection.Copy
        Sheets("Calendar").Activate
        ActiveSheet.Range("K7:P7").Select
        Selection.PasteSpecial Paste:=xlPasteValues

    With Sheets("Calendar")
        For i = 4 To 7
            For j = 11 To 16
                Cells(i, j).Select

                If Selection.Value = "" Then
                    Selection.Value = 0
                End If
            Next
        Next
    End With

    Sheets("TempTable").Activate
    ActiveSheet.Delete
    Sheets("Calendar").Activate

End Sub

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

Любая помощь или советВы могли бы дать, будет принята с благодарностью. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019
  1. Let не требуется.

  2. Укажите необязательные параметры Find (LookIn, LookAt и т. Д.). Из документов:

Настройки LookIn, LookAt, SearchOrder и MatchByte сохраняются при каждом использовании этого метода. Если вы не укажете значения для этих аргументов при следующем вызове метода, будут использованы сохраненные значения. Установка этих аргументов изменяет настройки в диалоговом окне «Поиск», а изменение настроек в диалоговом окне «Поиск» изменяет сохраненные значения, которые используются, если вы пропустите аргументы. Чтобы избежать проблем, устанавливайте эти аргументы явно каждый раз, когда вы используете этот метод.

Не думайте, что Find успешен. Это включает в себя избегание цепочки .Row или .Column или другого вызова по окончании после Find, например ...Cells.Find("Enterprise").Row. Обычная практика - проверять, не является ли результат поиска ничем:
Dim rng as Range
Set rng = Sheets("TempTable").Cells.Find(What:="WIMT", LookIn:=xlValues, LookAt:=xlWhole)

If Not rng Is Nothing Then ' the find is successful
   ... work with rng, with its .Row, etc.
End If
0 голосов
/ 05 ноября 2019

Большое вам спасибо за ваши обновления! Я сделал некоторые изменения в коде, и теперь он работает отлично. Смотрите ниже:

Sub Tester()
'FIRST PART - BUILD HIGH LEVEL METRICS
    Application.DisplayAlerts = False
    Dim tSheet, sARR As Worksheet
    Dim dateSel, rFinderTemp As Variant
    Dim pTable As PivotTable
    Dim pRange, rFinder As Range
    Dim lastRow, lastCol, i, j, rnum As Long
    Dim pAddy As String

    dateSel = "11/17/2019"

    Application.DisplayAlerts = False
    Sheets.Add before:=ActiveSheet
    ActiveSheet.Name = "TempTable"
    Set tSheet = Worksheets("TempTable")
    Set sARR = Worksheets("All_Risk_Report")

    lastRow = sARR.Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = sARR.Cells(1, Columns.Count).End(xlToLeft).Column

    Set pRange = sARR.Cells(1, 1).Resize(lastRow, lastCol)
    pAddy = sARR.Name & "!" & pRange.address

    Set pTable = ActiveWorkbook.PivotCaches.Create( _
            SourceType:=xlDatabase, _
            SourceData:=pAddy).CreatePivotTable( _
                TableDestination:=tSheet.Cells(2, 2))

    With pTable
        .PivotFields("GROUPDATE").Orientation = xlPageField
        .PivotFields("GROUPDATE").CurrentPage = dateSel
        .PivotFields("CRL").Orientation = xlColumnField
        .PivotFields("Org_Category").Orientation = xlRowField
        .PivotFields("Change_Request").Orientation = xlDataField
    End With

    With pTable.PivotFields("Sum of Change_Request")
        .Function = xlCount
    End With

    Sheets("TempTable").Activate

    Set rFinder = Sheets("TempTable").Cells.Find( _
        What:="Enterprise", _
        LookIn:=xlValues, _
        LookAt:=xlWhole)

    If Not rFinder Is Nothing Then
        Sheets("TempTable").Range("C" & rFinder.Row & ":H" & rFinder.Row).Select
        Selection.Copy
        Sheets("Calendar").Activate
        ActiveSheet.Range("K4:P4").Select
        Selection.PasteSpecial Paste:=xlPasteValues
        rFinderTemp = rFinder.Row
    End If

    Sheets("TempTable").Activate


    Set rFinder = Sheets("TempTable").Cells.Find( _
        What:="Home Office", _
        LookIn:=xlValues, _
        LookAt:=xlWhole)

    If Not rFinder Is Nothing Then
        Sheets("TempTable").Range("C" & rFinder & ":H" & rFinder).Select
        Selection.Copy
        Sheets("Calendar").Activate
        ActiveSheet.Range("K5:P5").Select
        Selection.PasteSpecial Paste:=xlPasteValues
        rFinderTemp = rFinder.Row
    End If

    Sheets("TempTable").Activate

    Set rFinder = Sheets("TempTable").Cells.Find( _
        What:="WIMT", _
        LookIn:=xlValues, _
        LookAt:=xlWhole)

    If Not rFinder Is Nothing Then
        Sheets("TempTable").Range("C" & rFinder.Row & ":H" & rFinder.Row).Select
        Selection.Copy
        Sheets("Calendar").Activate
        ActiveSheet.Range("K6:P6").Select
        Selection.PasteSpecial Paste:=xlPasteValues
        rFinderTemp = rFinder.Row
    End If

    Sheets("TempTable").Activate
    ActiveSheet.Cells(1, 1).Select

    If Not rFinder Is Nothing Then
        rnum = rFinder.Row + 1
        Else
        rnum = rFinderTemp + 1
    End If

        Sheets("TempTable").Range("C" & rnum & ":H" & rnum).Select
        Selection.Copy
        Sheets("Calendar").Activate
        ActiveSheet.Range("K7:P7").Select
        Selection.PasteSpecial Paste:=xlPasteValues

    With Sheets("Calendar")
        For i = 4 To 7
            For j = 11 To 16
                Cells(i, j).Select

                If Selection.Value = "" Then
                    Selection.Value = 0
                End If
            Next
        Next
    End With

    Sheets("TempTable").Activate
    ActiveSheet.Delete
    Sheets("Calendar").Activate

End Sub
...