Страницы: 1
RSS
Сводная таблица по нескольким диапазонам данных, Сводная таблица по нескольким диапазонам данных
 
Добрый день. Нашел на этом сайте макрос по своду нескольких таблиц из нескольких листов в одну общую. Но при увеличении числа листов она начинает выдавать ошибку. Вот сам код макроса с моей кастомизацией
Код
Sub New_Multi_Table_Pivot()
    Dim i As Variant
    Dim arSQL() As Variant
    Dim objPivotCache As PivotCache
    Dim objRS As Variant
    Dim ResultSheetName As Variant
    Dim SheetsNames As Variant
 
    'имя листа, куда будет выводиться результирующая сводная
    ResultSheetName = "Сводная"
    
    Dim s As Variant
    'Ввод массива имен листов с исходными таблицами
    s = InputBox("Имена листов через запятую")
    s = Replace(s, ", ", ",")  'удаляем возможные пробелы после запятой
    SheetsNames = Split(s, ",")
    'формируем кэш по таблицам с листов из SheetsNames
    With ActiveWorkbook
        ReDim arSQL(1 To (UBound(SheetsNames) + 1))
        For i = LBound(SheetsNames) To UBound(SheetsNames)
            arSQL(i + 1) = "SELECT * FROM [" & SheetsNames(i) & "$]"
        Next i
        Set objRS = CreateObject("ADODB.Recordset")
        objRS.Open Join$(arSQL, " UNION ALL "), _
                   Join$(Array("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=", _
                               .FullName, ";Extended Properties=""Excel 8.0;"""), vbNullString)
    End With
 
    'создаем заново лист для вывода результирующей сводной таблицы
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets(ResultSheetName).Delete
    Set wsPivot = Worksheets.Add
    wsPivot.Name = ResultSheetName
 
    'выводим на этот лист сводную по сформированному кэшу
    Set objPivotCache = ActiveWorkbook.PivotCaches.Add(xlExternal)
    Set objPivotCache.Recordset = objRS
    Set objRS = Nothing
    With wsPivot
        objPivotCache.CreatePivotTable TableDestination:=wsPivot.Range("A3")
        Set objPivotCache = Nothing
        Range("A3").Select
    End With
 
End Sub
  У меня выходит от 30 до 40 листов в книге по 1 500 - 2 000 строк в каждом листе. Ошибка выдается из серии
Run-time error '-2147467259 *(800004005)'

Недопустимое имя '13$'. Проверьте, что оно не содержит недопустимые символы или знаки препинания, а также не является слишком длинным

Вроде бы везде увеличил диапазоны переменных чтоб они прожевывали такие большие таблицы. Поэтому не понимаю что в коде не так. Помогите пожалуйста
 
Уверены, что такой лист точно есть в книге? Может он с пробелом записан или еще какое несоответствие тому, что указано в массиве листов:
Код
SheetsNames = Array("11", "TDSheet")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Уверены, что такой лист точно есть в книге?
Да уверен, ибо не писал сюда. Это можно проверить скопировав любой лист и переименовав его. Тем более что у меня ввод данных происходит вручную при старте макроса. Код прочитай
Изменено: naum_c - 13.05.2022 10:01:35
 
Цитата
naum_c написал:
Да уверен
а с чего бы сообщение о недопустимом имени?
не потому же, что SQL считает число 13 несчастливым и не допускает его использование?
и ввод данных вручную это как раз не показатель их надежности, а скорее потенциальный источник ошибок (пользователь - он не предсказуем при вводе данных я не говорю о простых ошибках-опечатках, но такое впечатление, что часто умышленно вносит несусветную ерунду)))
Изменено: Ігор Гончаренко - 13.05.2022 10:27:12
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, скачай файл и проверь способ ввода. Тогда все поймешь
 
Цитата
написал:
Код прочитай
читать умею получше некоторых, не надо мне ТЫкать и приказы раздавать. Я вполне разумный и корректный вопрос задал и поверьте, такая ситуация случалась и с весьма опытными кодерами.
Цитата
написал:
скачай файл и проверь
вот я скачал и сходу получил именно эту ошибку, потому что там лист указан "TDSheet" вместо "12". Что уже говорит об опечатке сходу при подготовке примера. Что же мне мешало предположить, что опечатка или незамеченный пробел после имени листа есть и в оригинальном файле? Когда я вбил "12" вместо "TDSheet" - все сработало. Следовательно, надо искать ошибку либо в именах, либо в оригинальном файле, т.к. в приложенном ошибка не воспроизводится. Возможно, не хватает отведенного буфера обмена, но без файла с реальной ошибок гадать нет смысла.
Изменено: Дмитрий(The_Prist) Щербаков - 13.05.2022 12:14:03
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ігор Гончаренко, Дмитрий(The_Prist) Щербаков, и не лень вам такому хамлу всё по полочкам раскладывать…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий(The_Prist) Щербаков, Я предыдущий файл писал как пример. А в условии выше написал код который не работает. https://wdho.ru/e8e307 ссылка на документ который не работает. там уже код как из условия.Jack Famous, и каму я хамил? Где в моих словах хамство?
 
del
Изменено: Msi2102 - 13.05.2022 13:30:59
 
Цитата
naum_c написал:
и каму я хамил?
Канечно, ничаго хамскага небыло
Цитата
naum_c написал:
скачай файл и проверь способ ввода
Цитата
naum_c написал:
Код прочитай
Асталось добавть, чё расселись, метнулись быстро
Изменено: Msi2102 - 13.05.2022 13:30:12
 
Msi2102, И как эти фразы можно по-другому написать?
 
Цитата
naum_c написал:
И как эти фразы можно по-другому написать?
Ну для начала с незнакомыми людьми принято общаться на Вы и просить о помощи, всё-таки, нужно не в повелительном наклонении.
Изменено: Msi2102 - 13.05.2022 13:52:05
 
Цитата
naum_c написал:
скачай файл и проверь
naum_c, у нас на форуме к незнакомым люядм принято обращаться на ВЫ.
 
Цитата
naum_c написал:
А в условии выше написал код который не работает
Ответил бы Вам Вашими же словами - но не буду :)
Код работает. И если правильно ввести имена листов в InputBox через запятую, то код не просто работает - даже намека на ошибки нет, все создается.
Так что возвращаемся к тому с чего начали:
Цитата
naum_c написал:
надо искать ошибку либо в именах, либо в оригинальном файле, т.к. в приложенном ошибка не воспроизводится
правда, с подобным подходом с Вашей стороны, лично мой интерес пропал.
Цитата
naum_c написал:
И как эти фразы можно по-другому написать?
Например, не "код прочитай", а "Код в сообщении отличается от кода файла - обратите внимание на вот этот кусок". И написать, что именно Вы туда вводите, применительно к приложенному файлу, что в итоге вызывает ошибку. А "Код прочитай" - это дома с семьей так можете общаться, если хочется. Здесь Вам никто ничем не обязан, чтобы команды выполнять. Идите в платную ветку, ищите исполнителя и за отдельную плату можете раздавать там ему задания и приказания :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, +1
Страницы: 1
Наверх