ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2070|回复: 11

[求助] VBA如何遍历所有文件夹中word

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-6-22 17:05 | 显示全部楼层 |阅读模式
本人最近在进行大量的word替换,在论坛大佬的帮助下,已经把替换文件写好了,现在个人有个小疑问,以下的代码只能做到替换特定文件夹下的word,并不能替换其子文件夹,如想遍历,请问应该如何修改呢?我想过用通配符的形式定义fpath,但好像不成功,麻烦大佬看下。
Sub wordReplace() '正文内容替换
Application.Visible = False
Dim fpath As String, fname As String, doc As Document
fpath = "F:\test\" '文件路径
fname = Dir(fpath & "*.doc?")
Do While fname <> ""
Set doc = Documents.Open(fpath & fname)
With doc
With Selection.Find
.ClearFormatting
    .Text = "环境监测中心站"
    .Replacement.ClearFormatting
    .Replacement.Text = "生态环境监测站"
    .Execute Replace:=wdReplaceAll
End With
.Save
.Close
End With
fname = Dir
Loop
Application.Visible = True
End Sub

TA的精华主题

TA的得分主题

发表于 2021-6-22 20:49 | 显示全部楼层
遍历多级文件夹的帖子论坛很多的,自己搜搜看看呗,没有附件,只能这么说

TA的精华主题

TA的得分主题

发表于 2021-6-22 20:57 | 显示全部楼层

  1. Function 栈遍历(pPath As String, pMask As String, pSub As Boolean)
  2.         'fileNameArr装文件名动态数组,psb子目录开关,pPath搜索起始路径,pMask扩展名(如doc)
  3.         On Error Resume Next
  4.         Dim fileNameArr() As String, DirFile, mf&, pPath1$
  5.        Dim workStack$(), top&    'workstack工作栈,top栈顶变量
  6.     pPath = Trim(pPath)
  7.     If Right(pPath, 1) <> "" Then pPath = pPath & ""    ' 对搜索路径加 backslash(反斜线)
  8.     pPath1 = pPath
  9.     top = 1
  10.     ReDim Preserve workStack(0 To top)
  11.     Do While top >= 1
  12.         DirFile = Dir(pPath1 & "*." & pMask)
  13.         Do While DirFile <> ""
  14.             mf = mf + 1
  15.             ReDim Preserve fileNameArr(1 To mf)
  16.             fileNameArr(mf) = pPath1 & DirFile
  17.             DirFile = Dir
  18.         Loop
  19.         If pSub = False Then Exit Function
  20.         DirFile = Dir(pPath1, vbDirectory)    ' 搜索子目录
  21.         Do While DirFile <> ""
  22.             If DirFile <> "." And DirFile <> ".." Then
  23.                 If (GetAttr(pPath1 & DirFile) And vbDirectory) = vbDirectory Then
  24.                     workStack(top) = pPath1 & DirFile & ""    '压栈
  25.                     top = top + 1
  26.                     If top > UBound(workStack) Then ReDim Preserve workStack(0 To top)
  27.                 End If
  28.             End If
  29.             DirFile = Dir    'next file
  30.         Loop
  31.         If top > 0 Then pPath1 = workStack(top - 1): top = top - 1    '弹栈
  32.     Loop
  33.         栈遍历 = fileNameArr
  34.     End Function
复制代码


使用:
sub test()
arr=("C:\文档保存", "doc", True)
for each fname in arr
    这里放循环处理代码就可以了。
next
end sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-23 10:02 | 显示全部楼层
zhanglei1371 发表于 2021-6-22 20:57
使用:
sub test()
arr=("C:\文档保存", "doc", True)

不好意思,因为我刚接触vba没多久,请问function是要放在哪里的呢?我直接在通用里编辑了后把两段都放上去了,在修改第二段后运行,提示“arr=("C:\文档保存", "doc", True)”编译错误,语法错误。

TA的精华主题

TA的得分主题

发表于 2021-6-23 12:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jiangxsliu 发表于 2021-6-23 10:02
不好意思,因为我刚接触vba没多久,请问function是要放在哪里的呢?我直接在通用里编辑了后把两段都放上 ...

搞错了,是这样:
使用:
sub test()
arr=栈遍历("F:\test\", "doc", True)
for each fname in arr
    这里放循环处理代码就可以了。
next
end sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-24 09:11 | 显示全部楼层
zhanglei1371 发表于 2021-6-23 12:03
搞错了,是这样:
使用:
sub test()

运行提示"arrarr = 杖遍历("F:\test", "doc?", True)中,arr参数不可选“,顺便麻烦您看下我这样写可以么?
Sub wordReplace5() '正文内容替换
Dim doc As Document
arr = 杖遍历("F:\test", "doc?", True)
For Each fname In arr
  Set doc = Documents.Open(fpath & fname)
With doc
With Selection.Find
.ClearFormatting
    .Text = "东莞市环境监测中心站"
    .Replacement.ClearFormatting
    .Replacement.Text = "广东省东莞生态环境监测站"
    .Execute Replace:=wdReplaceAll
End With
.Save
.Close
End With
Application.Visible = True
Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-7-2 09:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhanglei1371 发表于 2021-6-23 12:03
搞错了,是这样:
使用:
sub test()

多谢大佬,我查了你以前在其他帖子的回复,借用了你的代码,完成了遍历工作。

TA的精华主题

TA的得分主题

发表于 2021-8-28 09:18 | 显示全部楼层
本帖最后由 liufei2081 于 2021-8-28 09:48 编辑
zhanglei1371 发表于 2021-6-23 12:03
搞错了,是这样:
使用:
sub test()

提示For循环未初始化,这个怎么改
Sub test()

Dim arr() As String
arr = 栈遍历("F:\test\", "doc", True)
For Each FName In arr
    '这里放循环处理代码就可以了?

Next FName

End Sub
这样不能遍历到子文件夹的文件夹啊


TA的精华主题

TA的得分主题

发表于 2021-8-28 10:34 | 显示全部楼层
本帖最后由 liufei2081 于 2021-8-28 10:35 编辑

测试中测试中测试中

TA的精华主题

TA的得分主题

发表于 2023-12-18 15:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
能提供最后的测试成功的代码吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 19:47 , Processed in 0.037024 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表