【发布时间】:2020-07-02 15:40:55
【问题描述】:
编辑:发现新错误?
我可能刚刚发现为什么我的脚本不再起作用了。最近有一个办公室更新,似乎他们已经实现了微软查询,摆脱了我根据需要安装和配置的 ODBC 管理器。现在实际的问题可能是这个 microsoft 查询没有 UNICODE 库,我不知道我可以把它们放在哪里,以便 microsoft 查询可以读取/获取它们。或者更确切地说,我不知道如何为 microsoft 查询提供 UNICODE 库的路径,因为在管理器中无法更改它,或者可能有但我只是没有找到它?除此之外,除非我直接从 excel 工作簿打开它,否则我无法打开 microsoft 查询管理器。
原始问题
这段代码工作了一段时间。现在使用完全相同的代码,我得到一个运行时错误。 Here我已经在这种情况下寻求帮助并让它发挥作用。
代码如下:
Sub ConnectSQL()
Dim connstring As String
Dim sLogin As String
Dim qt As QueryTable
sLogin = "Uid=*;Pwd=*;"
sqlstringFirma = "select * from gi_kunden.tbl_Firma"
sqlstringPerson = "select * from gi_kunden.tbl_Person"
connstring = "ODBC;DSN=KundeDB;" & sLogin
ActiveWorkbook.Sheets("Firma").Select
ActiveSheet.Range("A1:T2000").Clear
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringFirma)
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh '"General ODBC error" hereeee
End With
ActiveWorkbook.Sheets("Person").Select
ActiveSheet.Range("A1:T2000").Clear
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringPerson)
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh 'And hereee again
End With
Call Replace
ActiveWorkbook.Sheets("Firma").Select
End Sub
我确实在这里使用了 .Select 两次,我知道我应该更改它。
我在 Mac 上使用 Excel 2011,因此请注意,并非所有在 Windows 上工作的东西都能正常工作。
* 编辑 *
首先:即使我激活了所有的对象库,这仍然不起作用。
其次,当我打开对象浏览器时,我才意识到一些事情:
“ODBCConnection”是一个声明的类(“Excel 的类 ODBCConnection 成员”)。但是当我在对象浏览器中单击 Excel 时,“ODBCConnection”无处可寻。如果我输入代码“Excel.ODBCConnection.Refresh”,则会引发错误“找不到方法或数据成员”,仅突出显示“ODBCConnection”一词。当我仅使用 ODBCConnection.Refresh 时显示相同的错误(根据对象浏览器,刷新是 ODBCConnection 的一种方法)。
我对“QueryTable(1).Refresh”有完全相同的问题,它会引发错误:“变量未定义”,即使它已在对象浏览器中列出并声明(“类 QueryTable 成员Excel”)。
我相信与此相关的所有事情都会出现此类错误。
编辑
这会在 ActiveWorkbook.RefreshAll 行上引发相同的“常规 ODBC 错误”:
Dim strConn As String
Dim strLoginData As String
Dim QT As QueryTable
Dim strFirmSQL As String
Dim strPersSQL As String
strConn = "ODBC;DSN=KundeDB;" & strLoginData
strLoginData = "Uid=*myUid*;Pwd=*myPwd*"
strFirmSQL = "Select * From gi_kunden.tbl_firma"
strPersSQL = "Select * From gi_kunden.tbl_person"
Dim WSFirm As Worksheet
Set WSFirm = ActiveWorkbook.Sheets("Firma")
WSFirm.Range("A1:T1000").Clear
For Each QT In WSFirm.QueryTables
QT.Delete
Next QT
With WSFirm.QueryTables.Add(strConn, WSFirm.Range("A1"), strFirmSQL)
.SaveData = True
.BackgroundQuery = True
'.Refresh
End With
Dim WSPers As Worksheet
Set WSPers = ActiveWorkbook.Sheets("Person")
For Each QT In WSPers.QueryTables
QT.Delete
Next QT
With WSPers.QueryTables.Add(strConn, WSPers.Range("A1"), strPersSQL)
.SaveData = True
.BackgroundQuery = True
'.Refresh
End With
ActiveWorkbook.RefreshAll 'FAILS here
Call Replace
WSFirm.Activate
【问题讨论】:
-
我们曾经遇到过类似的问题,我能够通过声明驱动程序来纠正其中的大部分问题(Teradata 通常让我最痛苦)。我也开始避免使用 DSN,因为我有一些用户喜欢将他们的连接命名为完全不同的名称。此外,如果存在访问问题,刷新将失败。
-
这可能有帮助也可能没有帮助,但我注意到 strConn = "ODBC;DSN=KundeDB;" & strLoginData 出现在 strLoginData 被赋值之前。连接字符串看起来不包含登录凭据。只是我的两分钱!
-
你是对的......我更正了它,但我仍然在 .refresh 行中得到一般的 odbc 错误...... :(