Консультация № 175056
09.12.2009, 04:31
0.00 руб.
0 15 1
Уважаемые эксперты, подскажите, почему в данной конструкции ошибка, как будет правильный синтакс?
ActiveDocument.Fields("Плюс").Result.Font.Color = wdColorBlue 'окрасить поле ... в цвет ...
Спасибо Эндрю

Обсуждение

Неизвестный
09.12.2009, 06:07
общий
это ответ
Здравствуйте, Ципихович Эндрю.

Fields(Index) - допускает обращение только по индексу поля в документе 1,2,3..., но никак не по имени (Кстати, где вы его задали у поля, я что-то не нашел?). Естественно для вашей записи выдает ошибку "Type mismatch" (Несоответствие типа).
Попробуйте так:
ActiveDocument.Fields(1).Result.Font.Color = wdColorBlue 'окрасить поле ... в цвет ...

С уважением, Дмитрий
Неизвестный
09.12.2009, 13:20
общий
Тимошенко Дмитрий:
задать имя диапазону ячеек можно нажав правой кнопкой на ячейку и выбрав в контекстном меню "Имя диапазона..."
Неизвестный
09.12.2009, 14:23
общий
Тимошенко Дмитрий:
в свойствах текстового поля (по контекстному меню) есть параметр "Закладка", вот о его содержимом видимо и идет речь.
давно
Посетитель
7438
7205
09.12.2009, 14:54
общий
Перенесено из формы ответа

Ответил: Vasiliy83, Практикант
Дата отправки: 09.12.2009, 12:19

Здравствуйте, Ципихович Эндрю.
Для изменения цвета именнованного диапазона используется объект ActiveWorkbook.Names
соответственно изменение цвета диапазона будет выглядеть как:
Код:
ActiveWorkbook.Names("Имя диапазона").RefersToRange.Font.Color = &HFFFF00 'переменная wdColorBlue должна быть предварительно определена, иначе цвет диапазона не изменится

в качестве указания цвета также можно использовать указание в цветовом пространстве RGB (по сути код цвета будет таким же, но только в 10-ричном коде, а не в 16-ричном):
Код:
ActiveWorkbook.Names("Имя диапазона").RefersToRange.Font.Color = RGB(36, 182, 36)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
09.12.2009, 15:46
общий
выше вариант для именованных диапазонов Excel.
Неизвестный
09.12.2009, 16:20
общий
Vasiliy83:
Имею поле Плюс, по Вашему совету прогоняю код, получаю ошибки
ActiveWorkbook.Names("Плюс").RefersToRange.Font.Color = wdColorBlue 'окрасить поле ... в цвет ...???
ActiveWorkbook.Names("Плюс").RefersToRange.Font.Color = &HFFFF00 'окрасить поле ... в цвет ...???
ActiveWorkbook.Names("Плюс").RefersToRange.Font.Color = RGB(36, 182, 36) 'окрасить поле ... в цвет ...???

Совет дельный:
ActiveDocument.Fields(1).Result.Font.Color = wdColorBlue 'окрасить поле ... в цвет ...
Но напрашивается вопрос, а поле Плюс какое по счёту в документе, как узнать?
Неизвестный
09.12.2009, 17:03
общий
Ципихович Эндрю:
написал, что вариант для именнованых диапазонов Excel, а не для текстовых полей Word.
Вы не указали приложение, и я ошибочно подумал, что речь идет о Excel.

нумерация идет по порядку. удаляете первое поле - первым становится следующее по тексту.

Неизвестный
09.12.2009, 17:31
общий
Ципихович Эндрю:
попробуйте вариант
ActiveDocument.Bookmarks("Имя_текстового_поля").Range.Font.Color = wdColorBlue
у меня в 2007-м получилось так окрасить текст в текстовом поле, с соответствующим названием закладки в свойствах
Неизвестный
09.12.2009, 21:17
общий
Vasiliy83:
Кто то может сделать ход конём и сделать что поле будет иметь имя М, а закладка в нём имя Ж
и мы сядем в лужу, тогда вопрос остаётся

ActiveDocument.Fields(1).Result.Font.Color = wdColorBlue 'окрасить поле ... в цвет ...
Но напрашивается вопрос, а поле Плюс какое по счёту в документе, как узнать?


