Установка цвета шрифта при открытии документа не работает

Итак, я работаю над созданием документа для некоторых людей, где каждой группе, а их три, назначается цвет шрифта для их ввода в документ. Я написал сценарий VBA, который содержит список всех участников и может идентифицировать человека, вошедшего в компьютер, и группу, в которой он состоит. Однако я не могу настроить цвет шрифта самостоятельно. Я записал сценарий VBA, в котором я установил цвет шрифта, чтобы посмотреть, как это делает Word, но полученный код Selection.Font.Color = wdColorRed фактически не изменит выбранный цвет шрифта, когда я добавлю его в свой сценарий VBA. Вот пример кода, который я использую:

Private Sub Document_Open()

Dim Users As New Scripting.Dictionary
Dim UserID As String
Dim category As String

UserID = GetUserName 'Currently using the example at
                     'http://support.microsoft.com/kb/161394 as a function

'---Add Members of Group 1---
Users.Add "person1", "group1"
Users.Add "person2", "group1"

'---Add Members of Group 2---
Users.Add "person3", "group2"
Users.Add "person4", "group2"
Users.Add "person5", "group2"

'---Add Members of Group 3---
Users.Add "person6", "group3"
Users.Add "person7", "group3"

For Each user In Users.Keys
    If user = UserID Then
        If Users.Item(user) = "group1" Then
            Selection.Font.Color = wdColorRed
        ElseIf Users.Item(user) = "group2" Then
            Selection.Font.Color = wdColorGreen
        ElseIf Users.Item(user) = "group3" Then
            Selection.Font.Color = wdColorBlue
        Else
            Selection.Font.Color = wdColorBlack
        End If
    End If
Next

End Sub

