Почему этот код VBA не работает? В этих документах использовался специальный шрифт ярость, подожди, ариал. Я хотел бы перебрать каждую букву документа, и всякий раз, когда .Font = "*rage*"
хотел бы перебрать дюжину букв. (Мой штрих - терпение.)
Sub grandma()
Dim doc As Document
Set doc = ActiveDocument
Dim Counter As Integer
For i = 1 To 6
doc.Range.Characters.Count
If doc.Range.Characters(i).Font.Name = "*rage*" Then
doc.Range.Characters(i).Font.Name = "Waiting for the Sunrise"
End If
If doc.Range.Characters(i).Font.Name = "*wait*" Then
doc.Range.Characters(i).Font.Name = "Rage Italic"
End If
If doc.Range.Characters(i).Font.Name = "*arial*" Then
doc.Range.Characters(i).Font.Name = "Arial Nova Cond Light"
End If
j = i
MsgBox "Hi! " & i
Next i
End Sub
If foo = "abc*"
будет истинным, если foo
- это равно, строковый литерал "abc*"
. Оператор равенства / сравнения =
не использует подстановочные знаки.
Эти названия шрифтов действительно содержат звездочки - *
? Обратите внимание, что, вероятно, было бы быстрее и эффективнее использовать встроенную в Word функцию «Найти / заменить».
При использовании подстановочных знаков используйте оператор Like
вместо =
.
Option Explicit
Sub grandma()
Dim doc As Document
Set doc = ActiveDocument
Dim i As Integer
For i = 1 To 6
With doc.Range.Characters(i).Font
Select Case True
Case .Name like "*rage*"
.Name = "Waiting for the Sunrise"
Case .Name Like "*wait*"
.Name = "Rage Italic"
Case .Name Like "*arial*"
.Name = "Arial Nova Cond Light"
End Select
End With
MsgBox "Hi! " & i
Next i
End Sub
Side Note: It is my personal preference to avoid using the data type
Integer
and instead useLong
- unless dealing with legacy applications that would overflow with aLong
or for some reason I don't want to give up those two extra bytes of memory (sarcasm). Especially when dealing with individual word document characters - which a document can contain many many thousands of characters, you can overflow an Integer quickly.Take a look at Why Use Integer Instead of Long? for more information.
Что мне добавить / настроить здесь, чтобы циклически изменять шрифт по всему документу без всплывающего запроса для каждого изменения?
Если вы хотите сохранить тот же метод, который используете, я считаю, что вы сможете сделать что-то вроде For i = 1 to doc.Range.Characters.Count
вместо ... To 6
.
Возвращаемся к исходному сценарию. У меня есть данные таблицы в Excel, где 1 столбец указывает строку, а другой указывает шрифт для строки. Моя конечная цель - заполнить табличные поля в файле слов строкой указанного шрифта.
Вы объявили
Counter
как целочисленный тип, но вместо этого использовали необъявленную переменнуюi
? Не проблема, а просто еще одна причина, по которой вы должны использоватьOption Explicit
поверх каждый модуль.