(Примечание: это мой первый вопрос. Пожалуйста, дайте мне знать, если я могу улучшить, как я спрашиваю или объясняю)
Я создал модуль, который может просматривать сводную таблицу на любом листе 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
Прекрасно работает и полностью переносим для любой сводной таблицы на любом листе с любыми полями