![]() |
#1
|
|||
|
|||
![]() Dear Experts, I have a requirement for a VBA macro and I am stumped! Here are the (deceptively simple) steps involved: 1. Find currency amounts in a Word document. Currency amounts appear in the following format: EUR 20.3m (meaning 20.3 million euros) 2. Extract only the numerical portion of the find string. 3. Perform a sum of all amounts found. Background: Typically there are around 30-40 amounts to add up in a given document. The current method involves copying and pasting each amount manually into an Excel spreadsheet, then performing an auto sum. Obviously this consumes a large amount of time and needs to be automated if possible. With that in mind I attempted to write up some VBA code to automate the above steps. I first tried initiating the macro from Word. Below is my poorly-written code: Code:
Sub FindCopyPasteWordToExcel() Dim oXL As Excel.Application Dim oWB As Excel.Workbook Dim WorkbookToWorkOn As String 'Specify the workbook to work on WorkbookToWorkOn = "C:\Users\ ... \Book1.xlsm" ' Open the workbook Set oWB = oXL.Workbooks.Open(FileName:=WorkbookToWorkOn) With ActiveDocument.Range = wdWholeStory Selection.HomeKey Do With Selection.Find .ClearFormatting .Text = "(EUR )(*)(m)" .Replacement.Text = "\2" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll If .Found = True Then Selection.Copy oXL.ActiveSheet.Range("B1:B40").FindNext.Select oXL.ActiveCell.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False oXL.ActiveWorkbook.Save oXL.ActiveWorkbook.Close Else MsgBox "No items were found." End If Loop Until ActiveDocument.Range.End End With End Sub I next attempted to initiate the code in Excel, but I ended up stumped at the same result. Clearly I made the same mistakes in that code, so no need to add it. I'm looking forward to hearing your feedback and suggestions. Thank you in advance for your time! |
#2
|
||||
|
||||
![]()
Try:
Code:
Sub Demo() Application.ScreenUpdating = False Dim Amt As Single With ActiveDocument.Range With .Find .ClearFormatting .Replacement.ClearFormatting .Text = "EUR [0-9.]@m" .Replacement.Text = "" .Forward = True .Wrap = wdFindStop .Format = False .MatchWildcards = True .Execute End With Do While .Find.Found Amt = Amt + CSng(Split(Split(.Text, " ")(1), "m")(0)) .Collapse wdCollapseEnd .Find.Execute Loop End With Application.ScreenUpdating = True MsgBox "EUR " & Amt & "m" End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
![]()
BRILLIANT! Thank you Paul. One day when you're bored, I'd love to get a better understanding of the .Find.Found loop. That's the key to understanding how to use the find results and manipulate the data as needed. Very much appreciated.
|
#4
|
||||
|
||||
![]()
The .Find.Found simply returns True or False depending on whether the Find expression has been found. Putting it in a loop with:
.Collapse wdCollapseEnd .Find.Execute Simply causes Word to keep looking for more hits until .Find.Found returns False.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
![]() |
Thread Tools | |
Display Modes | |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
![]() |
DelHop | Word Tables | 11 | 11-24-2019 02:37 PM |
Adding addresses and $ amounts to Word docs | littlepeaks | Word VBA | 2 | 01-22-2016 07:57 PM |
Macro to find a word in first row of table and then perform two macros | hmsrose | Word VBA | 5 | 01-30-2015 12:17 AM |
![]() |
jungkim | Word | 2 | 03-24-2012 07:40 AM |
![]() |
Jennifer_Falcon | Word VBA | 6 | 07-26-2011 10:49 AM |