#vba #ms-word
#vba #ms-word
Вопрос:
Итак… У меня есть эта форма, в которой люди выбирают разные элементы управления (мы называем элементы управления мерами безопасности, это не элементы управления содержимым) из списка и добавляют их в список. Это в повторяющейся таблице. У каждого элемента управления есть заголовок (либо «инженерный», «административный», либо «PPE», который я хочу выделить жирным шрифтом и подчеркнуть, но я хочу, чтобы параметры, выбранные в списках, были в обычном форматировании. часть кода, которая печатает это в документе, выглядит следующим образом:
Set tableSequence = ActiveDocument.Tables(1)
Set NewRow = tableSequence.Rows.Add
NewRow.Cells(5).Range.Text = "Engineering: " amp; MyString3 _
amp; vbCrLf amp; "Administrative: " _
amp; MyString4 amp; vbCrLf _
amp; "PPE: " amp; MyString5
Я хочу, чтобы слова Engineering, Administrative и PPE были выделены жирным шрифтом и подчеркнуты, а элементы, представленные объектами myString, отображались в стандартном форматировании. Спасибо.
Строковая часть выглядит следующим образом:
Private Sub CommandButton6_Click()
Dim tableSequence As Table
Dim NewRow As Row
Dim MyString5 As String
Dim v As Variant
Dim var3
Dim p As String
Dim M As Long
For var3 = 0 To ListBox7.ListCount - 1
If ListBox7.Selected(var3) = True Then
MyString5 = MyString5 amp; ListBox7.List(var3)
v = Split(MyString5, ",")
p = ""
For M = LBound(v) To UBound(v)
p = p v(M)
If M Mod 3 = 2 Then
p = p vbCr
Else
p = p ","
End If
Next M
p = Left(p, Len(p) - 1)
Debug.Print p
End If
извините, что не учел это
Комментарии:
1. Где находится объект myString в вашем коде?
Ответ №1:
Как отформатировать часть (или несколько частей) значения ячейки в таблице Word:
Я должен признать, что мне не очень нравится Word VBA, но я собрал этот раздел вместе для вас, и он работает в моем тестовом документе. Настройте его в соответствии с вашими потребностями.
Option Explicit
Sub asd()
Dim tableSequence As Table
Set tableSequence = ActiveDocument.Tables(1)
Dim NewRow As Row
Set NewRow = tableSequence.Rows.Add
NewRow.Cells(5).Range.Text = "Engineering: asd" amp; vbCrLf amp; "Administrative: vvv" amp; vbCrLf amp; "test" amp; vbCrLf amp; "PPE: blabla"
NewRow.Cells(5).Range.Bold = False
NewRow.Cells(5).Range.Underline = False
Dim keywordArr As Variant
keywordArr = Array("Engineering:", "Administrative:", "PPE:")
Dim keyword As Variant
Dim myRange As Variant
Dim startPos As Integer
Dim endPos As Integer
Dim length As Integer
Dim i As Integer
i = 1
For Each keyword In keywordArr
Do While InStr(1, myRange, keyword) = 0
Set myRange = NewRow.Cells(5).Range.Paragraphs(i).Range
i = i 1
Loop
startPos = InStr(1, myRange, keyword)
startPos = myRange.Characters(startPos).Start
length = Len(keyword)
endPos = startPos length
Set myRange = ActiveDocument.Range(startPos, endPos)
With myRange.Font
.Bold = True
.Underline = True
End With
Next keyword
End Sub
Ниже приведено решение для того же самого в Excel:
Прежде всего вам нужно будет записать текст в ячейку так же, как вы это уже делаете.
Следующим шагом будет поиск позиции ваших ключевых слов в значении ячейки длина ваших ключевых слов, например
startPos = Instr(1, NewRow.Cells(5), "Engineering:")
length = len("Engineering:")
Затем вы можете настроить шрифт найденной подстроки через Range.Characters.Font
NewRow.Cells(5).Characters(startPos, Length).Font.Bold = True
NewRow.Cells(5).Characters(startPos, Length).Font.Underline = True
Теперь элегантным способом было бы иметь массив ключевых слов и перебирать их, чтобы изменить шрифт для всех них
Dim keywordArr As Variant
keywordArr = Array("Engineering:", "Administrative:", "PPE:")
Dim keyword As Variant
Dim startPos as Integer
Dim length as Integer
For Each keyword In keywordArr
startPos = InStr(1, NewRow.Cells(5), keyword)
length = Len(keyword)
With NewRow.Cells(5).Characters(startPos, Length).Font
.Bold = True
.Underline = True
End With
Next keyword
Комментарии:
1. Мне нравится элегантное решение, но в итоге я получаю сообщение об ошибке, что ключевое слово в переменной
For Each keyword
is undefined2. Это произошло, скорее всего, потому, что у вас есть оператор Option Explicit в модуле, который заставляет явно объявлять каждую переменную (что совершенно нормально и даже поощряется!). Я обновил ответ, включив в него объявление для ключевого слова.
3. Буду ли я измерять объект startPos как целое число?
4. @Майкл Миллер да!
5. Это сработало прекрасно, плюс ваш ответ оказал дополнительное влияние, помогая мне понять критическую проблему, с которой я столкнулся при написании кода. Большое вам спасибо!