Excel VBA: условный формат сводной таблицы на основе метки столбца - PullRequest
0 голосов
/ 11 февраля 2019

(Примечание: это мой первый вопрос. Пожалуйста, дайте мне знать, если я могу улучшить, как я спрашиваю или объясняю)

Я создал модуль, который может просматривать сводную таблицу на любом листе Excel и применятьусловное форматирование каждого столбца для создания квартильных представлений.

Сводная таблица может иметь любой размер и иметь разные столбцы в любой точке - поэтому я не могу явно указать конкретное имя столбца или заголовок и т. д.

Кроме того, в отчете по квартилям определены верхние 25% для конкретной фигуры, следующие 25, следующие 25 и нижние 25. Для некоторых цифр высокая лучше;для других - чем меньше, тем лучше.

Итак, я перечисляю все значения от высокого к низкому в массиве, а затем быстро запускаю «если имя в массиве, ранжировать таким образом, в противном случае ранжировать таким образом»function.

Все это работает как сон - пока мы не дойдем до определенных полей, которые приводят к неоднозначной проблеме с именами (и ошибкам).Кажется, что некоторые названия заголовков похожи на имена источника или базы данных.

Код читается следующим образом (ниже).

Любые идеи, как я могу динамически ссылаться на имя столбца и идентифицироватьстолбец под ним, пожалуйста?

    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 голосов
/ 16 февраля 2019

myPivotTable.PivotFields (myPivotSourceName) .DataRange.Select

Указывает имя столбца в виде строки.Работает на всех сводных таблицах, на которых я тестировал.

0 голосов
/ 14 февраля 2019

Я мог бы воспроизвести ошибку, имея элемент данных с тем же именем, что и у одного из полей данных.Например, если у вас есть следующая таблица, из которой вы создаете сводную таблицу:

Product      Price
Cola           123
Fanta          456
Sum of Price   789

, то, создав сводную таблицу, вы получите следующие элементы: Cola, Fanta, Sum of Price иследующие метки полей: «Метки строк», «Сумма цен».Если вы попытаетесь использовать 'Sum of Price' в функции PivotTable.PivotSelect, появится сообщение об ошибке в вопросе.

Я думаю, что параметр Name в PivotSelect недостаточно понятен, я не нашелдокументация соглашения об именах, используемого в нем, поэтому я рекомендую ссылаться на поле данных явно:

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

Примечание: в вашем коде много стилистических ошибок, лишних частей, например, скобки в строке, которая вызываетошибки не требуются, в циклах просто выберите последний элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...