2

Мне нужно создать поле в Word 2007, которое будет отображать некоторый текст, когда его файл не находится в ожидаемой директории (папка с именем "Release"). Папки сопоставления дисков и верхнего уровня могут отличаться на каждой машине и для каждого документа.

Я пытался с помощью

{IF "{FILENAME \p}" = "* Release *" "OK" "ДОКУМЕНТ ОТ ДАТЫ"}

Но это не дает правильных результатов. Я также пытался использовать COMPARE, но безуспешно. Оказывается, я не могу использовать два символа подстановки одновременно, см. Подстановочный знак Word Mergefield не соответствует

Кто-нибудь знает обходной путь к этому или кто-нибудь может предложить обходной путь?

Я не могу легко внедрить решение VBA, так как никто из пользователей не активирует макросы документа или сертификаты доверия, и руководство не желает разрешать надежные расположения.

1 ответ1

1

Для будущих читателей оригинальное предложение (внизу) все еще может быть полезным, если вы знаете, что пути короткие.

Я изменил недавнее предложение, потому что в его исходной форме, когда документ находился не в папке «Релиз», а в папке «Релиз» существовал документ с тем же именем и полями, этот документ будет пытаться включить себя, пока Word не достигнет предела вложенности полей. (около 19/20 уровней), а затем появляется диалоговое окно с сообщением об ошибке. Другая проблема, которая может существовать при таком подходе, заключается в том, что Word в некоторых случаях может вызывать диалоговое окно в любом случае (я обнаружил, что это произошло с Word 2010/Win 7, когда документ находился в пути UNC, но не в буклете: тип пути, но Я не знаю точно, какие обстоятельства и настройки вызовут эту проблему. AFAICS поле все еще работает правильно в этой ситуации, но всплывающее окно диалога почти наверняка будет тревожным (по крайней мере) для конечного пользователя).

Чтобы сделать это, вам нужно вставить закладку, которая не содержит поле {IF}. Чтобы пользователю было сложнее удалить его, вы можете, например, щелкнуть непосредственно перед «Ошибка!msgstr "текст и вставьте туда закладку. Я использовал название закладки "bkmk_release"

В противном случае лучшее, на что я способен, это то, что он использует "хитрость" пути Windows, которая обычно работает в Word и работает за пределами 128-символьного пути (я подозреваю, что следующим ограничением будет общее число из 256 символов).

{ IF "{ INCLUDETEXT "{ FILENAME \p }\\..\\..\\Release\\{ FILENAME }" bkmk_rlease }" = "Error! Include may not refer to itself." "DOCUMENT OUT OF DATE" "OK" }

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

{ IF "{ INCLUDETEXT "{ FILENAME \p }\\..\\..\\Release\\{ FILENAME }" bkmk_release }" = "{ INCLUDETEXT "{ FILENAME \p }" }" "DOCUMENT OUT OF DATE" "OK" }

но я не проверял.

Другими словами, если файл находится в папке Release, он пытается включить себя, и INCLUDETEXT должен вернуть ошибку. Если файл не находится в папке Release, includetext попытается открыть файл с таким же именем в папке Release. Если этого не существует, вы увидите другую ошибку (вероятно, существует более одной возможности), например, не существует, недопустимое имя. Единственная проблема - если он существует и содержит текст «Ошибка! Включить не может ссылаться на себя. ":-)

Могут быть и другие "крайние случаи", например, если документ находится в папке верхнего уровня.

Оригинальное предложение:

До тех пор, пока Release всегда является папкой, содержащей файл, а не папкой, расположенной дальше по иерархии, что-то вроде этого должно делать это:

{ IF "{ INCLUDETEXT "{ FILENAME \p }\\..\\..\\Release\\{ FILENAME }" }" = "{ INCLUDETEXT "{ FILENAME \p }" }" "DOCUMENT OUT OF DATE" "OK" }

Хотя если подумать об этом дальше, может быть проблема с более длинными путями - даже 128 символов могут быть ограничением, что исключало бы это в некоторых сценариях.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .