1 本地取其他EXCEL的表名,很简单
1.1 下面2种写法都是可以的
Sub williamDing1()
k = 1
For i = 1 To Worksheets.Count
Worksheets("统计").Cells(k, 1) = Worksheets(i).Name
k = k + 1
Next
End Sub
Sub williamDing2()
j = 1
For Each sh1 In Worksheets
Worksheets("统计").Cells(j, 2) = sh1.Name
j = j + 1
Next
End Sub
1.2 跨表去统计,崩溃了,遇到了好多问题
下面这段是错误代码举例
'这是一个错误代码,例子
Sub williamDing10()
path1 = "C:\Users\Administrator\Desktop"
path2 = "test1.xlsm" '为了读其他的EXCEL文件
path3 = "test.xlsm"
j = 1
For Each sh1 In Workbooks(path1 & "\" & path2).Worksheets
Workbooks(path1 & "\" & path3).Worksheets("统计").Cells(j, 2) = sh1.Name
j = j + 1
Next
End Sub
2 跨表取其他工作表内容的问题和解决
2.1 总结下问题
- 引用其他工作表,路径问题
- 操作前需要先打开的问题
- 打开其他工作表,在前台,和后台,避免被打断的问题
2.2 问题1:如何取其他工作簿的名字
- 取workbooks().name
- 如果是本表的,默认省略 wb,或,指定 thisworkbook, activebook 都比较简单
- 如果是取其他表的, workbooks( 文件名 / 相对路径 ).name,只能是相对路径=文件名,而不能是 绝对路径-------感觉这个非常反常理,算特例吧!
- 但是 workbooks.open(绝对路径) 需要是绝对路径
-
file系统的 file 返回的就是绝对路径
-
只有file.name 才是所谓的文件名
-
从文件夹内取的file,是文件
Set fd1 = fso.getfolder(path1)
For Each f1 In fd1.Files
If f1.Name Like "*.xlsm" Then
Debug.Print "f1=" & f1
Debug.Print "f1.Name=" & f1.Name
End If
Next
- 其他方法也可以取得名字:path必须是完整的绝对路径!!
- 其他方法也可以取得名字:思路就是吧 workbook 定义为对象,然后取得其 object.name 属性
- 如对象的方法
- 如对象fso的方法(fso.getfilename() 找不到的文件也不报错,还可以正常返回。。。)
Sub test_getname1()
'------ 取当前,或活跃的工作表名字名字方法
Debug.Print ThisWorkbook.Name
Debug.Print ActiveWorkbook.Name
'------ 取其他工作表名字名字方法
'这下面的算个特例
'workbooks("") 路径是相对路径,居然不是绝对路径,而且要求很严格 ,找不到就报下标越界(对象集合是数组吧?)
Debug.Print Workbooks("test.xlsm").Name
'Debug.Print Workbooks("test333333.xlsm").Name '没有的文件,找不到就报下标越界
'Debug.Print Workbooks("C:\Users\Administrator\Desktop\test.xlsm").Name '有这个文件也报错
'----通用的对象方法, createobject
Dim wb1 As Object
Set wb1 = CreateObject("C:\Users\Administrator\Desktop\test.xlsm")
Debug.Print wb1.Name
'------ fso相关方法
'对文件名识别,fso 最好输入 绝对路径,但是fso 错误路径也不报错可返回,没有灵魂
Dim fso As Object
Set fso = CreateObject("scripting.filesystemobject")
Debug.Print fso.getfilename("C:\Users\Administrator\Desktop\test.xlsm")
'故意写本层级没有的文件,居然不报错
Debug.Print fso.getfilename("test.xlsm")
Debug.Print fso.getfilename("test2222.xlsm")
'用fso取文件名,需要用 getfilename,不能用下面这种
'Dim f1 As Object
'Set f1 = fso.opentextfile("C:\Users\Administrator\Desktop\test.xlsm", 1, False)
'Debug.Print f1.Name
End Sub
2.3 操作其他工作簿workbook前,需要先打开这个 表
代码1: 可以跨表取的其他工作簿的内容
- 下面代码还是有些问题,之后接着优化
- 但可以实现,另外的表无论是否已经打开,都能取到了
Sub williamDing3()
b = 1
path1 = "C:\Users\Administrator\Desktop"
path2 = "test1.xlsm"
path3 = "test.xlsm"
'文件需要打开,才能读取和写,否则无法操作--后面用到他会报,超过下标越界
'但是下面这些写法,会打开新表
'Workbooks.Open (path1 & "\" & path2) '必须加绝对路径,否则找不到
'这下面的2种方法也会打开Excel表
Dim wb1 As Object
'Set wb1 = Workbooks.Open(path1 & "\" & path2)
Set wb1 = CreateObject(path1 & "\" & path2) '打开不再前台显示,其实也打开了
'当前代码的excel不需要额外打开,thisworkbook逻辑上必然是已经打开了
For i = 1 To wb1.Worksheets.Count
Workbooks(path3).Worksheets("统计").Cells(b, 3) = wb1.Worksheets(i).Name
b = b + 1
Next
End Sub