2014-11-26 10 views
0

Я боролся с этой проблемой в течение нескольких дней и читал много сообщений о переименовании соединений и до сих пор не могу достичь того, что мне нужно.Соединения с помощью pivot Excel переименованы в «Connection» в VBA

По существу у меня есть книга, которая имеет несколько листов, каждая с другой сводной таблицей, используя другое соединение.

Мне нужно использовать VBA, чтобы вставлять критерии диапазона дат из вкладки «Контроль» в инструкцию sql каждого соединения, потому что, поскольку все мы знаем, что опорные точки не могут использовать? параметр.

Однако, как и мы знаем, Excel переименовывает соединение при его изменении, поэтому изменение текста команды с помощью VBA приводит к созданию новых соединений и оставлению избыточных.

Использование некоторых других очень полезных сообщений в этом форуме я успешно удалось - изменить текст команды - удалить старое соединение и переименовать новый предполагая его имя, чтобы быть «Connection»

таким образом:

text = "... new SQL query here..." 
ActiveWorkbook.Connections("GLCosts").ODBCConnection.CommandText = text 
    ' assume excel has renamed the "GLCosts" connection to "Connection"  
ActiveWorkbook.Connections("Connection").Refresh 
    ' delete the original and rename the new one to the old name 
ActiveWorkbook.Connections("GLCosts").Delete 
ActiveWorkbook.Connections("Connection").name = "GLCosts" 

пока каждый Sub() делает это, в свою очередь, то это должно быть хорошо, как «новое» имя соединения всегда будет «Connection» (т.е. не «Connection1» и т.д.)

ОДНАКО Что я нашел, так это то, что Excel переименовывает соединение только в том случае, если есть переменная в COMMAND.TEXT

Поэтому, если пользователь фактически не изменяет значения критериев даты (хранится в таблицах («Контроль»). Диапазон («D4»)), но они запускают макрос для обновления опорных точек, а макрос терпит неудачу, потому что текст команды не был изменен, и нет новой строки соединения для переименования в качестве старого имени.

So .... Я старался быть умным. В каждом Sub() я сначала установил text = "... действительный sql-запрос, но не тот, который мне нужен ...", а затем заменим command.text соединения с этим фиктивным запросом, тем самым вынудив excel создать новое соединение который я могу переименовать. Затем, когда я устанавливаю text = "... правильный SQL-запрос", excel снова создаст новое соединение под названием «Connection», и я могу повторить шаги переименования и удаления.

Это должно быть хорошо, но по какой-то причине он просто разбился первенствовать, и я не пробовал снова

Кто-нибудь есть фактическое решение этой проблемы? Должен ли я снова попробовать умный материал?

Любые идеи с благодарностью получил

+0

не может поверить, что там нет никого, кто решил эту проблему. я определил это плохо? – jfly62

ответ

0

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

Создать новый модуль и вставьте следующий код:

Option Explicit 

Sub UpdateWorkbookConnection(WorkbookConnectionObject As WorkbookConnection, Optional ByVal CommandText As String = "", Optional ByVal ConnectionString As String = "") 

With WorkbookConnectionObject 
    If .Type = xlConnectionTypeODBC Then 
     If CommandText = "" Then CommandText = .ODBCConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .ODBCConnection.Connection 
     .ODBCConnection.Connection = Replace(.ODBCConnection.Connection, "ODBC;", "OLEDB;", 1, 1, vbTextCompare) 
    ElseIf .Type = xlConnectionTypeOLEDB Then 
     If CommandText = "" Then CommandText = .OLEDBConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .OLEDBConnection.Connection 
    Else 
     MsgBox "Invalid connection object sent to UpdateWorkbookConnection function!", vbCritical, "Update Error" 
     Exit Sub 
    End If 
    If StrComp(.OLEDBConnection.CommandText, CommandText, vbTextCompare) <> 0 Then 
     .OLEDBConnection.CommandText = CommandText 
    End If 
    If StrComp(.OLEDBConnection.Connection, ConnectionString, vbTextCompare) <> 0 Then 
     .OLEDBConnection.Connection = ConnectionString 
    End If 
    .Refresh 
End With 

End Sub 

Эта UpdateWorkbookConnection подпрограмма работает только по обновлению OLEDB или ODBC соединения. Соединение необязательно должно быть связано со сводной таблицей. Он также исправляет еще одну проблему и позволяет вам обновлять соединение, даже если на одном и том же соединении имеется несколько сводных таблиц.

Чтобы начать обновление только вызов функции с объектом связи и командных текстовых параметров, как это:

UpdateWorkbookConnection ActiveWorkbook.Connections("Connection"), "exec sp_MyAwesomeProcedure" 

