vba - 软返回宏
问题描述
如何修改以下 Word 宏以将软返回转换为硬返回并处理子文件夹中的所有文件以及使用“新文件”作为事件触发器?
Sub ConvertReturns()
'This Sub loops through docx files in a folder, opens each file, finds manual line breaks, replaces each with a paragraph return, saves changed file to a new folder, closes original file.
Dim oSourceFolder, oTargetFolder, oDocName As String
Dim oDoc As Document
Dim oRng As Range
'Set paths to folders for original and converted files on user's hard drive.
oSourceFolder = "C:\Users\Administrator\Desktop\Unprocessed\"
oTargetFolder = "C:\Users\Administrator\Desktop\Processed\"
'Get a handle on the first file in the source folder
oFile = Dir(oSourceFolder & "*.doc")
'Continue doing the following steps until there are no more unprocessed files in the source folder
Do While oFile <> ""
'Open the file
Set oDoc = Documents.Open(FileName:=oSourceFolder & oFile)
'Get the name of the document you just opened
oDocName = Left(oDoc.Name, Len(oDoc.Name) - 3)
'Find all manual line breaks and replace them with paragraph markers
Set oRng = ActiveDocument.Range
With oRng.Find
.Text = "^l"
.Replacement.Text = "^p"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
End With
oRng.Find.Execute Replace:=wdReplaceAll
'Save the changed document with the same name but appended with "_Converted" in your target folder
oDoc.SaveAs oTargetFolder & oDocName & "doc"
'Close the original document without saving changes
oDoc.Close SaveChanges:=False
'Get a handle on the next file in your source folder
oFile = Dir
Loop
End Sub
解决方案
我个人更喜欢使用Scripting.FileSystemObject
; Dir
它通常比解析和重新组合 VBA函数的输出更容易使用。通过Tools -> References...添加对Microsoft Scripting Runtime库的引用。
我建议使用以下功能:
Public Function GetFiles(ByVal roots As Variant) As Collection
Select Case TypeName(roots)
Case "String", "Folder"
roots = Array(roots)
End Select
Dim results As New Collection
Dim fso As New Scripting.FileSystemObject
Dim root As Variant
For Each root In roots
AddFilesFromFolder fso.GetFolder(root), results
Next
Set GetFiles = results
End Function
Private Sub AddFilesFromFolder(folder As Scripting.folder, results As Collection)
Dim file As Scripting.file
For Each file In folder.Files
results.Add file
Next
Dim subfolder As Scripting.folder
For Each subfolder In folder.SubFolders
AddFilesFromFolder subfolder, results
Next
End Sub
这需要一个路径或一个Scripting.Folder
对象(或两者的数组),并File
为传入文件夹的所有子文件夹中的每个文件返回一个对象集合。
然后你可以编写你的代码如下:
Sub ConvertReturns()
'This Sub loops through docx files in a folder recursively, opens each file, finds manual line breaks, replaces each with a paragraph return, saves changed file to a new folder, closes original file.
Dim targetFolder As String
Dim oFile As Scripting.file, oFso As New Scripting.FileSystemObject
Dim oDoc As Document, oRng As Range
Dim fileName As String, fileExtension As String
Dim targetPath As String
'Set paths to folders for original and converted files on user's hard drive.
Const sourceFolder = "C:\Users\Administrator\Desktop\Unprocessed\"
targetFolder = "C:\Users\Administrator\Desktop\Processed\"
'Repeat the following code for each File object in the Collection returned by GetFiles
For Each oFile In GetFiles(sourceFolder)
'This handles any Word Document -- .doc and .docx
If oFile.Type Like "Microsoft Word*" Then
'Open the file
'.Path returns the full path of the file
Set oDoc = Documents.Open(fileName:=oFile.Path)
'Find all manual line breaks and replace them with paragraph markers
Set oRng = ActiveDocument.Range
With oRng.Find
.Text = "^l"
.Replacement.Text = "^p"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
End With
oRng.Find.Execute Replace:=wdReplaceAll
fileName = oFso.GetBaseName(oFile.Name)
fileExtension = oFso.GetExtensionName(oFile.Name)
targetPath = oFso.BuildPath(targetFolder, fileName & "_Converted." & fileExtension)
'Save the changed document with the same name but appended with "_Converted" in your target folder
oDoc.SaveAs targetPath
'Close the original document without saving changes
oDoc.Close SaveChanges:=False
End If
Next
End Sub
参考:
脚本运行时
词对象模型
VBA
推荐阅读
- linux - SSH 环境变量如何与 shell 脚本文件一起使用?
- compiler-construction - Chaitin 的寄存器分配算法:R 寄存器使用了多少种颜色?
- database - 设置 Spring JPA 以处理基于标签的项目搜索的最佳方法是什么?
- mysql - MariaDB 查询加入百万条记录时速度慢
- ruby - 如何将表示 IEEE 754 浮点数的十六进制数字打印为 ruby 中的浮点数
- javascript - Laravel 使用 Ajax 以一种形式更新数据和文件?当方法/类型='PUT'
- javascript - 为什么这个函数不返回值?
- node.js - Heroku 部署在“修剪 devDependencies”步骤中继续失败
- string - 将用户输入转换为汇编中的所有大写字母 (NASM)
- javascript - 如何在不滚动整个页面的情况下向下滚动组件