2016-01-28 349 views
7

編輯:發現新錯誤?刷新QueryTable引發「一般ODBC錯誤」 - VBA Excel 2011 for Mac

我可能剛剛發現爲什麼我的腳本不能工作了。最近有一個辦公室更新,似乎他們已經實施了微軟查詢,擺脫了我安裝並根據需要配置的ODBC-Manager。現在實際的問題可能是這個微軟查詢沒有UNICODE庫,我不知道我可以把它們放在哪裏,這樣微軟的查詢就可以讀取/獲取它們。或者說,我不知道如何給微軟查詢的UNICODE庫的路徑,因爲在經理中沒有可能改變它,或者也許有,我只是沒有找到它?除此之外,我無法打開微軟查詢管理器,除非我直接從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 

我沒有使用。選擇這裏兩次,我知道我應該改變它。

我在Mac上的Excel 2011中工作,所以請注意,並非所有在Windows上工作的東西都能正常工作。

*編輯*

首先:就算我把所有的對象庫激活,這仍然無法正常工作。

其次,我才意識到有些事情我打開對象瀏覽器:

  1. 「ODBCConnection」是一個聲明的類(「Excel的類ODBCConnection會員」)。但是當我在對象瀏覽器中單擊Excel時,無法找到「ODBCConnection」。如果我輸入代碼「Excel.ODBCConnection.Refresh」,則會拋出錯誤「找不到方法或數據成員」,僅突出顯示單詞「ODBCConnection」。當我僅使用ODBCConnection.Refresh(刷新是根據對象瀏覽器的ODBCConnection方法)時,會顯示相同的錯誤。

  2. 我有「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 
+0

heeeeeeeeeelp>< – Kathara

+0

我們曾經遇到過類似的問題,我可以通過聲明一個驅動程序來糾正其中的大部分問題(Teradata通常會給我帶來最大的痛苦)。我也開始避免使用DSN,因爲我有一些喜歡命名完全不同的用戶。而且,如果存在訪問問題,刷新將會失敗。 – Liss

+0

這可能有幫助,但我注意到,strConn =「ODBC; DSN = KundeDB;」 &strLoginData在strLoginData被賦值之前出現。它看起來不像連接字符串包含登錄憑證。只是我的兩分錢! – Snachmo

回答

3

我解決不了你的問題,但我可以幫你調試它。

第一個問題是:那個錯誤信息是什麼意思?它是否告訴你,在數據上運行的查詢或命令有錯誤,或是阻止您連接到數據庫?

它實際上有可能編寫信息性錯誤消息,並且雷蒙德的任何被誤導的天才實現查詢表選擇不通過數據庫服務器和連接庫發出的詳細錯誤信息。

幸運的是,我們自己也做了一些工作。

QueryTable對象有一個連接屬性 - 它是一個字符串,而不是一個全功能的連接對象,但您可以更詳細地檢查它並根據ADODB連接對象進行測試。試試這個功能進行測試連接字符串,並看看是否有任何有用的信息是:

 
Public Sub ConnectionTest(ConnectionString As String)
' Late-binding: requires less effort, but he correct aproach is ' to create a reference to 'Microsoft ActiveX Data Objects' -
'Dim conADO As ADODB.Connection 'Set conADO = New ADODB.Connection
Dim conADO As Object Set conADO = CreateObject("ADODB.Connection")
Dim i As Integer
conADO.ConnectionTimeout = 30 conADO.ConnectionString = ConnectionString
On Error Resume Next
conADO.Open
If conADO.State = 1 Then Debug.Print "Connection string is valid" Else Debug.Print "Connection failed:"

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

End If
Debug.Print "Connection String: " Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab) Debug.Print

Set conADO = Nothing

End Sub

...並將其插入到你的代碼:

 
Dim objQueryTable As Excel.QueryTable 
Dim strConnect as String
set objQueryTable = ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringFirma)
With objQueryTable strConnect = .Connection .BackgroundQuery = False .RefreshStyle = xlOverwriteCells .Refresh ' "General ODBC error" hereeee End With
ConnectionTest strConnect ' view the output in the debug window/immediate pane

