ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 列出当前文件夹中所有工作簿中的工作表名

列出当前文件夹中所有工作簿中的工作表名

作者:绿色风 分类: 时间:2022-08-18 浏览:91
楼主
杨开科
示例文件:
列表名.rar
  1. Option Explicit
  2. '作者:杨开科
  3. '列出当前文件夹中所有工作簿中的工作表名(不含此代码所在的工作簿)
  4. '前提:包含此代码的工作簿中必须包含一张名为“目录”的工作表,如果没有,建立之,或替换代码中“目录”为已有表名
  5. '重要知识点:Dir、GetObject,Do While循环、k=k+1用=赋值(初学者可能不易理解)
  6. '2012/3/22
  7. Sub ListSheets()
  8.     Dim arr, lj As String, k As Integer
  9.     Dim dirname As String, wk As Object, i As Integer

  10.     lj = ThisWorkbook.Path    '取得活动工作簿所在的完整路径  ' 指定路径。
  11.     k = 1    '为For循环中的k指定一个初始值
  12.     dirname = Dir(lj & "\*.xls")    '用Dir取得当前工作簿所在文件夹中不带路径的Excel文件名(带扩展名)

  13.     Do While dirname <> ""   ' 建立循环

  14.         If dirname <> ThisWorkbook.Name Then    '如果不是正在运行当前宏代码的工作簿
  15.             Set wk = GetObject(lj & "\" & dirname)    '将 GetObject 返回的对象赋给对象变量
  16.             '-------------------------------------------------------------------------------------
  17.             '变量k的变化情况:假设第一个被处理的工作簿包含3张表,则做完第一个工作簿的处理后,k=4
  18.             '      k=1     '处理第1张表,k的值理从循环体外带入的
  19.             '            k = 1 + 1    '处理完第一个工作簿第1张表
  20.             '            k = 2 + 1    '处理完第一个工作簿第2张表
  21.             '            k = 3 + 1    '处理完第一个工作簿第3张表
  22.             '变量i的变化情况:
  23.             '            wk.Worksheets(1).Name '取得第1个工作表名称
  24.             '            wk.Worksheets(2).Name '取得第2个工作表名称
  25.             '            wk.Worksheets(3).Name '取得第3个工作表名称
  26.             '处理第2个工作簿时变量i仍从1开始,变量k则从4开始(前面的假设成立,即第一个工作簿有3张表)
  27.             '-------------------------------------------------------------------------------------
  28.             For i = 1 To wk.Sheets.Count
  29.                 Sheets("目录").Cells(k, 1).Value = wk.Worksheets(i).Name    '取工作表名
  30.                 Sheets("目录").Cells(k, 2).Value = wk.Name    '取工作簿名
  31.                 k = k + 1    '计数器累加
  32.             Next
  33.             Debug.Print "处理完 " & wk.Name & " 之后k=" & k    '按Ctrl+G打开“立即窗口”可查看处理完每个工作簿之后k的变化"
  34.     wk.Close False    '关闭不保存
  35.             Set wk = Nothing    '释放对象变量
  36.         End If

  37.         dirname = Dir    '查找下一个
  38.     Loop

  39.     End Sub
2楼
杨开科
wk.Close False    '关闭不保存
Set wk = Nothing    '释放对象变量
重新修改了一下代码,这两句一定要加上,及时的将它们关闭和释放也是一种很好的编程习惯。
若没有close其他子程序打开上述工作簿时就会造成问题。
3楼
bluexuemei
学习了!
4楼
yingmh1024
学习了
5楼
l晓璐
Sub 按钮2_单击()

For i = 2 To Sheets.Count

Cells(i, 1) = Sheets(i).Name

Next i




End Sub----这个可以取一个工作簿的工作表名
6楼
纵鹤擒龙水中月
学习
7楼
tigeress
多谢,这段代码用过好几次了:)
但不是特别明白,这个变量不释放会引起什么问题?
因为前面定义的wk是局部变量,每次程序运行过后vba就自动给它初始化了啊
8楼
0Mouse
Set wk=nothing位于Do While……Loop这个循环之内,而wk As Object这个变量声明又在Do While……Loop这个循环之外,何来初始化呢?
不加释放对象变量的语句也不一定就不能得到预期结果,但加上是一种良好的编程习惯,加上以后保证下一个循环的Set wk = GetObject(lj & "\" & dirname)有效,否则可能存在wk还是前一个循环的对象。
类似的代码如下:
dim sr$,i%
for i=1 to 100
    sr=cells(i,1).text
    ……
    sr=""
next
如果在每个循环最后或开始时不清空sr变量,那在这100个循环之内,sr很可能都等于cells(1,1).text。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap