ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: thestronger

[求助] 使用Adodb读取Excel表格的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-29 17:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 萨秋 于 2014-12-29 18:13 编辑
liu-aguang 发表于 2014-12-29 17:41
你可以尝试以下方式,看能否解决问题.在所有使用者的代码中:
1.让函数返回的是一个数组或是处理后的数据,而 ...

多谢多谢。
可否再具体些,我现在实现的方式如下,是你说的记录集吗。
        AdoConn.Open strConn
        ActiveSheet.Range("A7").CopyFromRecordset AdoConn.Execute(strSql)
        AdoConn.Close
问题是,主要是被导入数据的文件,如果文件所在共享的 路径通畅(不需较长时间检索公共盘),基本上是不会打开被导入文件的,也就说,有时候 直接导入完全可以(而未打开文件)主要是,如果是被导入数据的文件,被其他人正在打开操作时,就无法正常导入,被导的数据居然直接写到了被导入文件(很汗颜),估计是ActiveSheet被跳到了被导文件的表格上了。
要说的,如果是被导入数据的文件,被本机打开时,不存在此问题,很是好奇!

点评

如果可以,贴出完整代码.  发表于 2014-12-29 20:54

TA的精华主题

TA的得分主题

发表于 2014-12-29 22:26 | 显示全部楼层
本帖最后由 萨秋 于 2014-12-29 22:29 编辑