如果你可以看到的錯誤,它可能只是我的實現一個ADODB連接不會在你的Mac Office環境下工作:但它是完全可能的,你要麼:

  1. 建立連接,看到它的工作,並eliminat編輯 可能性您的連接字符串或DSN是 問題的來源...
  2. ...或者在連接參數中發現了一個錯誤,您可以在其中修復 。

如果連接正常工作,它可能是您在數據庫上運行的查詢或命令,這是問題的根源 - 而且我在您的問題中看到的錯誤消息也指向該方向 - 所以我們需要深入研究一下。

不幸的是,我無法知道我使用的工具是否適合您:這是開發人員的調試代碼,您需要修補它才能使其工作。

這個問題很複雜的原因是實現QueryTable的Office團隊做了一些有趣的決定:QueryTable公開的'connection'和'recordset'屬性不是全功能對象 - 我認爲它們是接口它允許QueryTable利用來自各種不同提供者的名爲'connection'和'recordset'的對象,並公開一組屬性和方法。對於跨平臺可用性來說這是一個很好的決定,但這意味着需要查詢這些對象的開發人員不能依賴運行時出現的任何給定方法 - ,因此這僅適用於僅在「調試」模式下進行反編譯的代碼。

你還需要註冊微軟DAO和ADO在IDE參考:以「創建對象」後期綁定是錯誤的工具,當你需要能夠在「當地人」窗口來查看這些對象:

 
Public Sub ConnectionDetails(objQueryTable As Excel.QueryTable)
Dim rstADO As ADODB.Recordset Dim conADO As ADODB.Connection
Dim rstDAO As DAO.Recordset Dim conDAO As DAO.Connection
Dim i As Integer

Set objQueryTable = Sheet1.ListObjects(1).QueryTable
With objQueryTable

Debug.Print "Connection String: " Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab) Debug.Print

Debug.Print "Query Type: " & .QueryType ' Documented here: https://msdn.microsoft.com/en-us/library/office/ff835313.aspx Debug.Print "Query: " & .CommandText Debug.Print "Database request type: " & .CommandType ' XlCmdType documented here: https://msdn.microsoft.com/en-us/library/office/ff197456.aspx

.MaintainConnection = True
On Error Resume Next If TypeOf .Recordset Is DAO.Recordset Then

On Error Resume Next Set rstDAO = .Recordset

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

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

ElseIf TypeOf .Recordset Is ADODB.Recordset Then

On Error Resume Next Set rstADO = .Recordset

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
ElseIf Err.Number <> 0 Then

Debug.Print Err.Source & " Error " & Err.Number & ":" & Err.Description

Else

Debug.Print "recordset type is: '" & TypeName(.Recordset) & "': for further information, place a breakpoint in the code and use the 'Locals' window."

End If
End With
End Sub
代碼做什麼 - 或者試圖做的 - 很簡單:它詢問數據庫並檢索詳細的錯誤消息。

他們可能會告訴你,在SQL中有語法錯誤或缺少參數 - 如果數據庫是MS-Access,可能會產生誤導作用:'缺少參數'可能意味着字段名稱或函數名稱未知。這也可能意味着you can't run that SQL outside an MS-Access user session

如果它不能正常工作,回到ConnectionTest代碼並運行對conADO連接對象的命令文本: conADO.Execute strCommandText ......並再次詢問錯誤集合。

這對於我可以解決這個問題的調試工具來說非常重要:希望另一個'堆棧器可以提出其他方法。

+0

在我測試你的代碼之前,還有一些信息:不支持ADODB。你在我的原始文章中按照「Here」這個鏈接,那麼你可以看到我已經嘗試了這個代碼似乎工作之前,我已經發現有關連接到數據庫的許多問題,其中命令.Refresh失敗,但我一直無法找到解決這個問題的方法,這個方法也適用於我,我不明白的是,這個代碼在之前已經運行了,我放入了一行代碼(甚至在刪除它之後),它聲明瞭錯誤在.refresh命令行中出現「General ODBC error」。 – Kathara

+0

另外命令.Recordset以及ODBC.Connection不知道在mac上是excel 2011(至少我得到一個錯誤消息,所以......)。成爲我的對象庫的問題? – Kathara

+0

順便說一句:很多很多謝謝你幫助我...不幸的是,你寫的第一個代碼拋出一個主動-X錯誤,因爲adodb ...我會交換它的odbc,並再次嘗試 – Kathara

相關問題