При необходимости можно обновить строку подключения, а также.

+0

Спасибо Джеймсу и Брайану. По какой-то причине эти ответы пошли в папку со спамом, и я только что их видел. Поэтому извиняюсь за то, что Джеймс не ответил. В основном отказался от того, чтобы когда-либо получить решение и только что справился с этой проблемой. Стремитесь попробовать их, когда я получаю некоторое время. Tks. – jfly62

+0

Брайан - чистый гений !!! – jfly62

0

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

Прежде, чем VBA изменит существующий сводный кэш/соединения, объявите строковую переменную (currentPvtConn) в вашем коде и задайте значение для текущего значения Pivot Cache для Pivot, который вы собираетесь обновить. Кроме того, delcare вторую строку переменной (newPvtConn), чтобы содержать имя нового соединения Excel, несомненно, будет генерировать ...

Dim currentPvtConn As String 
Dim newPvtConn As String 

currentPvtConn = ActiveSheet.PivotTables("pvtUser").PivotCache.WorkbookConnection 

... Теперь поместите свой код, чтобы изменять CommandText ...

После выполнения команд обновления Excel создаст это подлое новое соединение с именем «Connection #», и вы останетесь со старым, нетронутым. Для того, чтобы очистить этот беспорядок, мы должны захватить вновь созданное имя соединения и хранить в переменной newPvtConnection мы создали ранее ...

newPvtConn = ActiveSheet.PivotTables("pvtUser").PivotCache.WorkbookConnection 

Так как теперь оба названия хранятся в виде локальных переменных, вы можете на самом деле comare две строки и

Наконец, удалите соединение orignal и переименуйте вновь созданный. IF гарантирует, что новое соединение было создано до создания/переименования.

If (StrComp(currentPvtConn, newPvtConn) <> 0) Then 
    ActiveWorkbook.Connections(currentPvtConn).Delete 
    ActiveWorkbook.Connections(newPvtConn).Name = "[My Original Connection Name]" 
End If 

... положил остальную часть кода

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

  1. Создать Excel файл с параметризованными запросами, которые загружаются непосредственно в сводной Cache (то есть, используя параметры в тексте команды «?»)

  2. Сохранить beatufully обработанный файл и закройте

  3. Повторно откройте и попробуйте обновить
  4. Excel падает жесткий и закрывается; нет никаких шансов на «ремонт»

/*** По-видимому, параметры не поддерживаются в Сводки. Проблема заключается в ячейках параметров в электронной таблице. Фактически, когда вы закрываете файл, запрос «забывает», что такое ячейки параметров, и вместо этого использует пробелы. Вот почему Excel сбой. Я предполагаю, что это вызвано тем фактом, что сводные таблицы «не могут использоваться» в отношении запросов параметров. Однако ... Вот мое обходное решение: никакой дополнительной таблицы не требуется - только сводная таблица.

  1. Создать общий запрос первого (без параметров.)

  2. Создание сводной таблицы на основе результатов запроса.

  3. Измените запрос на запрос параметра.

  4. Перед обновлением данных в Excel не следует выбирать значения ячеек в качестве параметров.

Вместо этого используйте приглашение: Свойства подключения => Параметры => «Запрос значения, используя следующую строку:».

Итак, когда вы нажимаете «Обновить» на сводной таблице, вам будет предложено ввести параметры.

Я знаю, что это не так элегантно, как обращение к ячейке, но в этом случае Excel не будет разбиваться. Кроме того, вам не придется обновлять таблицу результатов и сводной таблицы, но только сводную таблицу. Source MSDN: (bottom-of-page comment) ***/

+0

благодарит Джеймса - пробовал бы ваш маршрут, но в книге есть несколько опорных точек, и он действительно хотел избежать необходимости обновлять индивидуально или вводить ключ в месяц/год более одного раза. – jfly62

0

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

Я использую Excel 2013 (хотя он также может работать в более ранних версиях) и обнаружил, что при изменении ODBCconnection.commandtext в VBA я получаю тот же эффект, когда новое соединение под названием «Соединение» создается со старым текст команды и привязан к сводной таблице. Но исходное соединение имеет новый командный текст, однако он больше не связан с опорным.

Если соединение, которое вы хотите изменить в VBA, связано с таблицей excel, а не с сводной таблицей, я обнаружил, что новое «соединение» не создано, и вместо этого исходное соединение изменяется кодом, но остается связанным к столу. Итак, я создал соединение, связанное с таблицей excel на скрытом листе, а затем использовал эту таблицу в качестве источника сводной таблицы.

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

Смежные вопросы