EXCEL VBA问题返回#值!而不是通过数据透视表执行false

EXCEL VBA问题返回#值!而不是通过数据透视表执行false,vba,excel,pivot-table,Vba,Excel,Pivot Table,我是VBA编程新手,遇到了一个奇怪的问题。 因此,我有一个包含3种类型行(“用户”、“全名”、“权限”)的透视表 我编写了一个程序,在数据透视表中查找某个名称x,一旦找到该名称,它将查看以下“权限”,如果它们“有权限”,则返回“True”。现在,当它返回“True”时,情况很好,但由于某种原因,每次它都失败,而不是像我想的那样返回false,它会返回#VALUE!,有人知道为什么吗 Public Function Dependency(x As String) As String Dim rn

我是VBA编程新手,遇到了一个奇怪的问题。 因此,我有一个包含3种类型行(“用户”、“全名”、“权限”)的透视表

我编写了一个程序,在
数据透视表中查找某个名称
x
,一旦找到该名称,它将查看以下“权限”,如果它们“有权限”,则返回“True”。现在,当它返回“True”时,情况很好,但由于某种原因,每次它都失败,而不是像我想的那样返回false,它会返回#VALUE!,有人知道为什么吗

Public Function Dependency(x As String) As String

Dim rngRow As Range
Dim pt As PivotTable
Dim pf2Value As String
Dim pf3Value As String

pf2Value = "False"
pf3Value = "False"
Set pt = ActiveSheet.PivotTables("PivotTable1")

For Each rngRow In pt.RowRange        
    If pf2Value = "True" And rngRow.PivotField.Name = "Permissions" Then
        If rngRow.Value = "Has Permissions" Then
                pf3Value = "True"
        End If
    End If
    If pf2Value = "True" And pf3Value = "True" And rngRow.PivotField.Name <> "Permissions" Then Exit For
    If rngRow.PivotField.Name = "Full Name" And rngRow.Value = x Then
        pf2Value = "True"
    End If
    If rngRow.PivotField.Name = "Full Name" And rngRow.Value <> x Then
        pf2Value = "False"
    End If
Next rngRow
Dependency = pf3Value

End Function
当我添加此行时,问题开始:

Public Function Dependency(x As String) As String

Dim rngRow As Range
Dim pt As PivotTable
Dim pf2Value As String
Dim pf3Value As String

pf2Value = "False"
pf3Value = "False"
Set pt = ActiveSheet.PivotTables("PivotTable1")

For Each rngRow In pt.RowRange
    If pf2Value = "True" And rngRow.PivotField.Name = "Permissions" Then
    End If
Next rngRow
Dependency = pf3Value

End Function
尝试下面的代码(代码内部的解释为注释):

公共功能依赖代码

Option Explicit

Public Function Dependency(x As String) As String

Dim pt          As PivotTable
Dim ptNameFld   As PivotField
Dim ptPermFld   As PivotField
Dim C           As Range

' set the Pivto-Table object, modify "Sheet1" with your sheet's name
Set pt = Worksheets("Sheet1").PivotTables("PivotTable1")

' set the Pivot Field "Full Name"
Set ptNameFld = pt.PivotFields("Full Name")

' set the Pivot Field "Permissions"
Set ptPermFld = pt.PivotFields("Permissions")

' loop through all rows in "Full Name" data range
For Each C In ptNameFld.DataRange.Rows
    If C.Value2 Like x Then ' if the name matches "x"
        ' for DEBUG Only
        'Debug.Print ptPermFld.DataRange(C.Row - ptPermFld.LabelRange.Row)

        Dependency = ptPermFld.DataRange(C.Row - ptPermFld.LabelRange.Row) ' get the value of "Permission", of the same row
        Exit For
    End If
Next C

End Function
子测试依赖项代码(用于测试函数)


当您说您正在查找名称
x
,您的意思是在
数据透视表的字段名
“全名”
?@ShaiRado,是的!x将类似于“John Doe”,每一行的全名都有一个类似于“Jane Smith”的值,我将x与全名值进行比较,以找到合适的人。我应该补充一点,这些行都在一列中,请参见下面我的答案和代码
Option Explicit

Public Function Dependency(x As String) As String

Dim pt          As PivotTable
Dim ptNameFld   As PivotField
Dim ptPermFld   As PivotField
Dim C           As Range

' set the Pivto-Table object, modify "Sheet1" with your sheet's name
Set pt = Worksheets("Sheet1").PivotTables("PivotTable1")

' set the Pivot Field "Full Name"
Set ptNameFld = pt.PivotFields("Full Name")

' set the Pivot Field "Permissions"
Set ptPermFld = pt.PivotFields("Permissions")

' loop through all rows in "Full Name" data range
For Each C In ptNameFld.DataRange.Rows
    If C.Value2 Like x Then ' if the name matches "x"
        ' for DEBUG Only
        'Debug.Print ptPermFld.DataRange(C.Row - ptPermFld.LabelRange.Row)

        Dependency = ptPermFld.DataRange(C.Row - ptPermFld.LabelRange.Row) ' get the value of "Permission", of the same row
        Exit For
    End If
Next C

End Function
Sub TestDependency()

MsgBox Dependency("John Doe")

End Sub