Excel 使用On Error GoTo逻辑时出现运行时错误91
我目前遇到一个问题,excel VBA中有一些逻辑,允许我跳过函数的某些部分。问题是,它在某些领域起作用,但在其他领域不起作用。我有3个可跳过的区域,前两个工作,但最后一个似乎没有。我目前得到一个运行时错误91:未设置对象变量或With Block变量,但我在代码部分开始之前非常清楚地设置了变量 我尝试过对变量进行编码,并使用单独的变量,但不幸的是,最后一部分似乎没有任何效果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
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来保持缩进一致。也。。。很多。选择/。激活可以/应该被删除。