【问题标题】:Cannot read Database or object read only无法读取数据库或对象只读
【发布时间】:2015-09-21 14:11:42
【问题描述】:

我正在尝试使用 VBA 和 ADO 选项从另一个文件中查询 Excel 文件。当我运行此代码时,它会抛出错误“无法更新数据、数据库或对象只读”:

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  

【问题讨论】:

标签: vba excel ado jet


【解决方案1】:

也许 cmets 中所说的所有内容只需要再次写出,以确保您确实得到了正确的解决方案:

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 中设置对Microsoft ActiveX Data Objects 2.8 Library(或更高版本)的引用 --> References...

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多