Использование макроса для условного форматирования определенного столбца в таблице Word - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть макрос, который изменяет цвет фона таблицы в Word в зависимости от текста в той же ячейке - сродни правилам условного форматирования Excel.

Однако я хочу ограничить это конкретным столбцом - столбцом 2 в таблице из многих строк, но двух столбцов: столбец 1 - это вопрос, а столбец 2 - то, где пользователь вводит ответ из раскрывающегося списка - и в зависимости от после ответа ячейка меняет цвет.

Мой код ниже; но это относится к обоим столбцам.

Кто-нибудь знает, как перекодировать, чтобы это относилось только к столбцу таблицы 2. Я использую MS Word 2016.

Спасибо

Dim r As Range

Sub UBC ()
    color "No", wdRed
    color "Yes", wdGreen
    color "Unknown", wdYellow
    color "Not Applicable", wdGray50
End Sub

Function color(text As String, backgroundColor As WdColorIndex)
    Set r = ActiveDocument.Range

    With r.Find
       Do While .Execute(FindText:=text, MatchWholeWord:=True, Forward:=True) = True
    r.Cells(1).Shading.BackgroundPatternColorIndex = backgroundColor
       Loop
    End With
End Function

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Опираясь на Ответ, который был дан вам вчера ...

Как только If проверит, находится ли найденный диапазон в таблице, можно условно проверить, в каком столбце расположена ячейка диапазона:

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 = 2 Then
                r.Cells(1).Shading.BackgroundPatternColorIndex = backgroundColor
            End If
          End If
       Loop
    End With
End Function
0 голосов
/ 07 сентября 2018

Вы можете использовать событие Exit ContentControl. Когда пользователь выходит из ячейки, он форматируется на основе того, что было выбрано. Этот код входит в модуль ThisDocument.

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)

    Select Case ContentControl.Range.Text
        Case "Yes"
            ContentControl.Range.Cells(1).Shading.BackgroundPatternColorIndex = wdGreen
        Case "No"
            ContentControl.Range.Cells(1).Shading.BackgroundPatternColorIndex = wdRed
        Case "Unknown"
            ContentControl.Range.Cells(1).Shading.BackgroundPatternColorIndex = wdYellow
        Case "Not Applicable"
            ContentControl.Range.Cells(1).Shading.BackgroundPatternColorIndex = wdGray50
    End Select

End Sub

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

Public Sub LegacyDropDownExit()

    ThisDocument.Unprotect

    Select Case Selection.FormFields(1).Result
        Case "Yes"
            Selection.Cells(1).Range.Shading.BackgroundPatternColorIndex = wdGreen
        Case "No"
            Selection.Cells(1).Range.Shading.BackgroundPatternColorIndex = wdRed
    End Select

    ThisDocument.Protect wdAllowOnlyFormFields, True

End Sub

Если вы используете элементы управления ActiveX, вы можете сделать что-то вроде этого

Private Sub ComboBox1_Change()

    ChangeCellBg Me.ComboBox1.Value, 1

End Sub

Private Sub ComboBox2_Change()

    ChangeCellBg Me.ComboBox2.Value, 2

End Sub

Private Sub ComboBox3_Change()

    ChangeCellBg Me.ComboBox3.Value, 3

End Sub

Private Sub ChangeCellBg(ByVal sValue As String, ByVal lRow As Long)

    Select Case sValue
        Case "Yes"
            Me.Tables(1).Cell(lRow, 2).Range.Shading.BackgroundPatternColorIndex = wdGreen
        Case "No"
            Me.Tables(1).Cell(lRow, 2).Range.Shading.BackgroundPatternColorIndex = wdRed
    End Select

End Sub

Вы также можете создать модуль класса, чтобы вам не нужно было создавать все эти события Change, но это выходит за рамки этого ответа.

...