作者:绿色风
分类:
时间:2022-08-18
浏览:129
楼主 杨开科 |
示例文件: 列表名.rar
- Option Explicit
- '作者:杨开科
- '列出当前文件夹中所有工作簿中的工作表名(不含此代码所在的工作簿)
- '前提:包含此代码的工作簿中必须包含一张名为“目录”的工作表,如果没有,建立之,或替换代码中“目录”为已有表名
- '重要知识点:Dir、GetObject,Do While循环、k=k+1用=赋值(初学者可能不易理解)
- '2012/3/22
- Sub ListSheets()
- Dim arr, lj As String, k As Integer
- Dim dirname As String, wk As Object, i As Integer
- lj = ThisWorkbook.Path '取得活动工作簿所在的完整路径 ' 指定路径。
- k = 1 '为For循环中的k指定一个初始值
- dirname = Dir(lj & "\*.xls") '用Dir取得当前工作簿所在文件夹中不带路径的Excel文件名(带扩展名)
- Do While dirname <> "" ' 建立循环
- If dirname <> ThisWorkbook.Name Then '如果不是正在运行当前宏代码的工作簿
- Set wk = GetObject(lj & "\" & dirname) '将 GetObject 返回的对象赋给对象变量
- '-------------------------------------------------------------------------------------
- '变量k的变化情况:假设第一个被处理的工作簿包含3张表,则做完第一个工作簿的处理后,k=4
- ' k=1 '处理第1张表,k的值理从循环体外带入的
- ' k = 1 + 1 '处理完第一个工作簿第1张表
- ' k = 2 + 1 '处理完第一个工作簿第2张表
- ' k = 3 + 1 '处理完第一个工作簿第3张表
- '变量i的变化情况:
- ' wk.Worksheets(1).Name '取得第1个工作表名称
- ' wk.Worksheets(2).Name '取得第2个工作表名称
- ' wk.Worksheets(3).Name '取得第3个工作表名称
- '处理第2个工作簿时变量i仍从1开始,变量k则从4开始(前面的假设成立,即第一个工作簿有3张表)
- '-------------------------------------------------------------------------------------
- For i = 1 To wk.Sheets.Count
- Sheets("目录").Cells(k, 1).Value = wk.Worksheets(i).Name '取工作表名
- Sheets("目录").Cells(k, 2).Value = wk.Name '取工作簿名
- k = k + 1 '计数器累加
- Next
- Debug.Print "处理完 " & wk.Name & " 之后k=" & k '按Ctrl+G打开“立即窗口”可查看处理完每个工作簿之后k的变化"
- wk.Close False '关闭不保存
- Set wk = Nothing '释放对象变量
- End If
- dirname = Dir '查找下一个
- Loop
- 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总版主之一