Как обновить код поля надстройки без потери данных поля (MS Word)?

#vba #ms-word

#vba #ms-word

Вопрос:

У меня есть поле надстройки в MS Word, в котором также есть некоторые скрытые данные. Я хочу обновить текст кода поля. Однако, когда я делаю это и снова читаю свои скрытые данные, они исчезают. Смотрите этот минимальный пример:

 Sub testUpdatingFieldCode()
  Dim newField As Field
  Set newField = ActiveDocument.Fields.Add(Range:=Selection.Range, Type:=wdFieldAddin)
  newField.Code.Text = " ADDIN mycode * MERGEFORMAT "
  newField.Data = "mydata"

  Debug.Print "Code: " amp; newField.Code.Text
  Debug.Print "Data: " amp; newField.Data ' works - prints "Data: mydata"

  newField.Code.Text = " ADDIN mycodechanged * MERGEFORMAT "
  Debug.Print "Code: " amp; newField.Code.Text
  Debug.Print "Data: " amp; newField.Data ' doesn't work - prints "Data: "
End Sub
  

Это нормальное поведение или ошибка? Есть ли рекомендуемый способ обновить коды полей без потери данных?

Я мог бы сохранить Data в переменную, подобную этой, но я беспокоюсь о производительности (в конечном итоге мне нужно делать это для десятков или сотен полей одновременно):

 Dim previousData As String: previousData = newField.Data
newField.Code.Text = " ADDIN my_code_changed  * MERGEFORMAT "
newField.Data = previousData
  

Комментарии:

1. Вы должны быть в состоянии создавать сотни переменных без проблем. Вам также следует рассмотреть возможность использования переменных документа в качестве возможного решения для хранения данных. wordribbon.tips.net /…

Ответ №1:

Пробуя ваш код, он вставляет поле и изменяет значение.

Код поля { ADDIN mycodechanged * MERGEFORMAT }

Проблема, похоже, в том, что .Данные, потому что поле есть в документе.

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

Вот ссылка на документ поддержки по переменным документа. Два примера кода с этой страницы:

 ActiveDocument.Variables.Add Name:="Value1", Value:="1" 
MsgBox ActiveDocument.Variables("Value1")   3

For Each myVar In ActiveDocument.Variables 
 MsgBox "Name =" amp; myVar.Name amp; vbCr amp; "Value = " amp; myVar.Value 
Next myVar
  

Как вы можете видеть, это гораздо более простая конструкция, чем использование поля AddIn . Доступно несколько утилит, которые предоставляют доступ к переменным документа из пользовательского интерфейса, но в Word нет ничего готового, что позволяло бы пользователю изменять переменные без vba.

[ОТРЕДАКТИРУЙТЕ, чтобы устранить проблемы в первом комментарии.]

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

Вы можете использовать свойства документа, а также переменные документа. Они доступны пользователю через дополнительные свойства. Кроме того, некоторые свойства доступны через меню быстрых частей, где изменение элемента управления содержимым свойства в документе изменяет само свойство. Они сопоставляются с узлами XML. Как и переменные документа, все свойства документа могут отображаться через (отчетное) поле: DocProperty . На моей странице, посвященной повторяющимся данным, показаны некоторые варианты использования, которые можно сделать с помощью этих встроенных элементов управления отображением содержимого свойств документа.

Комментарии:

1. Спасибо за предложение, переменные документа кажутся хорошей альтернативой. Однако я работаю над более крупным проектом, и на данный момент изменение общего подхода не является вариантом. Кроме того, я думаю, что поле Data даже имеет смысл в нашем случае, потому что данные должны быть связаны с полем, когда пользователь удаляет поле, на самом деле правильно, что данные тоже удаляются. Таким образом, должен быть способ синхронизации полей с переменными документа.

2. Вы хотите, чтобы пользователь мог удалять данные? Вы хотите, чтобы они могли сделать это случайно, потому что они не видят поле? Вот как работает поле надстройки, в той мере, в какой оно работает. —- Насколько я могу судить, поле добавления само по себе не работает для вашего приложения —— Вы также можете использовать свойства документа из меню быстрых частей. Они позволяют пользователю быстро и легко изменять их из документа.

3. Пользователи всегда видят текст поля надстройки ( field.Result.Text ), этот текст должен быть частью окончательного документа, только field.Data не виден. Таким образом, они не могут случайно удалить только данные. Если они решат удалить все поле целиком, это совершенно нормально, и также желательно .Data , чтобы они тоже были удалены. Как мне удалить данные из свойств документа, когда пользователь удаляет поле?

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

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