Ошибка несоответствия PivotCaches.Add. Почему этого не произошло раньше?

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

Нерабочий код:

Private Sub CreateMIAPivots(MIABook As Workbook, MIASheet As Worksheet, MaxRow As Long)

Dim wksPivotSheet As Worksheet
Dim PivotRange As Range

    Set wksPivotSheet = MIABook.Sheets.Add
    wksPivotSheet.Name = "Summary"
    wksPivotSheet.Tab.Color = RGB(255, 0, 0)

    Set PivotRange = MIASheet.Range("A1:Y" & MaxRow)
    With MIABook.PivotCaches.Add(xlDatabase, PivotRange) 'Error sets here
    'More code below

MaxRow является переменной, но я проверил ее на файле, содержащем от 600 до 7000 строк, и объект Range создает действительную ссылку, если я пытаюсь взаимодействовать с ним любым другим способом.

Я рассмотрел некоторые связанные вопросы здесь, на SO:

Обходной код:

Private Sub CreateMIAPivots(MIABook As Workbook, MIASheet As Worksheet, MaxRow As Long)

Dim wksPivotSheet As Worksheet
Dim pc As PivotCache
Dim lVBAVer As Long
Dim PivotRange As Range

    lVBAVer = CLng(Application.Version)

    Set wksPivotSheet = MIABook.Sheets.Add
    wksPivotSheet.Name = "Summary"
    wksPivotSheet.Tab.Color = RGB(255, 0, 0)

    Set PivotRange = MIASheet.Range("A1:Y" & MaxRow)

    MIABook.Names.Add Name:="PivotRange", RefersTo:=PivotRange

    'Using answer from https://stackoverflow.com/a/11868231/698590 (StackOverflow) 
    'as a guide for version checking. Original answer of 
    'CLng(Application.VBE.Version) did not work here.
    #If lVBAVer <= 11 Then
        Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange")
    #Else
        Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange")
    #End If
    With pc
    'More code below

Теперь у меня вопрос: почему необходимо вышеуказанное решение? Похоже, что я не единственный, у кого отлично работающий код внезапно останавливался при использовании PivotCaches, как это было изначально. Так в чем здесь настоящая первопричина? Из-за чего перестал работать код?

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


person Gaffi    schedule 08.10.2012    source источник


Ответы (1)


Итак, как вы уже знаете, проблема связана с этим: http://answers.microsoft.com/en-us/office/forum/office_2010-customize/pivotcache-type-mismatch-error-when-65536-rows/0827889e-b671-e011-8dfc-68b599b31bf5?msgId=4e3a2b20-7a72-e011-8dfc-68b599b31bf5

Причина, по-видимому, в том, что синтаксис/использование сводных таблиц VBA был изменен с 2003 на 2007/2010.

Таким образом, он использует этот общий синтаксис для установки именованного диапазона в книге следующим образом:

MIABook.Names.Add Name:="PivotRange", RefersTo:=PivotRange

Этот раздел кода:

#If  lVBAVer <= 11 Then 
    Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange") 
#Else 
    Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange") 
#End If

Проверяет, меньше или равно ли lVBAver 11, если меньше, то используется такой синтаксис:

Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange")

Если это новая версия, то используется такой синтаксис:

Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange") 

Иногда вам просто нужно признать, что Microsoft не идеальна (смеется ирония), и они делают глупости, как и любая другая компания. Это моя теория в любом случае. Удачи.

person Stepan1010    schedule 08.10.2012
comment
Спасибо за ответ, @stepan1010, но это не совсем моя проблема. Я наткнулся на проверку версии программы, когда искал решение, но я использую только Excel 2003. Я включил проверку самостоятельно для возможного обновления в будущем. Что кажется правильным решением, так это именованные диапазоны. Хотя именованные диапазоны работают, не имеет смысла, чтобы прямой вызов диапазона (а-ля Sheet.Range("A1")) перестал работать без каких-либо других видимых изменений в коде. - person Gaffi; 09.10.2012
comment
Я не знаю, поможет ли эта информация вам вообще, но я понимаю, что проблема, с которой вы столкнулись, связана не только с используемой вами версией Excel, но и с версией VBA, которую вы используете. Похоже, CLng(Application.Version) действительно дает вам версию приложения, а не версию VBA. Но я все еще думаю, что проблема может быть связана с версией VBA, которая у вас есть, а не с версией приложения. Это мое подозрение, по крайней мере, на основании того, что вы сказали мне об использовании только Excel 2003 во время этой проблемы. Так что, возможно, вы в какой-то момент обновили версию VBA, которую используете. - person Stepan1010; 09.10.2012
comment
Как обновить версию VBE без обновления приложения Office? Несмотря на это, если я попробую версию VBA7 (.Create), мне выдается сообщение об ошибке, говорящее, что это недопустимый член PivotCaches. Опять же, я получаю код для работы с синтаксисом VBA6 (.Add), но я должен использовать именованные диапазоны вместо прямой ссылки на нужный диапазон, хотя раньше мне никогда не приходилось этого делать. - person Gaffi; 10.10.2012
comment
Ага, тогда я в растерянности. Синтаксис не меняется за одну ночь. Должно быть что-то, что вы изменили, или какое-то обновление для приложения или VBA, которое вы загрузили. Но это предел моего понимания на данный момент. - person Stepan1010; 10.10.2012