我有一个宏,它贯穿几个枢轴表。在这个选项中,如果没有可用的选项,例如,我尝试选择数字50,但这不在数据透视表中。我希望它选择空白。我已经做了一个On error GoTo --当代码不在的时候,它可以工作,但是如果代码在那里,它的作用就好像它不是,并且在过滤器中返回空白值。有人能说出我做错了什么吗?
Sub SelectPromoter()
Dim a As String
Dim pt As PivotTable
On Error GoTo Other
ThisWorkbook.Worksheets("New Account Details - Name").Activate
a = Worksheets("Selection").Cells(3, 1).Value
For Each pt In ActiveSheet.PivotTables
With pt.PivotFields("Promoter code")
.ClearAllFilters
.CurrentPage = a
End With
Other:
ActiveSheet.PivotTables("PivotTable4").PivotFields("Promotor code").CurrentPage = "(blank)"
' Select here to add any other key filters for the pivot table using fixed criteria
ActiveSheet.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").ClearAllFilters
ActiveSheet.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").CurrentPage = "(All)"
With ActiveSheet.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?")
.PivotItems("N").Visible = False
End With
Next
End Sub发布于 2021-03-30 12:14:38
如果我正确理解了您的问题陈述,这将修复它:
Sub SelectPromoter()
Dim wsAccountDetails As Worksheet
Set wsAccountDetails = ThisWorkbook.Worksheets("New Account Details - Name")
Dim a As String
a = Worksheets("Selection").Cells(3, 1).Value
On Error GoTo Data_NotFound
Dim pt As PivotTable
For Each pt In wsAccountDetails.PivotTables
With pt.PivotFields("Promoter code")
.ClearAllFilters
.CurrentPage = a
End With
GoTo Data_Found
Data_NotFound:
ActiveSheet.PivotTables("PivotTable4").PivotFields("Promotor code").CurrentPage = "(blank)"
Data_Found:
With wsAccountDetails
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").ClearAllFilters
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").CurrentPage = "(All)"
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").PivotItems("N").Visible = False
End With
Next pt
End Sub这里的相关行是GoTo Data_Found。如果不包括该行,则无论是否发生错误,标签Other:下的代码都将被执行。这就是为什么你需要“跳过去”。GoTo标签不是if-,这意味着它们对控制流没有直接影响,您必须使用GoTo手动实现该逻辑。虽然GoTo-statements没有被认为是最佳实践,但它们确实有一些(即使很少)真正的用例。您可以阅读更多关于它们如何运行这里的信息。
我不习惯使用枢轴表,但我假设有一种方法可以检查某个值是否可用。正确地处理这些情况比简单地让错误被抛出并捕获它们更可取,因为当错误发生时,您不会注意到不同的错误。如果你决定坚持这种方法,你至少应该尽可能地限制它:
Sub SelectPromoter()
Dim wsAccountDetails As Worksheet
Set wsAccountDetails = ThisWorkbook.Worksheets("New Account Details - Name")
Dim a As String
a = Worksheets("Selection").Cells(3, 1).Value
Dim pt As PivotTable
For Each pt In wsAccountDetails.PivotTables
On Error GoTo Data_NotFound
With pt.PivotFields("Promoter code")
.ClearAllFilters
.CurrentPage = a
End With
On Error GoTo 0
GoTo Data_Found
Data_NotFound:
ActiveSheet.PivotTables("PivotTable4").PivotFields("Promotor code").CurrentPage = "(blank)"
Data_Found:
With wsAccountDetails
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").ClearAllFilters
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").CurrentPage = "(All)"
.PivotTables("PivotTable4").PivotFields("Milvus Account Name Change?").PivotItems("N").Visible = False
End With
Next
End Sub请看一下我在哪里移动了有关错误处理On Error ...的行。
也请看一下如何避免在Excel中使用Select。您通常应该避免使用.Select和.Activate,因为它们效率低下,容易出错。我为代码提供了一种更好的方法,即使用Worksheet对象直接寻址工作表。
发布于 2021-03-30 12:27:52
如果我正确地理解了你的问题,问题是当你的代码被写好的时候,下面的一节会一直执行,当没有错误发生的时候,代码应该在它之前停止,对吗?
在这种情况下,解决方案很简单--在退出sub之前添加。因此,下面的代码只有在发送错误句柄时才会执行。
我也是VBA,但通常错误处理程序是在代码末尾编写的,“普通”代码以Exit sub结尾。
https://stackoverflow.com/questions/66869947
复制相似问题