И ещё думал по аналогии с закладкой проверить наличие поля
If ActiveDocument.FormFields.Exists("Номер") = False Then ...
Можно ли его наличие проверить и как?
Спасибо Эндрю

Неизвестный
09.12.2009, 22:37
общий
Ципихович Эндрю:
на сколько я понял из описания полей и закладок - у поля бывает только порядковый номер
так что если идентифицировать его не по номеру, а по имени закладки, которая соответствует данному полю, то данный идентификатор также будет уникальным

ActiveDocument.Fields.Count покажет сколько всего текстовых полей в документе, и соответственно любой номер поля из этого диапазона укажет на существующее поле, т.к. нумерация у них динамическая
Неизвестный
10.12.2009, 04:05
общий
Vasiliy83:
Я разобрался ход конём сделать чтобы поле имело имя М, а закладка в нём имя Ж невозможно
Но к полю можно обращаться и не по порядковому его номеру, а и по имени:
Set Поле001 = ActiveDocument.FormFields("Имя")
Поле001.Select 'выделить поле ..., имеющее Имя ...
Но вопрос пока актуален:
Думал по аналогии с закладкой проверить наличие поля
If ActiveDocument.FormFields.Exists("Номер") = False Then ...
Можно ли его наличие проверить и как?
Спасибо Эндрю

Неизвестный
10.12.2009, 08:30
общий
Ципихович Эндрю:
повторюсь:
Цитата: 161519
ActiveDocument.Fields.Count покажет сколько всего текстовых полей в документе, и соответственно любой номер поля из этого диапазона укажет на существующее поле, т.к. нумерация у них динамическая

т.е. код будет примерно таким:
Код:
If ActiveDocument.Fields.Count>=Номер_нужного_поля Then
Msgbox "ПОЛЕ_СУЩЕСТВУЕТ!!!"
Else:
Msgbox "ПОЛЕ_НЕ_СУЩЕСТВУЕТ!!!"
End If


по поводу Вашего варианта наименования - нет, это не Имя поля в полном смысле этого слова, т.к. поле не имеет такого свойства
Вы создали отдельный объект, объявили его каким-то нужным именем, и задали ему тип - Текстовое Поле.
Так можно сделать с любым объектом, но разница вот в чем, с тем вариантом, который предложил я:
если Вам нужно из самого документа (имеется ввиду через контекстное меню) узнать имя текстового поля, то сделать это будет не возможно - в свойствах будет написано лишь название закладки.
Это конечно создатели не совсем продумали... хотя если закладка все равно соответствует текстовому полю, и связь эту нельзя нарушить, то наличие такого свойства как "Имя текстового поля" становится лишним... но все равно по-моему неудобно
Неизвестный
10.12.2009, 11:59
общий
Цитата: Vasiliy83
Это конечно создатели не совсем продумали..

за два дня второй раз приходится защищать Microsoft(что я нанялся?) "Создатели" все продумали >9000 раз и все там логично и продумано...
подозреваю, что Ципихович Эндрю имел ввиду коллекцию FormFields, а не Fileds...
FormField и Field - два совершенно разных объекта и их коллекции - две разных коллекции...
а индекс FormFields может может быть как числом, так и строкой....
а узнать, есть ли элемент в коллекции по имени, можно только одним способом:
попытаться его получить... если возникло исключение - значит такого элемента нет, если не возникло - значит есть...
Неизвестный
10.12.2009, 16:13
общий
HookEst:
все равно никогда не соглашусь, что все у них продумано и логично...
а на счет коллекций скорее всего Вы правы)
Неизвестный
10.12.2009, 17:02
общий
Vasiliy83:
Извиняюсь, навёл тень на плетень
Но вопрос пока актуален:
Думал по аналогии с закладкой проверить наличие поля
If ActiveDocument.FormFields.Exists("Номер") = False Then ... ЕСЛИ Я НАПИСАЛ НОМЕР, это значит НоМер, то есть любое слово, хотите пусть будет IE, а если бы я подразумевал цифру я бы написал (1)
Можно ли его наличие проверить и как?

И я тоже "все равно никогда не соглашусь, что все у них продумано и логично" HookEst не прав
Я этих изьянов увидел много, во всяком случае важен выбор, пусть будет одна логика как у HookEst, а вторая другая, а пользователь выберет
Было бы из чего выбирать
Спасибо Эндрю
Форма ответа