person Brad    schedule 07.11.2013    source источник
comment
ваша проблема связана с Selection, которая является просто выделенной областью на листе, когда она была закрыта в последний раз. Как вы определяете каждую область пользователей? После того, как вы определили это, вы можете установить цвет шрифта для соответствующего диапазона.   -  person InContext    schedule 07.11.2013
comment
Любой из любой группы может добавить текст в любой раздел документа, поэтому они хотели использовать цветовое кодирование для каждой группы пользователей.   -  person Brad    schedule 07.11.2013
comment
почему вы не используете функции редакции MS-Word?   -  person Kazimierz Jawor    schedule 07.11.2013
comment
@Брэд, подожди секунду... одно уточнение - ты хочешь, чтобы это работало именно так? - 1. кто-то открывает документ ›› 2. ты проверяешь, к какой группе он принадлежит ›› 3. каждый раз, когда этот человек выбирает что-либо в документ меняет цвет выделения на предназначенный для группы ›› 4. или при добавлении нового текста пишется цветом группы. ЭТО ВОЗМОЖНО, но, пожалуйста, подтвердите, если я вас правильно понимаю.   -  person Kazimierz Jawor    schedule 07.11.2013
comment
@KazJaw. Пункт 4 - это то, что хочет ОП. Я хотел бы услышать ваше мнение, если это возможно.   -  person Siddharth Rout    schedule 07.11.2013
comment
@SiddharthRout, посмотрите возможное решение.   -  person Kazimierz Jawor    schedule 08.11.2013
comment
Я хотел так: 1. Человек открывает документ. 2. Запускается макрос Document_Open(), идентифицирующий человека и связанную с ним группу и 3. затем устанавливающий цвет шрифта для любого нового текста, который человек вводит в документ.   -  person Brad    schedule 08.11.2013
comment
@Брэд, тогда мое решение работает таким образом...   -  person Kazimierz Jawor    schedule 08.11.2013
comment
@KazJaw, спасибо за информацию, и я хотел бы использовать ее, но, похоже, это мешает работе остальной системы. Я не упомянул остальную часть системы, так как мне не приходило в голову, что функции, специфичные для этого документа, могут вызвать проблемы. По сути, документ, над которым я работаю, связан со всей этой экосистемой VBA, на изучение которой я потратил больше года, но еще далеко не готов. По сути, набор значений передается в документ из этой экосистемы при его первом открытии, и изменения цвета, указанные в вашем решении, путаются с этим, окрашивая то, что не должно быть окрашено. :(   -  person Brad    schedule 08.11.2013
comment
@Брэд, то, о чем ты просил, было довольно сложно. Как я указал в редакции на свой ответ, большинство неудобств можно было бы решить дополнительными If statements. Однако вам нужно будет потратить некоторое время, чтобы добавить все breaks to the rules, чтобы код работал с полным удовлетворением для вас. Поэтому вернемся к моему первому предложению — используйте Revision feature, которое, если его использовать уместно, может быть тем, что вы ищете.   -  person Kazimierz Jawor    schedule 08.11.2013


Ответы (2)


AFAIK, вы не можете установить цвет шрифта по умолчанию для конкретного пользователя. Даже если вам удалось, скажем, установить для него значение «Синий», и вы перейдете к предложению, выделенному красным цветом, и если вы что-то напечатали, вы увидите не синий текст, а красный текст. Потому что позиция, в которой находится курсор, выберет исходный цвет, который использовался для окраски этого предложения.

Чтобы установить определенный цвет для пользователя, вам нужно либо

  1. Identify a range and set the color for it. Но затем, как я упоминал выше, если пользователь переходит к другому диапазону, новые настройки цвета не будут применяться к нему.

  2. Set it for the entire document. Если вы установите его для всего документа, цвет всего документа изменится, и я уверен, что это не то, что вам нужно.

person Siddharth Rout    schedule 07.11.2013
comment
Как бы я ни был разочарован, я думаю, вы правы в том, что то, что я хочу сделать, не может быть сделано. Я отмечаю ваш ответ как правильный. :( - person Brad; 07.11.2013
comment
AFAIK и я могли ошибаться, но в MS-Word нет события, которое могло бы улавливать изменения текста. В противном случае мы могли бы придумать обходной путь. - person Siddharth Rout; 07.11.2013
comment
Это то, что меня раздражало в макросе, который я записал - я начал запись, набрал какой-то черный текст, изменил цвет текста, затем набрал новый цвет. Макрос показал исходный текст, затем selection строку кода, затем текст нового цвета. - person Brad; 07.11.2013

Возможные обходные пути основаны на Application.WindowSelectionChange Event. Поэтому вам необходимо придерживаться следующих шагов:

1.Создайте модуль класса
2.Назовите модуль класса App
3.Добавьте следующий код в App Class Module:

    Public WithEvents WRD As Application

    Private Sub WRD_WindowSelectionChange(ByVal Sel As Selection)
        'here you should place solution from your Document_Open sub
        'which defines color based on user name or...
        'you could place it somewhere else but pass color value 
        'here as a parameter

        'for test I just assumed that color should be blue
        Sel.Font.Color = wdColorBlue
    End Sub

4. В стандартный модуль добавить публичную переменную:

    Public tmpApp As New App

5.Создайте Sub в стандартном модуле или добавьте в свой Document_Open Event код, который будет инициализировать наш класс:

Sub Document_Open_new()

    Set tmpApp.WRD = Application

    'we need to change selection once to trigger full
    'scope of solution
    'if we omit the code below new color will not work
    'if user add new text at the beginning of the document
    'right after it was opened
    Dim tmpSel As Range
    Set tmpSel = Selection.Range
    ActiveDocument.Bookmarks("\EndOfDoc").Select
    tmpSel.Select
End Sub

6. Запустите описанную выше подпрограмму один раз или откройте документ, если код был добавлен в Document_open event.

---EDIT--- (после некоторых комментариев от @Sid ниже)

Есть некоторые неудобства использования предложенного решения. Однако БОЛЬШИНСТВО ИЗ НИХ МОЖНО РЕШИТЬ, добавив немного If statements внутрь WindowSelectionChange event. Проверка положения параметра Sel range, текста вокруг и прочего позволяет точно решить, применять новый цвет или нет.

person Kazimierz Jawor    schedule 07.11.2013
comment
Код просто окрашивает слово, на которое я установил курсор. Это не то, чего хочет ОП. Пожалуйста, смотрите мой ответ. - person Siddharth Rout; 08.11.2013
comment
@SiddharthRout ... и, очевидно, сделать новый цветной письменный текст, посвященный соответствующему пользователю. Это означает, что он окрашивает выделение и новый текст в документе. - person Kazimierz Jawor; 08.11.2013
comment
Но, как я уже сказал, это не то, чего хочет ОП. Допустим, вы написали предложение красным цветом и закрыли файл. Затем я открываю его и просто помещаю курсор на эту строку, чтобы прочитать ее и не вносить никаких изменений. Выделенный текст становится синим, чего не должно происходить. Но если я попытаюсь написать что-то между этим предложением, это слово должно быть синим. Надеюсь, вы поняли, что я пытаюсь сказать? - person Siddharth Rout; 08.11.2013
comment
Если вы просто поместите курсор ТОЛЬКО там, где хотите написать новый текст, тогда решение будет правильным. Таким образом, пользователь должен просто избегать чрезмерного выбора, если в этом нет необходимости. Я мог бы признать, что это не идеальное решение, но возможное обходное решение. Более того, в целом уже есть Revision feature для задач, о которых идет речь. - person Kazimierz Jawor; 08.11.2013
comment
Большинству из нас (по привычке) нравится удерживать курсор на строке, которую мы сейчас читаем. Некоторые из нас даже доходят до выделения ряда. Как я уже упоминал в комментариях в своем ответе, Text_Change event нет, иначе это было бы проще простого :) - person Siddharth Rout; 08.11.2013
comment
Большинству из нас (по привычке) нравится использовать Revision feature для проблемы OP :) Это единственный возможный обходной путь, который можно было бы еще больше расширить, чтобы избежать некоторых проблем с ним. - person Kazimierz Jawor; 08.11.2013