zchhst 2022-06-17 09:32 采纳率: 50%
浏览 21
已结题

VBA、FSO、不遍历docx问题的解决

问题遇到的现象和发生背景:

使用VBA-FSO对象方法遍历文件夹及子文件夹的部分内容并复制到当前文件夹,问题有如下:①代码:Set w1 = Workbooks.Open(files.Path),遇到docx的内容时,报错显示格式无效,请问如何调整,只用遍历xlsx格式,不需要docx格式进行遍历;②遍历的文件老是要自动弹出,如何设置调整新增代码避免手工弹出。

img

写的代码如下:ub 所有文件夹()
Dim fs As New FileSystemObject, arr(), i, j, k, wb, g, test
Dim fd, subfd As Folder
Dim files As file
Set fp = Application.FileDialog(msoFileDialogFolderPicker) '选择需要查询文件的文件夹
fp.Show
Set paths = fp.SelectedItems
ReDim arr(1)
arr(0) = paths(1) '文件夹路径赋给数组
Application.ScreenUpdating = False
Do Until i > k
Set fd = fs.GetFolder(arr(i))
For Each files In fd.files
j = j + 1

    'Range("a" & j + 1).Hyperlinks.Add Anchor:=Range("a" & j + 1), Address:=files.Path, TextToDisplay:=files.Name
    Set w1 = Workbooks.Open(files.Path)
    'Range("b" & j + 1) = files.DateLastModified
    'Range("C" & j + 1) = files.Size \ 1024 & "KB"
    g = w1.Sheets(1).Range("a1048576").End(xlUp).Row
    w1.Sheets(1).Range("D1:D1" & g).Copy Destination:=ThisWorkbook.Sheets(1).Range("a1048576").End(xlUp).Offset(1, 0)
    w1.Close

    
Next
For Each subfd In fd.SubFolders
    k = k + 1
    ReDim Preserve arr(k + 1)
    arr(k) = subfd  '将子文件夹赋给数组
Next
i = i + 1

Loop
MsgBox ("一共有" & j & "个文件," & k & "个文件夹")
Application.ScreenUpdating = True
End Sub

  • 写回答

3条回答

  • Hello World, 2022-06-17 11:13
    关注
    
    Sub 所有文件夹()
        Dim fs As New FileSystemObject, arr(), i, j, k, wb, g, test
        Dim fd, subfd As Folder
        Dim files As file
        Set fp = Application.FileDialog(msoFileDialogFolderPicker) '选择需要查询文件的文件夹
        fp.Show
        Set paths = fp.SelectedItems
        ReDim arr(1)
        arr(0) = paths(1) '文件夹路径赋给数组
        Application.ScreenUpdating = False
        Do Until i > k
            Set fd = fs.GetFolder(arr(i))
            For Each file In fd.files
                If LCase(Right(file.Name, 5)) = ".xlsx" Then '限制为xlsx扩展名的文件
                    j = j + 1
                    Set w1 = Workbooks.Open(file.Path)
                    g = w1.Sheets(1).Range("a1048576").End(xlUp).Row
                    w1.Sheets(1).Range("D1:D1" & g).Copy Destination:=ThisWorkbook.Sheets(1).Range("a1048576").End(xlUp).Offset(1, 0)
                    w1.Close False  '退出时不保存
                End If
            Next
            For Each subfd In fd.SubFolders
                k = k + 1
                ReDim Preserve arr(k + 1)
                arr(k) = subfd  '将子文件夹赋给数组
            Next
            i = i + 1
        Loop
        MsgBox ("一共有" & j & "个文件," & k & "个文件夹")
        Application.ScreenUpdating = True
    End Sub
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月17日

悬赏问题

  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services