首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于没有错误的VBA行活动

关于没有错误的VBA行活动
EN

Stack Overflow用户
提问于 2021-03-30 11:14:17
回答 2查看 61关注 0票数 1

我有一个宏,它贯穿几个枢轴表。在这个选项中,如果没有可用的选项,例如,我尝试选择数字50,但这不在数据透视表中。我希望它选择空白。我已经做了一个On error GoTo --当代码不在的时候,它可以工作,但是如果代码在那里,它的作用就好像它不是,并且在过滤器中返回空白值。有人能说出我做错了什么吗?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-30 12:14:38

如果我正确理解了您的问题陈述,这将修复它:

代码语言:javascript
复制
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没有被认为是最佳实践,但它们确实有一些(即使很少)真正的用例。您可以阅读更多关于它们如何运行这里的信息。

我不习惯使用枢轴表,但我假设有一种方法可以检查某个值是否可用。正确地处理这些情况比简单地让错误被抛出并捕获它们更可取,因为当错误发生时,您不会注意到不同的错误。如果你决定坚持这种方法,你至少应该尽可能地限制它:

代码语言:javascript
复制
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对象直接寻址工作表。

票数 2
EN

Stack Overflow用户

发布于 2021-03-30 12:27:52

如果我正确地理解了你的问题,问题是当你的代码被写好的时候,下面的一节会一直执行,当没有错误发生的时候,代码应该在它之前停止,对吗?

在这种情况下,解决方案很简单--在退出sub之前添加。因此,下面的代码只有在发送错误句柄时才会执行。

我也是VBA,但通常错误处理程序是在代码末尾编写的,“普通”代码以Exit sub结尾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66869947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档