VBA跨表操作和取数据的各种问题,如跨表取其他EXCEL工作簿的sheet名

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

 

发布了370 篇原创文章 · 获赞 45 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/103806705