Условное форматирование в MS Word с использованием VBA

Добрый день,

Я пытаюсь сделать эффективное условное форматирование в Microsoft Word с помощью VBA, которое будет очень похоже на форматирование, известное из Excel.

Мое текущее решение

Изображение 16035

У меня есть 4-й столбец с оператором IF в поле, которое проверяет, является ли значение в столбце 2 меньше или выше, чем в столбце 3, в сочетании с этим VBA для условного форматирования:

Sub UBC()
    color "No", wdRed
    color "Yes", wdBrightGreen
End Sub

Function color(text As String, backgroundColor As WdColorIndex)
    Dim r As Word.Range

    Set r = ActiveDocument.Content

    With r.Find
       Do While .Execute(findText:=text, MatchWholeWord:=True, Forward:=True) = True
          If r.Tables.Count > 0 Then
            If r.Cells(1).ColumnIndex = 4 Then
                r.Cells(1).Shading.BackgroundPatternColorIndex = backgroundColor
            End If
          End If
       Loop
    End With
End Function

Результат, которого я хочу добиться

Изображение 16036

Я хочу удалить 4-й столбец и использовать VBA для проверки того, что теперь обрабатывается оператором IF. Кроме того, я также хотел бы использовать цветовые коды RGB или HEX вместо библиотеки wdColorIndex.

Может ли кто-нибудь помочь мне изменить текущий код?

# if-statement ms-word conditional-formatting conditional-statements
Источник
  • 0
    Похоже, вам нужно начать с определения таблиц, к которым вам нужно применить форматирование, затем перебрать строки в каждой таблице и проверить значения второй и третьей ячеек в каждой строке и применить форматирование на основе по результату. Вы пробовали что-нибудь из этого?
  • 0
    См., Например: msofficeforums.com/word-vba/… и Ячейки таблицы условного затенения в ветке советов и приемов Mailmerge по адресу: msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html
  • 0
    @macropod Я проанализировал множество ваших отличных кодов в Интернете, но я не нашел ни одного, подходящего для этого конкретного случая (без использования IF в поле), который сравнивает значения двух столбцов. Боюсь, что VBA, представленный в моем сообщении, нужно полностью переписать с нуля.
  • 0
    @TimWilliams В этом файле будет только одна таблица. Другие вещи, о которых вы упомянули, были тем, что я искал, как сделать, но так и не нашел ничего подходящего для этого случая.
Codelisting
за 1 против
Лучший ответ

Попробуй это

Sub Tester()
    Dim tbl As Table, rw As Row, v1, v2
    Set tbl = ActiveDocument.Tables(1)
    
    For Each rw In tbl.Rows
        v1 = CellValue(rw.Cells(2))
        v2 = CellValue(rw.Cells(3))
        If IsNumeric(v1) And IsNumeric(v2) Then
            v1 = CDbl(v1)
            v2 = CDbl(v2)
            Debug.Print v1, v2
            rw.Cells(2).Shading.BackgroundPatternColor = _
                     IIf(v1 <= v2, RGB(100, 250, 100), RGB(250, 100, 100))
        End If
    Next rw
End Sub

Function CellValue(c As Cell)
    Dim rv
    rv = c.Range.Text
    CellValue = Left(rv, Len(rv) - 2) 'remove "end of cell" marker
End Function
  • 0
    Абсолютно фантастично, работает точно так, как ожидалось, а также многое объясняет, как писать код на будущее. Спасибо
Codelisting
Популярные категории
На заметку программисту