Копирование листов с помощью Powerquery с использованием VBA - прерывает Query - PullRequest
0 голосов
/ 25 января 2020

У меня есть рабочая таблица под названием «ШАБЛОН» с PowerQuery «TEMPLATE_Query», которая работает. Powerquery запрашивает CSV-файл с веб-сайта.

Теперь, используя VBA в al oop, я делаю N копий этого листа, в результате чего рабочие листы называются «Шаблон (X)», а Powerquerys называются «TEMPLATE_Query». (ИКС)". X = 1..N. В своем коде VBA я изменяю формулы Powerquery для запроса другого файла CSV. Пока здесь, это работает хорошо. Powerquerys запускаются и получают разные CSV-файлы во всех этих рабочих листах.

Вот проблема:

Когда я меняю имя рабочего листа с помощью VBA во время моего l oop там, где я создаю копии, Powerquerys завершается ошибкой. Говоря как " Загрузка не удалась, только соединение ". Очевидно, что Powerquery больше не имеет ссылки на правильное имя листа. То же самое происходит, когда я переименовываю Powerquery и оставляю имя рабочего листа одинаковым.

Моя цель состоит в том, чтобы переименовать рабочий лист и Powerquery в VBA l oop.

Но почему это нарушает запросы?

1 Ответ

1 голос
/ 25 января 2020

У меня была такая же проблема немного, пока go. Если я правильно помню, он ломается, потому что запрос все еще хочет получить доступ к чему-то с другим именем. Я не знаю, почему Excel не меняет ссылку при переименовании запроса. Он даже автоматически не изменяет его, если вы переименуете его вручную, щелкнув правой кнопкой мыши. Если вы посмотрите на запрос, щелкните его правой кнопкой мыши, а затем переключитесь на свойства или как называется средняя вкладка, там вы увидите некоторые детали.

Короче говоря, вот как я исправил свой:

Sub Create_new_connection()

'On Error Resume Next
'Count the current amount of queries and save that number to refer to it later
QueryCount = ThisWorkbook.Queries.Count

'Copy the template and rename it
ThisWorkbook.Sheets("Template").Copy after:=ThisWorkbook.Sheets("Template")
ThisWorkbook.Sheets(3).Name = "Put a name here"

'Change the name of the query
ThisWorkbook.Queries.Item(QueryCount + 1).Name = "New Query Name"

'Change the names of the new table
ThisWorkbook.Sheets(3).ListObjects(1).Name = "I had a table I wanted to rename"

'Change the formula of the new connection
NewFormula = Replace(ThisWorkbook.Queries.Item(1).Formula, ThisWorkbook.Sheets("Create New List").ListObjects("Template").DataBodyRange(1, 1), ThisWorkbook.Sheets("Create New List").ListObjects("FAUF").DataBodyRange(1, 1))
ThisWorkbook.Queries.Item(QueryCount + 1).Formula = NewFormula

'Connect the new table to the new connection and
ThisWorkbook.Sheets(3).ListObjects(1).QueryTable.WorkbookConnection = "Abfrage - " & ThisWorkbook.Queries.Item(QueryCount + 1).Name
ThisWorkbook.Sheets(3).ListObjects(1).QueryTable.Connection = "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & """" & ThisWorkbook.Queries.Item(QueryCount + 1).Name & """" & ";Extended Properties=" & """" & """"
ThisWorkbook.Sheets(3).ListObjects(1).QueryTable.CommandText = "SELECT * FROM [" & ThisWorkbook.Queries.Item(QueryCount + 1).Name & "]"

'Refresh the new connection
ThisWorkbook.Sheets(3).ListObjects(1).QueryTable.Refresh BackgroundQuery:=False

End Sub

Важнейшими являются последние три, которые изменяют соединение. Это на немецком Excel tho, поэтому вам может потребоваться изменить бит «Abfrage -», чтобы он соответствовал вашему языку. Просто важно правильно изменить WorkbookConnection, Connection и CommantText.

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