views:

876

answers:

6

I'm trying to create a macro to insert some text with custom formatting, then change the font style back to what it was before the macro was run. This is what I have come up with so far but it is giving me an error.

Dim myText As String
Dim oldFont As Object
'Save old font    
Set oldFont = Selection.Font 

'Insert text with custom font
myText = "CUSTOM STRING"
Selection.Font.Name = "Comic Sans MS"
Selection.Font.Size = 26
Selection.Font.Bold = True
Selection.TypeText (myText)

'Revert font back to original
Set Selection.Font = oldFont

Can anyone explain a way to do what I'm looking for? Thanks.

Edit: Sorry, I should have been more specific. If I am typing text, I have a certain formatting that I'm typing in that is shown on the Home Tab (eg. Comic Sans Ms, Size 22, Bold). When I insert text with the macro, this changes the formatting that I'm typing with, so if I continue typing it will be in the NEW font type, not the Comic Sans MS. I'm trying to make it so if I continue typing after I have inserted the text via macro, it will retain my old formatting.

A: 

I can't quite figure out exactly what you're trying to do there, but Selection.TypeText will collapse the selection down to the insertion point, so you effectively have no characters selected by the time you try to "revert the font". You either need to re-select the text, or use a Range object instead of the Selection to identify the text to be affected.

The reason that you get an error at the line:

Set Selection.Font = oldFont

...is because - unusually, and perversely - you should not use the Set keyword when assigning to the Font property. Rather than storing a reference to a Font object, the assignment simply applies the properties of the assigned font.

This is very confusing API design, made all the more confusing because you do need to use the Set keyword when reading the Font property, and because that does assign a reference to a Font object!

And that's the other reason why your code won't work - you're taking a reference to a Font object which you then modify, and your reference points to the same Font object that has now changed.

What you actually need to do is create a new Font object to store the original font details, as follows:

Set oldFont = Selection.Font.Duplicate
Gary McGill
Sorry, I should have been more specific. If I am typing text, I have a certain formatting that I'm typing in that is shown on the Home Tab (eg. Comic Sans Ms, Size 22, Bold). When I insert text with the macro, this changes the formatting that I'm typing with, so if I continue typing it will be in the NEW font type, not the Comic Sans MS. I'm trying to make it so if I continue typing after I have inserted the text via macro, it will retain my old formatting.
+2  A: 

One simple solution is to store all properties that you are going to change, and to reset them at the end:

Dim myText As String
Dim oldFont As String
Dim oldSize As Integer
Dim oldBold As Boolean

'Save old font
oldFont = Selection.Font.Name
oldSize = Selection.Font.Size
oldBold = Selection.Font.Bold

'Insert text with custom font
myText = "CUSTOM STRING"
Selection.Font.Name = "Comic Sans MS"
Selection.Font.Size = 26
Selection.Font.Bold = True
Selection.TypeText (myText)

'Revert font back to original
Selection.Font.Name = oldFont
Selection.Font.Bold = oldBold
Selection.Font.Size = oldSize
stephan
A: 

The Selection.Font object is read only.

This means that there is no way to restore all the settings in one assignment. Since you are only changing a few properties the easiest solution is to save each individual value and restore them afterwards as stephan suggests.

I.e. Save properties:

oldFontName = Selection.Font.Name
oldFontSize = Selection.Font.Size
oldFontBold = Selection.Font.Bold

Do you stuff and then restore properties:

Selection.Font.Name = oldFontName
Selection.Font.Size = oldFontSize
Selection.Font.Bold = oldFontBold
Peter Olsson
A: 

See, if this piece of code gives you enough hint.

CopyFormat picks up the existing formatting by moving left from current cursor.
PasteFormat applies it to a character & from there on, the original formatting (which was copied) comes into effect.

Selection.MoveLeft unit:=wdWord, Count:=1
Selection.EndKey Extend:=wdExtend

Selection.CopyFormat
Selection.MoveRight unit:=wdWord

'* New text and new formatting
Selection.Font.Bold = True
Selection.Font.Italic = True
Selection.Font.Size = 28
Selection.TypeText "hello world"

Selection.TypeText " "
Selection.MoveLeft unit:=wdCharacter, Count:=1
Selection.EndKey Extend:=wdExtend
Selection.PasteFormat


Selection.TypeText "original formatting here"
shahkalpesh
+2  A: 

The trick I find helpful when writing Word macros is simply to replicate what I'd be doing if I was using the Word GUI. When I want to paste formatted text but keep my current format, I type a space, paste in the text before the space then delete the space. As the space has my original format that's how I get it back.

So, doing this as a macro:

'Type a space
Selection.TypeText Text:=" "

'Move Cursor back one character
Selection.MoveLeft Unit:=wdCharacter, Count:=1

'Insert text with custom font
myText = "CUSTOM STRING"
Selection.Font.Name = "Comic Sans MS"
Selection.Font.Size = 26
Selection.Font.Bold = True
Selection.TypeText (myText)

'Move Cursor forward one character
Selection.MoveRight Unit:=wdCharacter, Count:=1

'Delete the space
Selection.TypeBackspace

This will preserve any properties of the text you originally had.

Dave Webb
A: 

Sub No_Format() ' ' No_Format Macro ' ' Selection.PasteSpecial Link:=False, DataType:=wdPasteText End Sub

this will allow you to paste the text and adopting the new formatting.

Simon