首页 > 解决方案 > [vba]Viewsingle Filter 属性返回运行时错误

问题描述

我一直在为 MS Project 编写一个相当复杂的例程。长话短说,每当我尝试访问单个视图对象的过滤器属性时,我都会收到运行时错误“1101”(参数无效)。我可以在即时和代码中访问所有其他属性(无论它是否存在)。

实际的代码是


If vS.Filter <> "" Then '有一个过滤器 ..do stuff End if


对象模型声明 .Filter 属性是 Set/Get(并且 .Filter 名称是字符串)。

所以,我很困惑 - 如果有人遇到过这个知道答案,我将不胜感激。

//添加代码片段。我已经为过滤器修复了这个问题,但是相同的修复程序不适用于表 IF(我想这对于过滤器可能是相同的)视图遭受了一些损坏并且缺少表(或过滤器?)对象。我认为我需要为运行时错误添加一个错误检查器 - 在这种情况下,似乎无法实际测试是否存在 Get/Set Object 属性。


Dim v As View, vS As ViewSingle, vC As ViewCombination, pctDone As Single, lcount As Long Dim f As Filter, t As Table

对于 ThisProject.Views 中的每个 v

lcount = lcount + 1

If v.Single Then   'Process Single views first

        Set vS = ThisProject.ViewsSingle.Item(v.Name)

        'Check for Resource type
        Select Case True
            Case v.Type = pjResourceItem

                'check filter
                Set f = vS.Filter
                If f.Name <> "" Then  'have a filter
                    For lnglist = 1 To ColRFExPreview.Count

                        If f.Name = ColRFExPreview.Item(lnglist) Then
                            lngLbInd = lnglist - 1
                            f.Name = VTI_FRM.LB_ResFltrs.List(lngLbInd)
                            vS.Filter = f
                        End If
                    Next
                End If

                'check table (we will always check the table)
                Set t = vS.Table
                For lnglist = 1 To ColRTExPreview.Count

                    If t.Name = ColRTExPreview.Item(lnglist) Then
                        lngLbInd = lnglist - 1
                        t.Name = VTI_FRM.LB_ResTbles.List(lngLbInd)
                        vS.Table = t
                    End If
                Next

            Case Else   'Not a resource type

                'check filter
                Set f = vS.Filter
                If f.Name <> "" Then  'have a filter
                    For lnglist = 1 To ColTFExPreview.Count
                        If f.Name = ColTFExPreview.Item(lnglist) Then
                            lngLbInd = lnglist - 1
                            f.Name = VTI_FRM.LB_FILTERS.List(lngLbInd)
                            vS.Filter = f
                        End If
                    Next
                End If

                'check table (we will always check the table)
                Set t = vS.Table
                For lnglist = 1 To ColTTExPreview.Count
                    If t.Name = ColTTExPreview.Item(lnglist) Then
                        lngLbInd = lnglist - 1
                        t.Name = VTI_FRM.LB_TABLES.List(lngLbInd)
                        vS.Table = t
                    End If
                Next

            End Select

        Else    'Combination View - just need to check that Bottomview and topview need to change

            Set vC = ThisProject.ViewsCombination(v.Name)

            For lnglist = 1 To ColViewExPreview.Count

                If vC.BottomView.Name = ColViewExPreview.Item(lnglist) Then
                    lngLbInd = lnglist - 1
                    vC.BottomView.Name = VTI_FRM.LB_Views.List(lngLbInd)
                End If

                If vC.TopView.Name = ColViewExPreview.Item(lnglist) Then
                    lngLbInd = lnglist - 1
                    vC.TopView.Name = VTI_FRM.LB_Views.List(lngLbInd)
                End If

            Next


    End If

标签: vbams-projectobject-model

解决方案


推荐阅读