Word 2007 VBA для вставки текста - PullRequest
4 голосов
/ 16 ноября 2009

Я хочу вставить текст с пользовательским форматированием, а затем изменить стиль шрифта обратно на тот, который был до запуска кода.

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

Может кто-нибудь объяснить способ сделать то, что я ищу?

Редактировать: я должен был быть более конкретным. Если я набираю текст, у меня есть определенный формат, который я набираю, который отображается на вкладке «Главная» (например, Comic Sans Ms, Size 22, Bold). Когда я вставляю текст с кодом, это изменяет форматирование, которым я печатаю, поэтому, если я продолжу печатать, он будет в новом типе шрифта, а не в Comic Sans MS. Я пытаюсь сделать так, чтобы, если я продолжу печатать после вставки текста с помощью кода VBA, он сохранит мое прежнее форматирование.

Ответы [ 6 ]

4 голосов
/ 23 ноября 2009

Одним из простых решений является сохранение всех свойств, которые вы собираетесь изменить, и их сброс в конце:

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
2 голосов
/ 24 ноября 2009

Уловка, которую я нахожу полезной при написании макросов Word, заключается в простой репликации того, что я делал бы, если бы использовал Word GUI. Когда я хочу вставить форматированный текст, но сохранить свой текущий формат, я набираю пробел, вставляю текст перед пробелом, а затем удаляю пробел. Поскольку пространство имеет мой оригинальный формат, я получаю его обратно.

Итак, сделаем это как макрос:

'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

Это сохранит все свойства текста, который у вас был изначально.

0 голосов
/ 19 апреля 2010
Sub No_Format()
'
' No_Format Macro
'
'
    Selection.PasteSpecial Link:=False, DataType:=wdPasteText
End Sub

это позволит вам вставить текст и принять новое форматирование.

0 голосов
/ 24 ноября 2009

Посмотрите, дает ли этот фрагмент кода достаточно подсказок.

CopyFormat возвращает существующее форматирование, перемещаясь влево от текущего курсора.
PasteFormat применяет его к персонажу, и с этого момента оригинальное форматирование (которое было скопировано) вступает в силу.

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"
0 голосов
/ 23 ноября 2009

Объект Selection.Font доступен только для чтения.

Это означает, что невозможно восстановить все настройки в одном назначении. Поскольку вы изменяете только несколько свойств, самое простое решение - сохранить каждое отдельное значение и восстановить его впоследствии, как предполагает Стефан.

т.е. Сохранить свойства:

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

Делаете вещи, а затем восстанавливаете свойства:

Selection.Font.Name = oldFontName
Selection.Font.Size = oldFontSize
Selection.Font.Bold = oldFontBold
0 голосов
/ 16 ноября 2009

Я не могу точно понять, что именно вы пытаетесь сделать там, но Selection.TypeText свернет выделение до точки вставки, поэтому у вас фактически не будет выбранных символов к тому времени, когда вы попытаетесь "отменить шрифт". Вам необходимо либо повторно выделить текст, либо использовать объект Range вместо выделения, чтобы определить текст, на который нужно повлиять.

Причина, по которой вы получаете сообщение об ошибке:

Set Selection.Font = oldFont

... потому что - необычно и извращенно - вы не должны использовать ключевое слово Set при присваивании свойству Font. Вместо сохранения ссылки на объект Font, присваивание просто применяет свойства назначенного шрифта.

Это очень запутанный дизайн API, еще более запутанный, потому что вам нужно нужно использовать ключевое слово Set, когда читает свойство Font, и потому что назначает ссылку на объект Font!

И это еще одна причина, по которой ваш код не будет работать - вы берете ссылку на Font объект, который затем модифицируете, а ваша ссылка указывает на тот же Font объект, который теперь изменился.

Что вам действительно нужно сделать, это создать новый Font объект для хранения оригинальных деталей шрифта, как показано ниже:

Set oldFont = Selection.Font.Duplicate
...