2015-09-21 84 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(或更高版本)的引用。