Изменить существующее имя соединения excel в VBA

Мне нужно обновить имя соединения sql-соединения книги excel. Это моя попытка. Мне удалось изменить строку подключения и текст команды, выполнив стандартную замену.

Sub ConnectionString_modify()

Dim i As Long
Dim cnt As Long
Dim modtext As String
Dim modrange As String

'Grab nummber of workbook connections
cnt = ActiveWorkbook.Connections.Count

For i = 1 To cnt

    'Changes to Connection string --This works
    modtext = ActiveWorkbook.Connections.Item(i).OLEDBConnection.Connection
    modtext = VBA.Replace(modtext, "_FY2013", "_FY2014")
    ActiveWorkbook.Connections.Item(i).OLEDBConnection.Connection = modtext

    'Changes Connection Name
    modname = ActiveWorkbook.Connections.Item(i).Name
    modname = VBA.Replace(modname, "_FY2013", "_FY2014")
    ActiveWorkbook.Connections.Item(i).Name = modname 
 Next i

End sub

Любая помощь будет здорово. Спасибо.


person thomas398    schedule 16.09.2013    source источник
comment
В чем проблема? Вы получаете ошибку? Если да, то на какой строке и какое именно сообщение?   -  person Tim Williams    schedule 17.09.2013
comment
Этот код будет работать без ошибок, но имя строки подключения не изменится. Что действительно происходит, так это то, что i-е имя соединения меняется на другое в наборе. Поэтому, если я проверю перед подключениями.items(i) = Connection10 после того, как я попробую свой код переименования, его подключения.items(i) = Connection7. Кажется, мне нужен другой метод для переименования. В настоящее время этот код просто переупорядочивает имена соединений.   -  person thomas398    schedule 17.09.2013
comment
Попробуйте поместить объекты подключения в коллекцию и вместо этого пройтись по коллекции. Иногда изменение объектов в цикле, как вы делаете, может привести к изменению порядка объектов во время процесса. Или попробуйте установить ссылку на каждое соединение и работать с этой ссылкой вместо ссылки на .Items(i)   -  person Tim Williams    schedule 17.09.2013


Ответы (2)


Попробуй это:

Sub ConnectionString_modify()

Dim i As Long
Dim cnt As Long
Dim modtext As String
Dim modrange As String
Dim conn

'Grab nummber of workbook connections
cnt = ActiveWorkbook.Connections.Count

For i = cnt To 1 Step -1

    Set conn = ActiveWorkbook.Connections.Item(i)

    modtext = conn.OLEDBConnection.Connection
    modtext = VBA.Replace(modtext, "_FY2013", "_FY2014")
    conn.OLEDBConnection.Connection = modtext

    conn.Name = VBA.Replace(conn.Name, "_FY2013", "_FY2014")

Next i

End sub
person Tim Williams    schedule 17.09.2013

Судя по всему, Excel динамически сортирует массив Connection.Item(). Таким образом, мои модификации отправляли обновленные имена в конец массива. До: FY2013Conn1, FY2013Conn2, FY2013Conn3, FY2013Conn4 После: FY2014Conn2, FY2014Conn3, FY2014Conn4, FY2014Conn1

Это было трудно увидеть, потому что я имел дело с более чем 50 соединениями. Что я нашел эффективным, так это то, что вместо того, чтобы пытаться перебрать весь набор, измените только первый элемент в массиве.

'Connection Count
cnt = ActiveWorkbook.Connections.Count 

While cnt > 0
   'Always modify the first Item 
   Set conn = ActiveWorkbook.Connections.Item(1)

   'Mod code makes changes to Command Text
    modtext = conn.OLEDBConnection.Connection
    modtext = VBA.Replace(modtext, "_FY2013", "_FY2014")
    conn.OLEDBConnection.Connection = modtext

    'Changes Connection Name
    conn.Name = VBA.Replace(conn.Name, "_FY2013", "_FY2014")

    'Iterate through the cnt
     cnt = cnt - 1
  Wend

Спасибо всем за помощь.

person thomas398    schedule 18.09.2013