在连接本地驱动器中的 Excel 文件并从中获取数据之前,我使用过 ADO。
它没有打开文件,这正是我所期望的。现在我尝试执行相同的操作,但这次是针对位于网络驱动器中的 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/