Code part 2 of 4 parts
Code:Rem Code Part 1) make two temporary Word Files with and withouut BB Code Rem 1) Copy selection to Clipboard Selection.Copy Rem 2) Make temporary WORD document 'Bit of a bodge to get the text in a selection: create a Word file and paste to it Dim NextTempDoc As Document ' Documents.Add: ActiveDocument.Content.Paste 'Make a File Copy in current Application based on Default Type : And Paste from Clipoard ( ...!!!...our original selected text ) using the Default Copy which should at least have all the text, which is all we are interested in here. Set NextTempDoc = ActiveDocument ' Do this in case i muck about- I do not want to inadvertently close or kill the wrong document '2b) Copy of Full Text with BB Code Dim FullFilePathAndFullNameBBCode As String ' 'Prepares "Pointer" to a "Blue Print" (or Form, Questionnaire not yet filled in, a template etc.)"Pigeon Hole" in Memory, sufficient in construction to house a piece of Paper with code text giving the relevant information for the particular Variable Type. VBA is sent to it when it passes it. In a Routine it may be given a particular “Value”, or (“Values” for Objects). There instructions say then how to do that and handle(store) that(those). At Dim the created Paper is like a Blue Print that has some empty spaces not yet filled in. String is a a bit tricky. The Blue Print code line Paper in the Pigeon Hole will allow to note the string Length and an Initial start memory Location. This Location well have to change frequently as strings of different length are assigned. Instructiions will tell how to do this. Theoretically a specilal value vbNullString is set to aid in quick checks.. But...http://www.mrexcel.com/forum/excel-q...html#post44116 NextTempDoc.SaveAs FileName:="TempBBCodeCopy1.docx", FileFormat:=wdFormatXMLDocument 'Without this the document will not really "exist jet". It has a tempory name ( Used in Windows referrence ), but no path. Let FullFilePathAndFullNameBBCode = NextTempDoc.Path & "\" & ActiveDocument.Name Rem 3) From Han's Text Find Replacement Dialogue 'http://www.eileenslounge.com/viewtopic.php?f=26&t=22603#p175712 '3a) Take out all BB Code Selection.WholeStory 'Selects whole document which here is just our selection of interest from the original document Dim StrOrg As String: Let StrOrg = Selection.Text '11a)6b)' Original Text to use in string manipultion code of Code Part 2) With Selection.Find 'This is the VBA code ( or very similar ) used by Excel when Using the Find eplace text Dialogue box. So this is an improved version of what a macro recording would give. .ClearFormatting: .Replacement.ClearFormatting ' Don't use formating, ? not sure this comes into the equation ?? .Wrap = wdFindStop ' Tell Word not to continue past the end of the selection ( And therefore prevents also a display Alert asking ) .MatchWildcards = True .Text = "[\[]([!=\]]@)(*\])(*)\[/(\1)\]" ' 8 sections, 4 identified with ( ) but I only need two ( ) .Replacement.Text = "\3" ' The third of the 4 sections identified with a ( ) .Execute Replace:=wdReplaceAll ' Replace all within selection. This is the "OK" button! End With Selection.WholeStory: Dim NewWordText As String: Let NewWordText = Selection.Text '´11a) New text for comparison with result from Code Part 2) '3b) Copy of Colored Text in Word File without BB Code Code tags Dim FullFilePathAndFullNameNoBBCode As String NextTempDoc.SaveAs FileName:="TempNoBBCodeCopy2.docx", FileFormat:=wdFormatXMLDocument 'Without this the document will not really "exist jet". It has a tempory name ( Used in Windows referrence ), but no path. Let FullFilePathAndFullNameNoBBCode = NextTempDoc.Path & "\" & ActiveDocument.Name Rem 4) "Reset the "Find Replace Text Dialogue" "Thing" ". if you do not there may be some changed setting there that could catch you out next time you use it. NextTempDoc.Select ' Re select the...( actually this line alone seems to do it ) Selection.WholeStory '...whole document With Selection.Find .ClearFormatting: .Replacement.ClearFormatting: .Text = "": .Replacement.Text = "": .Forward = True: .Wrap = wdFindAsk: .Format = False: .MatchCase = False: .MatchWholeWord = False: .MatchKashida = False: .MatchDiacritics = False: .MatchAlefHamza = False: .MatchControl = False: .MatchWildcards = False: .MatchSoundsLike = False: .MatchAllWordForms = False ' End With Rem 5) Optiion to close / kill document NextTempDoc.Close (wdDoNotSaveChanges) ' Giving the option will also prevent being asked for it. You must close. VBA will not let you kill an open sheet, as you are affectively working on a copy, and VBA is assumng the Original can be got at by saving for example. http://www.mrexcel.com/forum/excel-questions/920451-excel-macro-files.html#post4425428 'Kill FullFilePathAndFullNameBBCode ' Use the Kill wisely!!!! - where this goes there 'aint no coming back!! 'Kill FullFilePathAndFullNameNoBBCode Rem Code Part 2 Put text without BB code into clipboard Rem 6) Use data Object ( assumes we copied to the Clipboard ) '1 a) Data Object to get the data from the clipboard. '_- ExPlanation Dim :'_-: For Object variabls: Address location to a "pointer". That has all the actual memory locations (addresses) of the various property values , and it holds all the instructions what / how to change them , should that be wanted later. That helped explain what occurs when passing an Object to a Call ed Fucntion or Sub Routine By Val ue. In such an occurance, VBA actually passes a copy of the pointer. So that has the effect of when you change things like properties on the local variable , then the changes are reflected in changes in the original object. (The copy pointer instructs how to change those values, at the actual address held in that pointer). That would normally be the sort of thing you would expect from passing by Ref erence. But as that copy pointer "dies" after the called routine ends, then any changes to the Addresses of the Object Properties in the local variable will not be reflected in the original pointer. So you cannot actually change the pointer.) '_- Explanation Set :'_-: Fill or partially Fill: Setting to a Class will involve the use of an extra New at this code line. I will then have an Object referred to as an instance of a Class. At this point I include information on my Pointer Pigeon hole for a distinct distinguishable usage of an Object of the Class. For the case of something such as a Workbook this instancing has already been done, and in addition some values are filled in specific memory locations which are also held as part of the information in the Pigeon Hole Pointer. We will have a different Pointer for each instance. In most excel versions we already have a few instances of Worksheets. Such instances Objects can be further used., - For this a Dim to the class will be necessary, but the New must be omitted at Set. I can assign as many variables that I wish to the same existing instance 'Dim objCliTextCopied As DataObject '**Early Binding. This is for an Object from the class MS Forms. This will be a Data Object of what we "send" to the Clipboard. So I name it CLIpboardSend. But it is a DataObject. It has the Methods I need to send text to the Clipboard ' Set objCliTextCopied = New DataObject '**Must enable Forms Library: In VB Editor do this: Tools -- References - scroll down to Microsoft Forms 2.0 Object Library -- put checkmark in. Note if you cannot find it try OR IF NOT THERE..you can add that manually: VBA Editor -- Tools -- References -- Browse -- and find FM20.DLL file under C:\WINDOWS\system32 and select it --> Open --> OK. http://excelmatters.com/2013/10/04/late-bound-msforms-dataobject/ ' ( or instead of those two lines Dim obj As New DataObject ). or next two lines are.....Late Binding equivalent' Dim objCliTextCopied As Object ' Late Binding equivalent' If you declare a variable as Object, you are late binding it. http://excelmatters.com/2013/09/23/vba-references-and-early-binding-vs-late-binding/ Set objCliTextCopied = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' http://excelmatters.com/2013/10/04/late-bound-msforms-dataobject/ '6a) Original text string from '11a) The line below means I have nothing to do with the Clipboard yet' - see furhter to the right for .Geting From Clipboard for if it had been in it ' 'Put all? Clipboard Infomation into Data Object objCliTextCopied.SetText Text:=StrOrg ' I am messing about putting this in data object, then taking it out on 6b) , but I just wanted the code to be more flexible for later use. ' ''objCliTextCopied.GetFromClipboard 'All that is in the Clipboard goes in this Data Object initial instance of the Class This line does not seem to be necerssary for the next Geting Text bit




Reply With Quote
Bookmarks