我有一个长达几百页的Word文档。
我想使用宏根据某些规则自动创建大约十几个子文档(主要是每个部分中出现某些字符串)。
这可能吗?我应该阅读哪些VBA功能?有没有人知道任何代码示例甚至远程相似,我可以为我的目的定制?
由于
答案 0 :(得分:2)
我花了一些时间来弄清楚如何做到这一点,即使是使用知识库文章。
首先,您需要将宏放入Normal.dotm ...在Word中打开C:\ Users \ Yourname \ AppData \ Roaming \ Microsoft \ Templates \ Normal.dotm,按Alt-F11,然后将以下内容粘贴到模块1:
Sub BreakOnSection()
Application.ScreenUpdating = False 'Makes the code run faster and reduces screen flicker a bit.
' Used to set criteria for moving through the document by section.
Application.Browser.Target = wdBrowseSection
strBaseFilename = ActiveDocument.Name
On Error GoTo CopyFailed
'A mail merge document ends with a section break next page.
'Note: Document may or may not end with a section break,
For I = 1 To ActiveDocument.Sections.Count
'Select and copy the section text to the clipboard.
ActiveDocument.Bookmarks("\Section").Range.Copy
'Create a new document to paste text from clipboard.
Documents.Add
Selection.Paste
DocNum = DocNum + 1
strNewFileName = Replace(strBaseFilename, ".do", "_" & Format(DocNum, "000") & ".do")
ActiveDocument.SaveAs "C:\Destination\" & strNewFileName
ActiveDocument.Close
' Move the selection to the next section in the document.
Application.Browser.Next
Next I
Application.Quit SaveChanges:=wdSaveChanges
End
CopyFailed:
'MsgBox ("No final Section Break in " & strBaseFilename)
Application.Quit SaveChanges:=wdSaveChanges
End
End Sub
保存Normal.dotm文件。
执行此代码会将由多个部分组成的文档拆分为C:\ Destination目录中的多个文档,然后关闭Word。
您可以通过命令行执行此操作:
"c:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /mBreakOnSection "C:\Path to Source\Document with multiple sections.doc"
要处理目录中的所有.doc文件,请按如下所示创建批处理文件,然后执行它:
@ECHO off
set "dir1=C:\Path to Source"
echo running
FOR %%X in ("%dir1%\*.doc") DO "c:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /mBreakOnSection "%%~X"
echo Done
pause
答案 1 :(得分:2)
Sub SplitFromSectionBreak()
'use this to split document from section break
Dim i
Selection.HomeKey Unit:=wdStory
Application.ScreenUpdating = False
'------ count how much section in document---------
MsgBox (ActiveDocument.Sections.count - 1 & " Sections Found In This Document")
'-------set path where file to save----------------
Dim path As String
path = InputBox("Enter The Destination Folder You Want To Save Files. ", "Path", "C:\Users\Ashish Saini\Desktop\Section Files\")
For i = 1 To ActiveDocument.Sections.count - 1
With Selection.Find
.Text = "^b"
.Forward = False
.Execute
.Text = ""
End With
Selection.Extend
With Selection.Find
.Text = "^b"
.Forward = True
.Wrap = wdFindStop
.Execute
.Text = ""
End With
Selection.Copy
Documents.Add
Selection.Paste
Call Del_All_SB
'-----------------------------------------------------------------------
If Dir(path) = "" Then MkDir path 'If path doesn't exist create one
ChangeFileOpenDirectory path
DocNum = DocNum + 1
ActiveDocument.SaveAs filename:="Section_" & DocNum & ".doc"
ActiveDocument.Close
Next i
path = "c:\"
ChangeFileOpenDirectory path
End Sub
Sub Del_All_SB()
' this macro also associated with Delete_SectionBreaks()
'TO DELETE ALL SECTIONS IN DOCUMENT
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^12"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
答案 2 :(得分:1)
按页计数器分割word文档,例如使用50步骤
Sub Spliter(PartStep)
If IsEmpty(PartStep) Or Not IsNumeric(PartStep) Then
Exit Sub
End If
Dim i, s, e, x As Integer
Dim rgePages As Range
Dim MyFile, LogFile, DocFile, DocName, MyName, MyPages, FilePath, objDoc
Set fso = CreateObject("scripting.filesystemobject")
Selection.GoTo What = wdGoToLine, Which = wdGoToFirst
Application.ScreenUpdating = False
ActiveDocument.Repaginate
MyPages = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
DocFile = ActiveDocument.FullName
intPos = InStrRev(DocFile, ".")
MyName = Left(DocFile, intPos - 1)
If Not fso.folderexists(MyName) Then
fso.createfolder (MyName)
FilePath = MyName
Else
FilePath = MyName
End If
x = 0
'MsgBox MyPages
For i = 0 To MyPages Step PartStep
If i >= MyPages - PartStep Then
s = e + 1
e = MyPages
Else
s = i
e = i + (PartStep - 1)
End If
'MsgBox (i & " | " & s & " | " & e)
Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, count:=s
Set rgePages = Selection.Range
Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, count:=e
rgePages.End = Selection.Bookmarks("\Page").Range.End
rgePages.Select
Selection.Copy
x = x + 1
Set objDoc = Documents.Add
Selection.GoTo What = wdGoToLine, Which = wdGoToFirst
Selection.PasteAndFormat (wdFormatOriginalFormatting)
DocName = FilePath & "/" & "part" & Format(x, "000") & ".docx"
ActiveDocument.SaveAs2 FileName:=DocName, _
FileFormat:=wdFormatXMLDocument, _
CompatibilityMode:=14
ActiveDocument.Close savechanges:=wdDoNotSaveChanges
Next i
Set objDoc = Documents.Add
DocName = FilePath & "/" & "Merg" & ".docx"
ActiveDocument.SaveAs2 FileName:=DocName, _
FileFormat:=wdFormatXMLDocument, _
CompatibilityMode:=14
ActiveDocument.Close savechanges:=wdDoNotSaveChanges
Windows(1).Activate
ActiveDocument.Close savechanges:=wdDoNotSaveChanges
Dim oData As New DataObject 'object to use the clipboard
oData.SetText Text:=Empty 'Clear
oData.PutInClipboard 'take in the clipboard to empty it
Application.Quit
End Sub
sub test()
Call Spliter(50)
end sub