Sub 数据导入_采购()      '应付款  单个导入

    On Error Resume Next
    Dim AdoConn As New ADODB.Connection
    Dim strConn As String, strSql As String, ErrCt As Integer, X As Integer
    Dim FilePath As String                  '个表 文件路径
   
    If ActiveSheet.Range("D5") <> "" Then   '默认未填路径时,取当前总表所在文件路径
        FilePath = ActiveSheet.Range("D5")
    Else
        FilePath = ThisWorkbook.Path
    End If
   
    If Dir(FilePath & "\" & ActiveSheet.Name & ".xlsm", 16) = Empty Then
        MsgBox FilePath & "\" & ActiveSheet.Name & ".xlsm ......该文件不存在!" & Chr(10) & Chr(10) & "    请检查:(1)表格名称是否正确,(2)对应文件是否存在,或文件名是否正确!"
        Exit Sub
    Else
   
        ActiveSheet.Range("A7:V60000").ClearContents
        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & FilePath & "\" & ActiveSheet.Name & ".xlsm"
        strSql = "select * from [采购台账$A3:U]"            '被导文件相应的表单及数据区域
   
        AdoConn.Open strConn
        ActiveSheet.Range("A7").CopyFromRecordset AdoConn.Execute(strSql)
        AdoConn.Close

   End If

End Sub
问题描述说明:被导数据文件(*.xlsm)一般存放在公共盘上,目前状况是如果该文件 在被其他人打开编辑时,数据无法读取(但,如果已经由本台机子打开编辑,则不影响取数)。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-30 11:26 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liu-aguang 发表于 2014-12-29 17:41
你可以尝试以下方式,看能否解决问题.在所有使用者的代码中:
1.让函数返回的是一个数组或是处理后的数据,而 ...

我做了以下实验:rs.open后马上调用rs.close和set rs=nothing 函数不返回任何值。也没用,还是照样打开

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-30 12:37 来自手机 | 显示全部楼层
萨秋 发表于 2014-12-29 17:20
复制的话,不需要打开文件了吗。
请教,在代码中 如何解决,多谢!

Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long

'判斷某文件是否在使用中

Public Function IsFileAlreadyOpen(ByVal FileName As String) As Boolean

Dim hFile As Long

Dim lastErr As Long

hFile = -1 ' 初始化文件句柄.

lastErr = 0

hFile = lOpen(FileName, &H10)

If hFile = -1 Then ' 文件是否能正确打開并可共享

lastErr = Err.LastDllError

Else

lClose (hFile)

End If

IsFileAlreadyOpen = (hFile = -1) And (lastErr = 32)

End Function



Function ReadExcel(strName As String, strSheetName As String) As ADODB.Recordset

Dim Conn As New ADODB.Connection

Dim rs As New ADODB.Recordset

Dim i As Integer

Dim sql As String

On Error Resume Next

If IsFileAlreadyOpen(strName) = True Then '如果文件已經被打開,就複製一份,讀取副本,缺點是自己打開的也會複製

Dim fso As New FileSystemObject

Dim fl As File

Set fl = fso.GetFile(strName)

strName = fl.ParentFolder & "\tmp" '副本去掉xls後綴,避免別人去打開

fl.Copy (strName)

Set fl = fso.GetFile(strName)

fl.Attributes = Hidden '隱藏副本文件

End If

Conn.Open "provider=microsoft.ace.oledb.12.0;extended properties=""Excel 12.0 Xml;HDR=YES"";data source=" & strName '?接EXCEL文件"

sql = "select * from [" & strSheetName & "$]" '打?EXCEL表

rs.Open sql, Conn, adOpenForwardOnly, adLockReadOnly

Set ReadExcel = rs

End Function

TA的精华主题

TA的得分主题

发表于 2014-12-30 19:19 | 显示全部楼层
thestronger 发表于 2014-12-30 12:37
Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iR ...

厉害,多谢多谢!
这个方法,帮了我大忙了,真心感谢。
有个新问题,如果访问的公共盘上,我只有读取的权限,fl.Copy(strName)执行,会提示“拒绝的权限”
这个该如何处理呀?

TA的精华主题

TA的得分主题

发表于 2014-12-30 21:46 | 显示全部楼层
thestronger 发表于 2014-12-30 11:26
我做了以下实验:rs.open后马上调用rs.close和set rs=nothing 函数不返回任何值。也没用,还是照样打开

原来的回复没有仔细看你遇到的问题.所以是没用的.
你与12楼是同样的问题.在这里谈点个人看法:
1.你们的代码结构都是双层系统,即应用程序直接访问数据源.它们用于本地数据访问是没问题的.
2.而远程数据访问肯定会涉及到多用户访问同一数据源的问题.所以最好使用三层系统.比如通过IIS去访问数据源.所以ADO提供了RDS的远程数据访问解决方案.这不是在这里可以说清楚的.

显然第二种方案是复杂的.如果想用第一种方案,只有死马当活马医.由于本人目前没有测试环境,只是提点建义,可以折腾一下:
之一:正如前面有楼层建义的一样,通过"审阅",把数据源工作簿设置为共享,注意各种选项.
之二:在CNN,open之前,修改CursorLocation 类型测试.即:adUseClient和adUseServer
之三:测试一下如果只是操作查询(即不返回记录集)是否会导致目前的现象.如果不会,则在代码中加一段用SQL的 SELECT INTO 语法在当地生成一个同内容的新工作簿.然后操作这个新生成的工作簿.
想到的就这些.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-1 06:29 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
萨秋 发表于 2014-12-30 19:19
厉害,多谢多谢!
这个方法,帮了我大忙了,真心感谢。
有个新问题,如果访问的公共盘上,我只有读取的 ...

那你就copy到本机硬盘上呐

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-1 06:33 来自手机 | 显示全部楼层
liu-aguang 发表于 2014-12-30 21:46
原来的回复没有仔细看你遇到的问题.所以是没用的.
你与12楼是同样的问题.在这里谈点个人看法:
1.你们的 ...

你的之一,还没试,之二早就试了没用,之三,你可能没看清楚我说的,我open后什么都不做,马上close,都仍然会出这问题

TA的精华主题

TA的得分主题

发表于 2015-1-4 23:16 | 显示全部楼层
thestronger 发表于 2015-1-1 06:33
你的之一,还没试,之二早就试了没用,之三,你可能没看清楚我说的,我open后什么都不做,马上close,都仍 ...

http://club.excelhome.net/thread-1168008-1-1.html

我也遇到相同的问题,我的方法是用代码在后台把打开的文件全部关掉。关于activesheet问题,你说读取的内容写入到源文件中了,我是通过引用工作表名称的方法来解决的,不要用activesheet来引用工作表。我现在通过这样已经解决了我的问题,尽管不是非常完美。
至于有人提到说用copy的方法,如果文件比较小的话倒是可以一试,但是如果文件比较大或者文件比较多的话就不太好了。比如我的源文件有好多个并且文件比较大,执行联合查询,copy的话会可能会比较费时间。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-6 08:28 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Will.li 发表于 2015-1-4 23:16
http://club.excelhome.net/thread-1168008-1-1.html

我也遇到相同的问题,我的方法是用代码在后台把打 ...

你可能没看清楚,我说的是别的电脑打开时会出现这种情况。你在后台怎么去关别的电脑的进程呢?就算关得了,也要别人愿意啊。复制文件是要费时间,1m的文件要多用0点秒,不过相对也要快得多
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-29 11:37 , Processed in 0.048843 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表