ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于VBA获取未打开文件的工作表名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-12-18 17:51 | 显示全部楼层 |阅读模式
大家好,小弟这边有个问题请大家帮忙

现有文件F:\test\test.xls,文件中有工作表test1,test2....

我打开另一个文件F:\test\total.xls,在文件test.xls未打开的情况下,如果获取test.xls中的工作表名(test1,test2,....),并写入在total.xls中的指定工作表中

TA的精华主题

TA的得分主题

发表于 2009-12-18 20:07 | 显示全部楼层
不打开文件读取文件内容是不可能的,可以打开后读取内容再关闭

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-18 20:20 | 显示全部楼层
原帖由 cflood 于 2009-12-18 20:07 发表
不打开文件读取文件内容是不可能的,可以打开后读取内容再关闭


可以的,以下代码就是我从中截取的,我运行过,可以实现对已知的工作表名取数,但无法获取工作表名
     Arg = "'" & MyAllFiles(l, 1) & "[" & CStr(varFileList(l)) & "]" & MyAllFiles(l, 2) & "'!" & Cells(M, 3).Range("A1").Address(, , xlR1C1)
        If ExecuteExcel4Macro(Arg) = "" Then Exit For '如果记录为空,则跳出For循环
        MyCount = Sheet1.UsedRange.Rows.Count
        For N = 1 To 17
            Arg = "'" & MyAllFiles(l, 1) & "[" & CStr(varFileList(l)) & "]" & MyAllFiles(l, 2) & "'!" & Cells(M, N).Range("A1").Address(, , xlR1C1)
            Sheet1.Cells(MyCount + 1, N) = ExecuteExcel4Macro(Arg)
            Sheet1.Cells(MyCount + 1, 18) = MyAllFiles(l, 2)
        Next N

[ 本帖最后由 uling 于 2009-12-18 20:22 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-12-18 20:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
比如在单元格里输入='F:\[book1.xls]sheet1'!$A$6
虽然你看着没有打开excel窗口,但在后台肯定会打开这个文件的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-18 20:33 | 显示全部楼层
和你说的不是一个概念的
这里主要是用到ExecuteExcel4Macro

TA的精华主题

TA的得分主题

发表于 2009-12-18 20:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
关注一下。

TA的精华主题

TA的得分主题

发表于 2009-12-18 20:56 | 显示全部楼层
请测试:ADOX方法

Sub AdoTs()

Dim cat
Dim cnn
Dim c

    Set cnn = CreateObject("ADODB.Connection")
    Set cat = CreateObject("ADOX.Catalog")
    cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='Excel 8.0';Data Source = " _
            & "F:\test\test.xls"
   
    Set cat.ActiveConnection = cnn
    For Each c In cat.Tables
        MsgBox c.Name
    Next c
    Set c = Nothing
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set cnn = Nothing

End Sub

TA的精华主题

TA的得分主题

发表于 2009-12-18 21:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 uling 于 2009-12-18 20:33 发表
和你说的不是一个概念的
这里主要是用到ExecuteExcel4Macro

不要说ExecuteExcel4Macro,就是系统调用dll里的过程也要把dll文件打开才行,要不怎么读取过程内容,只不过没有窗口罢了。

TA的精华主题

TA的得分主题

发表于 2009-12-18 22:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub abc()
Set mycn = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
Dim tb As String
mystr = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.Path & "\abc.xls"
mycn.CursorLocation = adUseClient
mycn.Open mystr
Set rs = mycn.OpenSchema(adSchemaTables)
For i = 1 To rs.RecordCount
   MsgBox rs.Fields("TABLE_NAME")
    rs.MoveNext
Next
Set mycn = Nothing: Set rs = Nothing
End Sub
但测了不太准确,楼上的SQL方法,也不太准确,我也试了。
我的附件中的只有一个工作表,但还有一些定义了名称的区域,而SQL把这名称区域,也当作了表。数据库中的表与工作薄中的表,不是一个概念。
不知道OpenSchema(),还有没有其它的参数,能达到更准确。

代码在123中。

[ 本帖最后由 detergent181 于 2009-12-18 22:18 编辑 ]

abc123.rar

10.25 KB, 下载次数: 96

TA的精华主题

TA的得分主题

发表于 2009-12-18 22:34 | 显示全部楼层
原帖由 detergent181 于 2009-12-18 22:15 发表
Sub abc()
Set mycn = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
Dim tb As String
mystr = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source= ...

代码测试了,以前没有发现定义名称这个问题,谢谢
测试后发现命名和表名稍微不同,如下:
axc
'page 1$'《=表名
'page 1$'Print_Area〈=定义名称
'page 1$'Print_Titles〈=定义名称

运行的代码:
Sub AdoTs()

Dim cat
Dim cnn
Dim c

    Set cnn = CreateObject("ADODB.Connection")
    Set cat = CreateObject("ADOX.Catalog")
    cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='Excel 8.0';Data Source = " _
            & ThisWorkbook.Path & "\abc.xls"
   
    Set cat.ActiveConnection = cnn
    For Each c In cat.Tables
        Debug.Print c.Name
    Next c
    Set c = Nothing
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set cnn = Nothing

End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-16 07:45 , Processed in 0.024536 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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