Excel VBA:基于列标签的数据透视表的条件格式

时间:2019-02-11 13:41:52

标签: excel vba

(注意:这是我的第一个问题。请告诉我是否可以改善提问或解释的方式)

我创建了一个模块,该模块可以浏览任何excel工作表上的数据透视表,并将条件格式应用于每一列以创建四分位数效果。

数据透视表可以是任意大小,并且在任何位置都有不同的列-因此,我无法明确引用特定的列名或标题等

此外,四分位数报告会标识特定数字的前25%,后25,后25和后25。 对于某些数字,较高者为佳;对于其他人来说,低点更好。

所以我列出了数组中所有从高到低的值,然后运行一个快速的“如果数组中有名字,以这种方式排序;否则,以这种方式排序”功能。

所有这些工作都像一场梦一样-直到我们进入某些导致名称不明确(和错误)的字段为止。似乎某些标题名称与源名称或数据库名称相似。

代码如下所示。

有什么想法可以动态引用列名并标识其下方的列吗?

    Dim myColumnNames As Variant

    myColumnNames = VBA.Array("CONTRACTGROSSVOLUME", _
                            "MigrationVolume")  'etc

'   Set colour choices for quartiles
    Dim myQuartile1 As Long
    Dim myQuartile2 As Long
    Dim myQuartile3 As Long
    Dim myQuartile4 As Long

    myQuartile1 = RGB(146, 208, 80)     'Top Quartile - Green
    myQuartile2 = RGB(255, 255, 0)      '2nd Quartile - yellow
    myQuartile3 = RGB(255, 192, 0)      '3rd Quartile - orange
    myQuartile4 = RGB(255, 0, 0)        'Bottom Quartile - red

    Dim myRankingFactor As Boolean
    myRankingFactor = True   'true is low to high / false is high to low ranking

    Dim myPivotTable As PivotTable
    Dim myPivotTableName As String

    For Each myPivotTable In ActiveSheet.PivotTables
        myPivotTableName = myPivotTable.Name
    Next

    Dim myPivotField As PivotField
    Dim myPivotSourceName As String

    Set myPivotTable = ActiveSheet.PivotTables(myPivotTableName)


    For Each myPivotField In myPivotTable.DataFields


        'get the source name for the pivot field
        myPivotSourceName = myPivotField.Name

        'Check if column name is in our list to rank high-to-low
        If Not IsError(Application.Match(myPivotSourceName, myColumnNames, False)) Then

            'This column name is in our list of names that should be ranked high-to-low (ie. Higher is better)
            myRankingFactor = True

        Else
            'This column name is not in our list and should be ranked low-to-high (ie. lower is better)
            myRankingFactor = False

        End If

然后错误出现在以下行:

 myPivotTable.PivotSelect (myPivotSourceName), xlDataOnly, True

我尝试用.caption,.name等引用该列-无济于事。 我需要做些什么来动态获取列名,检查它是否在名称数组中,然后参考整列以应用我的格式?

谢谢


其他信息:

该值(显然)正确传递。 显示的列名称为“我的卷”,变量显示为“我的卷”作为值。 它的源名称是“ MYVOLUME”(一个字),我也曾尝试引用它,但没有成功。

生成的错误是:

  

运行时错误'1004':项目名称不明确。另一个领域   数据透视表报表中可能包含相同名称的项目。使用语法   字段[item]。例如,如果项目是“橙色”,而字段是   产品,则应使用产品[橙色]。

此外,我只是手动将列名称之一更改为数据库,对象或数据输出中任何地方都不存在的唯一单个单词(“ ABCDEFG”),以查看是否将其取用

更改该别名/标题值工作正常,并且没有错误。

摘要: 看起来好像列名已在数据透视表中的其他位置使用,但事实并非如此。 如何动态地明确引用列名/标题/标签? :)

已修复!

我确保数据透视表的列名作为字符串传递:

myPivotSourceName = myPivotField.Name

然后,我没有使用数据透视表字段对象引用数据字段,而是使用字符串引用了DataRange:

myPivotTable.PivotFields(myPivotSourceName).DataRange.Select

完美工作,并且对于任何具有任何字段的工作表上的任何数据透视表都是完全可移植的

2 个答案:

答案 0 :(得分:0)

我可以通过具有与数据字段之一相同名称的数据项来重现错误。例如,如果您有下表创建数据透视表:

Product      Price
Cola           123
Fanta          456
Sum of Price   789

然后,通过创建数据透视表,您将拥有以下项目:可乐,芬达,“价格总和”,以及以下字段标签:“行标签”,“价格总和”。 如果您尝试在PivotTable.PivotSelect函数中使用“价格总和”,则会出现问题中的错误消息。

我认为PivotSelect中的Name参数不够清楚,我没有找到其中使用的命名约定的文档,因此我建议明确引用数据字段:

myPivotTable.PivotFields("Sum of Price").DataRange.Select

注意:您的代码中有很多样式错误,例如多余的部分。不需要导致错误的行中的括号,循环只需选择最后一项。

答案 1 :(得分:0)

myPivotTable.PivotFields(myPivotSourceName).DataRange.Select

这将列名引用为字符串。适用于我测试过的所有数据透视表。