Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用On Error GoTo逻辑时出现运行时错误91_Excel_Vba_Syntax Error - Fatal编程技术网

Excel 使用On Error GoTo逻辑时出现运行时错误91

Excel 使用On Error GoTo逻辑时出现运行时错误91,excel,vba,syntax-error,Excel,Vba,Syntax Error,我目前遇到一个问题,excel VBA中有一些逻辑,允许我跳过函数的某些部分。问题是,它在某些领域起作用,但在其他领域不起作用。我有3个可跳过的区域,前两个工作,但最后一个似乎没有。我目前得到一个运行时错误91:未设置对象变量或With Block变量,但我在代码部分开始之前非常清楚地设置了变量 我尝试过对变量进行编码,并使用单独的变量,但不幸的是,最后一部分似乎没有任何效果 Sub Tester() 'FIRST PART - BUILD HIGH LEVEL METRICS Appl

我目前遇到一个问题,excel VBA中有一些逻辑,允许我跳过函数的某些部分。问题是,它在某些领域起作用,但在其他领域不起作用。我有3个可跳过的区域,前两个工作,但最后一个似乎没有。我目前得到一个运行时错误91:未设置对象变量或With Block变量,但我在代码部分开始之前非常清楚地设置了变量

我尝试过对变量进行编码,并使用单独的变量,但不幸的是,最后一部分似乎没有任何效果

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
我的预期结果是,如果需要,每个部分都将启动,并且复制行将被正确复制。当代码正常运行时(即:find函数要查找的值实际上在那里),它工作得很好,但是当值不在那里时,它就在我身上

如果您能提供任何帮助或建议,我们将不胜感激。提前谢谢

  • Let
    是不需要的

  • 指定
    Find
    LookIn
    LookAt
    等)的可选参数。从文档中:

  • 每次使用此方法时,都会保存
    LookIn
    LookAt
    SearchOrder
    MatchByte
    的设置。如果下次调用该方法时未为这些参数指定值,则将使用保存的值。设置这些参数会更改“查找”对话框中的设置,如果忽略这些参数,则更改“查找”对话框中的设置会更改已保存的值。为了避免出现问题,请在每次使用此方法时显式设置这些参数

  • 不要假设
    查找
    成功。这包括避免将
    .Row
    .Column
    或其他调用链接到
    Find
    之后的末尾,例如
    …Cells.Find(“企业”).Row
    。通常的做法是检查查找结果是否为空:
  • Let
    是不需要的

  • 指定
    Find
    LookIn
    LookAt
    等)的可选参数。从文档中:

  • 每次使用此方法时,都会保存
    LookIn
    LookAt
    SearchOrder
    MatchByte
    的设置。如果下次调用该方法时未为这些参数指定值,则将使用保存的值。设置这些参数会更改“查找”对话框中的设置,如果忽略这些参数,则更改“查找”对话框中的设置会更改已保存的值。为了避免出现问题,请在每次使用此方法时显式设置这些参数

  • 不要假设
    查找
    成功。这包括避免将
    .Row
    .Column
    或其他调用链接到
    Find
    之后的末尾,例如
    …Cells.Find(“企业”).Row
    。通常的做法是检查查找结果是否为空:

  • 非常感谢你们的更新!我对代码做了一些修改,现在它运行得很好。见下文:

    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
    

    非常感谢你们的更新!我对代码做了一些修改,现在它运行得很好。见下文:

    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
    

    通过错误转到上的
    语句,您隐藏了可能的重要线索,以了解代码为什么不能正常工作。我建议把它们扔掉。除此之外,还有很多
    Activate
    Select
    正在进行,它们很可能也可以直接进行。哪一行抛出了错误?注意,您可以从
    Let rFinder=Sheets(“tentable”).Cells.Find(“Home Office”).Row
    中删除
    Let
    。这一行是您在“On Error GoTo Skipper3”语句之后读到的“Let rFinder=…”行。我不确定发生这种情况的确切原因,因为代码适用于skipper 2部分,但不是这一个。如果你愿意,If将为你的代码创造奇迹。当使用
    goto
    进行错误处理时,请记住这一点。。。它创建了意大利面代码。它可能更适合于构建特定的错误处理(在基本子例程中每行使用if语句)。将来,这将使阅读和理解变得更容易,而不需要您向左/向右/居中滚动来找到您的位置/位置。您正在通过错误转到上的
    语句隐藏可能的重要线索,以了解代码为什么无法工作。我建议把它们扔掉。除此之外,还有很多
    Activate
    Select
    正在进行,它们很可能也可以直接进行。哪一行抛出了错误?注意,您可以从
    Let rFinder=Sheets(“tentable”).Cells.Find(“Home Office”).Row
    中删除
    Let
    。这一行是您在“On Error GoTo Skipper3”语句之后读到的“Let rFinder=…”行。我不确定发生这种情况的确切原因,因为代码适用于skipper 2部分,但不是这一个。如果你愿意,If将为你的代码创造奇迹。当使用
    goto
    进行错误处理时,请记住这一点。。。它创建了意大利面代码。它可能更适合于构建特定的错误处理(在基本子例程中每行使用if语句)。在未来,这将使它更容易阅读和后续,不要求你滚动左/右/中心找到你的位置/位置。考虑使用一个保持压痕一致。也。。。很多这个代码< >选择< /代码> />代码>激活< /代码>可以/应该删除。考虑使用AN来保持缩进一致。也。。。很多
    。选择
    /
    。激活
    可以/应该被删除。