- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:发现新错误?
我可能刚刚发现为什么我的脚本不再工作了。最近有一个 Office 更新,似乎他们已经实现了 microsoft 查询,它摆脱了我根据需要安装和配置的 ODBC 管理器。现在实际的问题可能是这个微软查询没有 UNICODE 库,并且我不知道可以将它们放在哪里以便微软查询可以读取/获取它们。或者更确切地说,我不知道如何为微软查询提供 UNICODE 库的路径,因为在管理器中无法更改它,或者也许有,但我只是没有找到它?除此之外,我无法打开 Microsoft 查询管理器,除非直接从 Excel 工作簿中打开它。
原始问题
这段代码工作了一段时间。现在使用完全相同的代码我收到运行时错误。 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”有完全相同的问题,它抛出错误:“变量未定义”,即使它在对象浏览器中列出并声明(“Class QueryTable Member of 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
最佳答案
我无法解决你的问题,但我可以帮你调试。
第一个问题是:该错误消息是什么意思?它是否告诉您对数据运行的查询或命令有错误,或者有什么原因阻止您连接到数据库?
实际上可以编写信息丰富的错误消息,并且雷德蒙德实现查询表的任何被误导的天才都选择不传递数据库服务器和连接库发出的详细错误信息。
幸运的是,我们自己做了一些工作。
QueryTable 对象有一个连接属性 - 它是一个字符串,不是一个功能齐全的连接对象,但您可以更详细地检查它并针对 ADODB 连接对象进行测试。尝试使用此函数来测试连接字符串,看看是否有任何有用的信息:
Public Sub ConnectionTest(ConnectionString As String)<br/>
' Late-binding: requires less effort, but he correct aproach is
' to create a reference to 'Microsoft ActiveX Data Objects' -<br/>
'Dim conADO As ADODB.Connection
'Set conADO = New ADODB.Connection<br/>Dim conADO As Object
Set conADO = CreateObject("ADODB.Connection")<br/>
Dim i As Integer<br/>
conADO.ConnectionTimeout = 30
conADO.ConnectionString = ConnectionString<br/>
On Error Resume Next<br/>
conADO.Open<br/>
If conADO.State = 1 Then
Debug.Print "Connection string is valid"
Else
Debug.Print "Connection failed:"<br/><br/>
For i = 0 To conADO.Errors.Count
With conADO.Errors(i)
Debug.Print "ADODB connection returned error " & .Number & " (native error '" & .NativeError & "') from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
End If<br/>
Debug.Print "Connection String: "
Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab)
Debug.Print<br/><br/>
Set conADO = Nothing<br/><br/>
End Sub
...并将其插入到您的代码中:
Dim objQueryTable As Excel.QueryTable
Dim strConnect as String<br/>
set objQueryTable = ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringFirma)<br/>
With objQueryTable
strConnect = .Connection
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh ' "General ODBC error" hereeee
End With<br/>
ConnectionTest strConnect ' view the output in the debug window/immediate pane
如果您看到其中的错误,则可能只是我的 ADODB 连接实现在您的 Mac Office 环境中不起作用:但您完全有可能有以下任一情况:
如果连接正常,则可能是您在数据库中运行的查询或命令才是问题的根源 - 而且我在您的问题中看到的错误消息确实指向了这个方向 - 所以我们需要深入研究再深一点。
不幸的是,我无法知道我使用的工具是否适合您:这是开发人员的调试代码,您需要修改它才能使其工作。
之所以如此繁琐,是因为实现 QueryTable 的 Office 团队做出了一些有趣的决定:QueryTable 公开的“连接”和“记录集”属性不是功能齐全的对象 - 我认为它们是接口(interface)允许 QueryTable 使用来自各种不同提供者的称为“连接”和“记录集”的对象,并公开一组通用的属性和方法。对于跨平台可用性来说,这是一个很好的决定,但这意味着需要询问这些对象的开发人员不能依赖运行时存在的任何给定方法 - 因此这仅适用于“调试”模式下的反编译代码.
您还需要在 IDE 中注册 Microsoft DAO 和 ADO 引用:当您需要能够在“本地”窗口中查看这些对象时,使用“CreateObject”进行后期绑定(bind)是错误的工具:
Public Sub ConnectionDetails(objQueryTable As Excel.QueryTable)<br/>
Dim rstADO As ADODB.Recordset
Dim conADO As ADODB.Connection<br/>
Dim rstDAO As DAO.Recordset
Dim conDAO As DAO.Connection<br/>
Dim i As Integer<br/><br/>
Set objQueryTable = Sheet1.ListObjects(1).QueryTable<br/>
With objQueryTable<br/><br/>
Debug.Print "Connection String: "
Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab)
Debug.Print<br/><br/>
Debug.Print "Query Type: " & .QueryType ' Documented here: <a href="https://msdn.microsoft.com/en-us/library/office/ff835313.aspx" rel="noreferrer noopener nofollow">https://msdn.microsoft.com/en-us/library/office/ff835313.aspx</a>
Debug.Print "Query: " & .CommandText
Debug.Print "Database request type: " & .CommandType ' XlCmdType documented here: <a href="https://msdn.microsoft.com/en-us/library/office/ff197456.aspx" rel="noreferrer noopener nofollow">https://msdn.microsoft.com/en-us/library/office/ff197456.aspx</a><br/><br/>
.MaintainConnection = True<br/>
On Error Resume Next
If TypeOf .Recordset Is DAO.Recordset Then<br/><br/>
On Error Resume Next
Set rstDAO = .Recordset<br/><br/>
rstDAO.OpenRecordset
For i = 0 To DAO.Errors.Count
With DAO.Errors(i)
Debug.Print "DAO Recordset '" & Left(rstDAO.Name, 24) & "' returned error " & .Number & " from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
Set conADO = DAO.DBEngine.OpenConnection(.Connection)
For i = 0 To DAO.Errors.Count
With DAO.Errors(i)
Debug.Print "DAO Connection '" & Left(conDAO.Name, 24) & "' returned error " & .Number & " from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
ElseIf TypeOf .Recordset Is ADODB.Recordset Then<br/><br/>
On Error Resume Next
Set rstADO = .Recordset<br/><br/>
If rstADO.State <> 0 Then rstADO.Close
rstADO.Open
Set conADO = rstADO.ActiveConnection
For i = 0 To conADO.Errors.Count
With conADO.Errors(i)
Debug.Print "ADODB Recordset '" & Left(rstADO.Source, 24) & "' connection returned error " & .Number & " (native error '" & .NativeError & "') from '" & .Source & "': " & .Description
End With
Next i<br/>
ElseIf Err.Number <> 0 Then<br/><br/>
Debug.Print Err.Source & " Error " & Err.Number & ":" & Err.Description<br/><br/>
Else<br/><br/>
Debug.Print "recordset type is: '" & TypeName(.Recordset) & "': for further information, place a breakpoint in the code and use the 'Locals' window."<br/><br/>
End If<br/>
End With<br/>
End Sub<br/>
代码执行的操作(或尝试执行的操作)非常简单:它询问数据库并检索详细的错误消息。
他们可能会告诉您存在语法错误,或者 SQL 中缺少参数 - 如果数据库是 MS-Access,这可能会产生误导:“缺少参数”可能意味着字段名称或函数名称未知。这也可能意味着 you can't run that SQL outside an MS-Access user session 。
如果无法工作,请返回 ConnectionTest 代码并对 conADO 连接对象运行命令文本:conADO.执行strCommandText
...并再次询问错误集合。
这就是我可以用来解决这个问题的调试工具:希望另一个“Stacker”可以建议其他方法。
关于excel - 刷新 QueryTable 抛出 "General ODBC error"- VBA Excel 2011 for Mac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35057385/
我当前的代码: ConnectionName = "testCon" With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://t
我只打开了这一个工作簿(当时没有打开其他工作簿),并注意到列出了一堆数据连接。经过进一步调查,它表明这些连接没有“在此工作簿中使用”(再次,奇怪的是我只打开了这个工作簿,所以如果这里没有使用连接,它们
下午好, 我正在寻找一种处理 QueryTable 错误的方法。我查看了有关 google 和 stackoverflow 的其他问题,但它们似乎没有回答我要问的具体问题。 基本上,有没有办法确定处理
我正在从 Google 财经导入多个 csv 文件并将数据保存到一个工作表中。每当 URL 无效时,我希望它转到一个错误处理程序,它基本上说“找不到此信息”,然后继续返回以从网络上获取下一个 csv
我正在使用 VBA 开发 MS Excel 2013 工具,其中涉及 QueryTables 的使用。 访问 Excel 工作表中的现有查询表是一个不便之处。目前,我能找到的访问查询表的唯一方法是通过
我一直在放QueryTables结果 ActiveSheet ,但现在我想把它们放在另一张纸上。在下面的代码中,注释掉的行是我最初的,下面的“with”行是我的新尝试。 Dim QuerySheet
尝试导入 csv 文件时,我在 VBA (1004) 中遇到非常奇怪的错误。 这是我的代码: With ActiveSheet.QueryTables.Add(Connection:= _ "
Sub Macro1() Dim URL As String Dim Path As String Dim i As Integer For i = 2 To 50 If Range("Prices!
历史上,Excel 中的外部数据查询用 QueryTables 表示。 ListObjects 出现在某个时候,但它们还不兼容 QueryTable 并且不能包含它们。 在 Office 2007 中
有什么方法可以调整 QueryTables 行号的起始编号吗?我已设置 QueryTable.RowNumbers = True,但这从 0 开始计数。我想从 1 开始。 最佳答案 将 RowNumb
如标题所述:我发现单击功能区上的“全部刷新”按钮不会触发 QueryTable 的 BeforeRefresh 事件。为什么会这样?有没有办法改变这种行为? 奇怪的是,同一个QueryTable的Af
我编写了一个 visual basic 宏来将 csv 文件加载到我经常使用的 Excel 中。 不幸的是,如果 csv 文件包含带引号的换行符,则结果与直接用 excel 打开 csv 文件得到的结
我正在尝试自动执行此报告,并编写了 VBA 来执行各种任务,然后我在“RunAll”子程序中按顺序调用每个任务。我的工作簿中的数据透视表的选项卡中有来自 Access 查询的数据。 我发现当我运行这个
我正在使用 VBA 开发 Excel (2010+) 应用程序,但遇到了查询完成执行后不会调用 AfterRefresh 事件函数的问题。 我还没有找到很多像样的资源或文档来了解如何在类模块中触发此事
我正在 Excel for Mac 2016 中运行 QueryTable,目标范围为“data_value”,电子表格中单元格 A1 的名称为“hs”,QueryTable 在提取数据后将名称“Ex
使用 VBA,我正在尝试创建一个 Excel 查询表以提供来自文本文件的数据子集。我想使用 Jet OLEDB 连接字符串作为查询表 Connection .为什么会失败? 这是程序。 Sub Ole
我无法导入 csv 文件。第一行工作正常,但其余的都是靠不住的。这是 csv 中第一行和第二行的示例: "Order # ","Purchased From (Store)","Purchased O
我正在尝试编写一个自定义标记,它将以特殊方式遍历 cfquery 对象。我找到了这个页面:http://www.zrinity.com/developers/mx/undocumentation/qu
我正在跟踪在另一个网站上找到的代码。这是我的代码的基础知识: Dim SQL As String Dim connString As String connString = "ODBC;DSN=DB0
编辑:发现新错误? 我可能刚刚发现为什么我的脚本不再工作了。最近有一个 Office 更新,似乎他们已经实现了 microsoft 查询,它摆脱了我根据需要安装和配置的 ODBC 管理器。现在实际的问
我是一名优秀的程序员,十分优秀!