2016-06-22 9 views
-1

Я делаю макрос на excel, который импортирует данные из MySQL (с помощью querytables.add и с использованием OBCD), и каждый раз, когда я запускаю макрос, он создает новое соединение и его отходы времени и пространства. Есть ли функция, чтобы знать, имеет ли ячейка/лист соединение с ней, поэтому мне не нужно снова импортировать данные и создать новое соединение или код, чтобы узнать, когда последний раз подключение было обновлено.Поиск импортированных данных в ячейку, чтобы остановить их импорт. VBA

Я искал что-то, но кажется, что нет ничего подобного, так что, возможно, и альтернативный способ сделать это будет полезно, спасибо!

Код:

Worksheets("Hoja1").Activate 

Dim sqlstring As String 
Const connstring As String = "ODBC;DSN=blabla;UID=blabla;PWD=blabla" 

if "***Range("A1") has a connection***" then 
    ActiveWorkbook.Connections("Conexión").Refresh 'actualize the connection previously made 
Else 'import the table from sql server 
    sqlstring = vbNullString 
    sqlstring = "SELECT * FROM ExTable WHERE year > '2012'" 
    With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstring) 
     .RefreshStyle = xlOverwriteCells 
     .Refresh BackgroundQuery:=False 
    End With 

ответ

0

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

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

Sub RefreshMakeConnection() 

Dim cnT As Connections 
Set cnT = ThisWorkbook.Connections 

Dim sWS As String 
sWS = "Hoja1" 

Dim cn As WorkbookConnection 

For Each cn In cnT 

    If cn.Ranges(1).Parent.Name = sWS Then 

     With Worksheets(sWS) 

      If Not Intersect(.Range("A1"), cn.Ranges(1)) Is Nothing Then 
       cn.Refresh 
      Else 
       'code to create new connection 
      End If 

     End With 

    End If 

Next 

End Sub 
+0

Кажется, что я искал, но im new на этом, поэтому я не понимаете «cn.Ranges (1)», принимало ли значение ячейки (1,1) «таблицы» подключения ?, предполагая, что соединение было импортировано на листе – AEPImiranda

+0

@AEPImiranda 'cn.Ranges (1) 'создает область ячеек, в настоящее время покрываемую соединением. Вы можете проверить это, используя 'debug.print' на' cn.Ranges (1) .Address'. Он покажет область диапазона для таблицы или сводной таблицы, например. –

0

Может быть, вы можете найти имя соединения?

Sub test() 
Dim ItemConnection As Variant 
Dim TotalConnections As Connections: Set TotalConnections = ThisWorkbook.Connections 
    For Each ItemConnection In TotalConnections 
    MsgBox ItemConnection.Name 
    Next ItemConnection 

End Sub 

PS: Вариант, потому что я не нашел способ объявить соединение в качестве отдельного элемента соединения

+0

Это способ сделать это haha ​​thanks! – AEPImiranda

+0

Чем проще, тем лучше? Тем не менее, не забудьте запереть и/или проверить зеленую метку за лучший ответ, который вы получили - я вижу довольно много полезных сейчас :) - – Sgdva

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