我在excel上创建一个从MySQL导入数据的宏(使用querytables.add并使用OBCD),每次运行宏时,它都会创建一个新的连接,浪费时间和空间。是否有一个函数来知道单元格/表单上是否有连接,所以我不必再次导入数据并创建新连接或代码以了解最后一次刷新连接的时间。
我抬头看东西,但似乎没有什么比这更好的了,所以也许另外做这件事的方式会很有用,谢谢!
代码:
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 :(得分: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:Variant是因为我没有找到将连接声明为单个连接项
的方法答案 1 :(得分: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