Выделите жирным шрифтом и подчеркните только часть строки

#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 undefined

2. Это произошло, скорее всего, потому, что у вас есть оператор Option Explicit в модуле, который заставляет явно объявлять каждую переменную (что совершенно нормально и даже поощряется!). Я обновил ответ, включив в него объявление для ключевого слова.

3. Буду ли я измерять объект startPos как целое число?

4. @Майкл Миллер да!

5. Это сработало прекрасно, плюс ваш ответ оказал дополнительное влияние, помогая мне понять критическую проблему, с которой я столкнулся при написании кода. Большое вам спасибо!