![]() |
|
#1
|
|||
|
|||
|
Hello All,
I find this VBA program and have been trying to modify it. I'm having some issues. I'm trying to search multiple word files between two headings. But the headings in each of these word files are not Heading Style format, instead, it is Normal Style. I need the program to search each word documents and output the text/body include tables, photos, etc between the two headings. Any thoughts on how I can do this? Sub CP_Between_Text() Application.ScreenUpdating = False Dim strFolder As String, strFile As String, strDocNm As String, strTmp As String, strOut As String Dim wdDoc As Document, Rng As Range, i As Long Dim FindWord1, FindWord2 As String Dim result As String FindWord1 = "System Safety Assessment Summary" FindWord2 = "Hardware Considerations" strDocNm = ActiveDocument.FullName strFolder = GetFolder: If strFolder = "" Then Exit Sub strFile = Dir(strFolder & "\*.docx", vbNormal) While strFile <> "" If strFolder & "" & strFile <> strDocNm Then Set wdDoc = Documents.Open(FileName:=strFolder & "" & strFile, AddToRecentFiles:=False, Visible:=False) strTmp = "" With wdDoc With .Range With .Find .ClearFormatting .Replacement.ClearFormatting .Text = FindWord1 .Replacement.Text = "" .Format = False .Forward = True .Wrap = 1 .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute For i = 0 To UBound(Split(.Text, ",")) .Text = Split(.Text, ",")(i) .Execute If .Found = True Then strTmp = strTmp & ", " & Split(.Text, ",")(i) Next End With If strTmp <> "" Then strOut = strOut & vbCr & strFile & ": " & strTmp .Close SaveChanges:=True End With End If strFile = Dir() Wend Set wdDoc = Nothing ActiveDocument.Range.Text = "The following matches were made:" & strOut Application.ScreenUpdating = True End Sub Function GetFolder() As String Dim oFolder As Object GetFolder = "" Set oFolder = CreateObject("Shell.Application").BrowseForFolder( 0, "Choose a folder", 0) If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path Set oFolder = Nothing End Function |
|
#2
|
|||
|
|||
|
Hello All,
I'm still can't figure it out. I try this method but it doesn't printout the results to the word doc. With .Find .ClearFormatting .Replacement.ClearFormatting .Text = "Functional Hazard Analysis/System Safety Assessment Summary^p" .Style = "Heading 1" .Format = True .Wrap = wdFindStop .MatchCase = True .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute End With If .Find.Found = True Then Set Rng = .Duplicate Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel") Rng.Start = Rng.Paragraphs.First.Range.End Rng.End = Rng.Paragraphs.Last.Range.Start End If |
|
#3
|
||||
|
||||
|
Your first post says the headings are not using heading styles. Your second post has code that won't work if that is the case.
If you want a hand with this task you need to provide a sample document that demonstrates the actual setup of your files. You also need to be clearer on what you want to happen when the range is determined. Do you want to output the range on the current printer?
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
|
#4
|
|||
|
|||
|
Hello Andrew,
I'm new to VBA. I find these two Macro programs and have been trying to modify the application. I'm trying to run the Macro to search thru several hundred Word documents for the following headings "System Safety Assessment Summary" and "Hardware Considerations." Once the headings are found, the Macro will copy the body includes tables and figures. The Macro will output the results in the current document running the program, then the Macro will go to the next Word document and repeat the process. I have attached an example. Any idea how I can do this? Much appreciated for the assist. |
|
#5
|
||||
|
||||
|
Your document has lots of manual page breaks. You could convert those to section breaks and then extract the appropriate sections to another document e.g. as follows, which will work with you sample.
Start with no documents open then run the following macro. I would recommend working with a small selection of documents in the selected folder to test the process works for you. Code:
Option Explicit
Sub ExtractData()
'Graham Mayor - https://www.gmayor.com - Last updated - 23 Nov 2021
Dim oDoc As Document
Dim oSource As Document
Dim oRng As Range, oDocRng As Range
Dim lSec As Long, lPara As Long
Dim fDialog As FileDialog
Dim strPath As String, strFile As String
If Documents.Count = 0 Then Documents.Add
Set oDoc = ActiveDocument
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
.Title = "Select folder and click OK"
.AllowMultiSelect = False
.InitialView = msoFileDialogViewList
If .Show <> -1 Then
MsgBox "Cancelled By User", , "List Folder Contents"
Exit Sub
End If
strPath = fDialog.SelectedItems.Item(1)
If Right(strPath, 1) <> "\" Then strPath = strPath + "\"
End With
strFile = Dir$(strPath & "*.docx")
While strFile <> ""
Set oSource = Documents.Open(strPath & strFile)
Set oRng = oSource.Range
With oRng.Find
Do While .Execute("^m")
oRng.Text = ""
oRng.InsertBreak wdSectionBreakNextPage
oRng.Collapse 0
Loop
End With
If Len(oDoc.Range) > 1 Then
Set oRng = oDoc.Range
oRng.Collapse 0
oRng.InsertBreak wdPageBreak
End If
For lSec = 1 To oSource.Sections.Count
For lPara = 1 To oSource.Sections(lSec).Range.Paragraphs.Count
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Text Like "*System Safety Assessment Summary*" Then
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Style = "ForCertPlanTOC" Then
Set oDocRng = oDoc.Range
oDocRng.Collapse 0
oDocRng.FormattedText = oSource.Sections(lSec).Range.FormattedText
oDocRng.InsertParagraphAfter
Exit For
End If
End If
Next lPara
For lPara = 1 To oSource.Sections(lSec).Range.Paragraphs.Count
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Text Like "*Hardware Considerations*" Then
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Style = "ForCertPlanTOC" Then
Set oDocRng = oDoc.Range
oDocRng.Collapse 0
oDocRng.FormattedText = oSource.Sections(lSec).Range.FormattedText
oDocRng.InsertParagraphAfter
Exit For
End If
End If
Next lPara
Next lSec
If oDoc.Sections.Count > 2 Then
Set oRng = oDoc.Sections.Last.Range.Previous
oRng.End = oDoc.Range.End
oRng.Delete
End If
oSource.Close SaveChanges:=wdDoNotSaveChanges
strFile = Dir$()
Wend
lbl_Exit:
Set fDialog = Nothing
Set oSource = Nothing
Set oDoc = Nothing
Set oRng = Nothing
Set oDocRng = Nothing
Exit Sub
End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#6
|
|||
|
|||
|
Hello Graham,
Thank you for helping out. I still have over 1000 word documents (.docx) to scan. Adding the section break in each of these documents will take forever. Is there a way to search between "System Safety Assessment Summary" and "Hardware Considerations" without adding the section break? Also, is there a way to output the filename along with the copied information? |
|
#7
|
||||
|
||||
|
If the documents have manual page breaks like your example, the temporary conversion to section breaks is performed by the macro and takes only a fraction of a second. Where do you want the filename to be placed?
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#8
|
|||
|
|||
|
Hello Graham,
Can I add this code to the existing macro for the section break? word.Selection.HomeKey word.Selection.InsertBreak Type:=wdPageSectionBreakThe filename will be output first, then the copied data between the two headings under the filename. Maybe adding a page break before repeating for the next word doc. Thank you, New to Marco VBA |
|
#9
|
||||
|
||||
|
I have added the filename in the code below. What is the purpose of the section break you want adding? It is not required for the process you outlined and there is already a page break between the Word documents. The code works provided the documents are similar to the sample you posted.
Code:
Option Explicit
Sub ExtractData()
'Graham Mayor - https://www.gmayor.com - Last updated - 23 Nov 2021
Dim oDoc As Document
Dim oSource As Document
Dim oRng As Range, oDocRng As Range
Dim lSec As Long, lPara As Long
Dim fDialog As FileDialog
Dim strPath As String, strFile As String
If Documents.Count = 0 Then Documents.Add
Set oDoc = ActiveDocument
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
.Title = "Select folder and click OK"
.AllowMultiSelect = False
.InitialView = msoFileDialogViewList
If .Show <> -1 Then
MsgBox "Cancelled By User", , "List Folder Contents"
Exit Sub
End If
strPath = fDialog.SelectedItems.Item(1)
If Right(strPath, 1) <> "\" Then strPath = strPath + "\"
End With
strFile = Dir$(strPath & "*.docx")
While strFile <> ""
Set oSource = Documents.Open(strPath & strFile)
Set oRng = oSource.Range
With oRng.Find
Do While .Execute("^m")
oRng.Text = ""
oRng.InsertBreak wdSectionBreakNextPage
oRng.Collapse 0
Loop
End With
If Len(oDoc.Range) > 1 Then
Set oRng = oDoc.Range
oRng.Collapse 0
oRng.InsertBreak wdPageBreak
End If
For lSec = 1 To oSource.Sections.Count
For lPara = 1 To oSource.Sections(lSec).Range.Paragraphs.Count
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Text Like "*System Safety Assessment Summary*" Then
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Style = "ForCertPlanTOC" Then
Set oDocRng = oDoc.Range
oDocRng.Collapse 0
oDocRng.Text = oSource.Name & vbCr
oDocRng.Collapse 0
oDocRng.FormattedText = oSource.Sections(lSec).Range.FormattedText
oDocRng.InsertParagraphAfter
Exit For
End If
End If
Next lPara
For lPara = 1 To oSource.Sections(lSec).Range.Paragraphs.Count
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Text Like "*Hardware Considerations*" Then
If oSource.Sections(lSec).Range.Paragraphs(lPara).Range.Style = "ForCertPlanTOC" Then
Set oDocRng = oDoc.Range
oDocRng.Collapse 0
oDocRng.FormattedText = oSource.Sections(lSec).Range.FormattedText
oDocRng.InsertParagraphAfter
Exit For
End If
End If
Next lPara
Next lSec
If oDoc.Sections.Count > 2 Then
Set oRng = oDoc.Sections.Last.Range.Previous
oRng.End = oDoc.Range.End
oRng.Delete
End If
oSource.Close SaveChanges:=wdDoNotSaveChanges
strFile = Dir$()
Wend
lbl_Exit:
Set fDialog = Nothing
Set oSource = Nothing
Set oDoc = Nothing
Set oRng = Nothing
Set oDocRng = Nothing
Exit Sub
End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#10
|
|||
|
|||
|
Hello Graham,
I apologize for the confusion. Not all of the word documents have a page break or section break for the headings. I was looking for a way to search without the page/section break (The only thing consistent is the Heading Titles: "System Safety Assessment Summary" and "Hardware Considerations"). Best Regards, New To VBA |
|
#11
|
||||
|
||||
|
That certainly makes things more complicated. Do all the documents have the same order of headings? i.e. is "Hardware Considerations" always followed by "Conclusions" or have I misunderstood the requirement and you only want the "Hardware Considerations" section in the new document? In that case
Code:
Option Explicit
Sub ExtractSummary()
'Graham Mayor - https://www.gmayor.com - Last updated - 25 Nov 2021
Const sStart As String = "System Safety Assessment Summary"
Const sEnd As String = "Hardware Considerations"
Dim oDoc As Document
Dim bStartFound As Boolean, bEndFound As Boolean
Dim oSource As Document
Dim oRng As Range, oRng2 As Range, oDocRng As Range
Dim lPara As Long, lStart As Long
Dim fDialog As FileDialog
Dim strPath As String, strFile As String
If Documents.Count = 0 Then Documents.Add
Set oDoc = ActiveDocument
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
.Title = "Select folder and click OK"
.AllowMultiSelect = False
.InitialView = msoFileDialogViewList
If .Show <> -1 Then
MsgBox "Cancelled By User", , "List Folder Contents"
Exit Sub
End If
strPath = fDialog.SelectedItems.Item(1)
If Right(strPath, 1) <> "\" Then strPath = strPath + "\"
End With
strFile = Dir$(strPath & "*.docx")
While strFile <> ""
Set oSource = Documents.Open(strPath & strFile)
Set oRng = oSource.Range
For lPara = 1 To oRng.Paragraphs.Count
If InStr(1, oRng.Paragraphs(lPara).Range.Text, sStart) > 0 Then
If oRng.Paragraphs(lPara).Range.Style = "ForCertPlanTOC" Then
oRng.Start = oRng.Paragraphs(lPara).Range.Start
lStart = lPara + 1
bStartFound = True
Exit For
End If
End If
Next lPara
If bStartFound = False Then GoTo Skip
For lPara = lStart To oSource.Paragraphs.Count
Set oRng2 = oSource.Paragraphs(lPara).Range
If InStr(1, oRng2.Text, sEnd) > 0 Then
oRng.End = oRng2.Start - 2
bEndFound = True
End If
Next lPara
If bEndFound = False Then GoTo Skip
Set oDocRng = oDoc.Range
If Len(oDocRng) > 1 Then
oDocRng.Collapse 0
oDocRng.InsertBreak wdPageBreak
Set oDocRng = oDoc.Range
oDocRng.Collapse 0
End If
oDocRng.Text = oSource.Name & vbCr
oDocRng.Paragraphs(1).Range.Font.Size = 14
oDocRng.Paragraphs(1).Range.Font.Bold = True
oDocRng.Collapse 0
oDocRng.FormattedText = oRng.FormattedText
Skip:
oSource.Close SaveChanges:=wdDoNotSaveChanges
strFile = Dir$()
Wend
lbl_Exit:
Set fDialog = Nothing
Set oSource = Nothing
Set oDoc = Nothing
Set oRng = Nothing
Set oDocRng = Nothing
Exit Sub
End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#12
|
|||
|
|||
|
This is what I'm looking for. Thank you so much, Graham.
|
|
#13
|
|||
|
|||
|
Hello Graham,
I'm running the macro and notice some documents out of the thousands of word documents, don't have the headings ("System Safety Assessment Summary" and "Hardware Considerations"). In this case, the macro copies the whole document. Is there any way to tell the program to skip or output "No Findings", instead of copying the whole document? Sincerely, New To VBA |
|
#14
|
||||
|
||||
|
Add the line
Code:
bStartFound = False: bEndFound = False Code:
For lPara = 1 To oRng.Paragraphs.Count
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#15
|
|||
|
|||
|
Thank you!
|
|
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Need to copy texts from excel and paste in to the Notepad++ in between the particular tags | ganesang | Word VBA | 2 | 08-27-2018 02:05 AM |
Applied Styles to Headings in Multi-Level List; now ALL second level headings are 1.XX
|
NNL | Word | 1 | 08-09-2017 02:52 PM |
| Numbered headings not working as expected after customising headings | seanspotatobusiness | Word | 5 | 03-03-2017 04:44 AM |
| Copy, Paste, and Format Multiple Headings | Dretherix | Word VBA | 2 | 02-12-2016 08:26 AM |
| Trying to find and copy all headings at the same time | WaltR | Word | 7 | 08-21-2012 03:12 PM |