vba - 为什么使用 ADO 打开连接时会打开 Excel 文件?

标签 vba excel excel-2010 ado

  1. 在连接本地驱动器中的 Excel 文件并从中获取数据之前,我使用过 ADO。
    没有打开文件,这正是我所期望的。

  2. 现在我尝试执行相同的操作,但这次是针对位于网络驱动器中的 Excel 文件。
    令我惊讶的是,它打开了文件,但仍然获得了我需要的数据。

这是应该的方式吗?或者我错过了什么?

我使用的代码:

Sub conscious()
    Dim con As ADODB.Connection
    Dim rec As ADODB.Recordset
    Dim dataSource As String

    Set con = New ADODB.Connection
    Set rec = New ADODB.Recordset
    dataSource = "R:\Folder\excelfile.xlsb"

    Dim sconnect As String
    sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & dataSource & ";HDR=Yes;"
    con.Open sconnect: DoEvents 
    Dim sqlstr As String
    sqlstr = "SELECT [H1], [H2], [H3], [H4], [H5], [H6], " & _
            "[H7], [H8], [H9], [H10]" & _
            "FROM [Sheetname$] " & _
            "WHERE H8 IN ('citeria1','criteria2') " & _
            "AND H9 < 29 " & _
            "AND H10 = 1 " & _
            "ORDER By H7;"

    rec.Open sqlstr, con, adOpenStatic, adLockReadOnly: DoEvents

    With Sheet1
        Dim lrow As Long
        lrow = .Range("A" & .Rows.Count).End(xlUp).Row
        If lrow > 1 Then .Range("A2:J" & lrow).ClearContents
        .Range("A2").CopyFromRecordset rec
    End With

    rec.Close: con.Close
    Set rec = Nothing: Set con = Nothing
End Sub

最佳答案

经过一番挖掘,我终于找到了这个奇怪现象背后的原因。 我与我们的网络管理员核实了该文件,它处于无限打开状态。
有人使用了它,但不知何故未能正确关闭它。
我尝试手动打开它,并弹出一条消息“另一个用户”当前正在使用该文件。

我让管理员重置了状态,你好!
我现在可以在不打开文件的情况下连接并获取数据。

对于那些研究过这些的人,我很感激。但为了我(以及那些将来会读到这篇文章的人)安心,你能做同样的测试来验证它是否确实如此吗?
使用另一台机器打开目标文件。
然后使用另一台机器运行上面的代码,看看它是否复制了我所描述的内容。
如果复制了,那么我们就都解决了。

Edit1:您必须使用此行才能使上述代码正常工作。

sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & dataSource & ";" & _
            "Extended Properties=""Excel 12.0;HDR=YES"";"

关于vba - 为什么使用 ADO 打开连接时会打开 Excel 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25400750/

相关文章:

ms-access - 存取ADP-赞成/反对?

vba - 覆盖数据透视表中的双击操作以转到筛选的源数据

excel - 使用 LEFT OUTER JOIN 的 SQL 查询语法错误

arrays - 使用 For Each (Excel VBA) 在目标数组中定位

VBA - 更短的 If/Or 语句

excel - 使用 VBA 在包含某个关键字的任何行之后添加一行并用数据填充列

c# - 如何在没有 Excel 或第 3 方工具的情况下将 xlsx 文件读入 .net?

c#-4.0 - 如何在 C#.net 中使用 EXCEL interop api 读取空单元格值?

vba - 如何更改Excel中文档的名称?

vba - 字典通配符搜索