2015-09-21 81 views
0

我想從使用VBA和ADO選項的另一個文件查詢Excel文件。當我運行這段代碼它拋出的錯誤「無法UPDATA,數據庫或對象只讀」:無法讀取數據庫或對象只讀

Public Function fnExecuteXlQuery _ 
    (ByVal strPath As String, _ 
    ByVal strQuery As String) As ADODB.Recordset 

Dim rs As ADODB.Recordset 
Dim conStr As String 

On Error GoTo ErrorHandler 

conStr = "Provider=Microsoft.Jet.OLEDB.4.0; " _ 
     & "Data Source=" & strPath & "; Extended Properties=Excel 8.0" 

Set rs = New ADODB.Recordset 
rs.Open strQuery, conStr, adOpenDynamic 

Set fnExecuteXlQuery = rs 

Exit Function 
ErrorHandler: 
Set fnExecuteXlQuery = Nothing 
fnDisplayError Error(Err) & "Unable to fetch data from DTS...", ERROR_TYPE_ERROR 
End Function 

的「strPath的」是源Excel文件和「strquery」有下面的SQL代碼:

Select [Activity],[Name],[Date],[Hours Spent] 
from [Time sheet$] 
where [Activity] = 'Billable Activities' 
Order by Name,date 
+0

詢問顯而易見 - 是'strPath'拼寫正確的所有文件夾路徑和文件名等? –

+0

是的,沒有變化 – Anarach

+0

我看不到有任何更新正在進行。你真的在哪裏得到錯誤? – Rory

回答

1

或許所有什麼在評論中所述的情況只需要寫出一次,以確保你真的得到了解決權:

Option Explicit 

Public Sub ConnectionToExcel() 
Dim rstResult As ADODB.Recordset 
Dim strConnectin As String 
Dim strPath As String 
Dim strSQL As String 

strPath = "C:\Data\YourFile.xlsm" 

strConnectin = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source='" & strPath & "';Extended Properties=""Excel 12.0 XML;HDR=YES;IMEX=1"" " 
Debug.Print strConnection 

strSQL = "SELECT * FROM [Time sheet$] " 

Set rstResult = New ADODB.Recordset 
rstResult.Open strSQL, strConnectin, adOpenForwardOnly, adLockReadOnly, adCmdText 

Sheet1.Range("A1").CopyFromRecordset rstResult 

End Sub 

請注意,我一次只做一步:(1)我使用的是sub而不是函數。 (2)select已經過簡化,只是爲了測試連接,可以稍後進行擴展。 (3)將結果寫回第一張。 (4)進一步限制記錄集僅爲adOpenForwardOnlyadLockReadOnly

此外,請記住,上述代碼使用早期綁定,因此需要您在Tools - >References...中設置對Microsoft ActiveX Data Objects 2.8 Library(或更高版本)的引用。