Варианты сохранения данных в документе
Document.Variables
Это доступно в Word с самых ранних дней и доступно во всех версиях начиная с Word 2.0 (начало 1990-х годов). Это просто место для хранения любого количества строк, связанных с идентификатором (именем). По сути, пара ключ-значение. Важно отметить: это должна быть пара, не может быть ключа без значения, а значение не может быть строкой нулевой длины. Присвоение значения имени создает Variable
; удаление значения удаляет Variable
. Они не видны пользователю.
Пример:
Document.Variables("Name").Value = "John Doe"
Document.CustomDocumentProperties
Аналогично Variables
, но доступны типы данных, отличные от строк. Существует ограничение на длину данных, которые могут быть сохранены. Они видны пользователю через интерфейс «Свойства». Они должны быть явно созданы / уничтожены. Это было введено, я думаю, в Word 97.
Пример:
Document.CustomDocumentProperties.Add(Name As String, LinkToContent As Boolean, _
[Type], [Value], [LinkSource])
CustomXMLParts
Это XML-страницы, сохраненные в пакете docx zip. Это хороший способ сохранить данные, и он легко доступен из закрытого файла . Возможность была введена в Word 2010, поэтому она не будет доступна ни в старых версиях, ни в форматах файлов doc, только в формате docx.
Кодирование более сложное, чем для Variables
или Properties
.
Обычный способ работы с этим в описанном сценарии заключается в создании CustomXMLPart в документе (или шаблоне - документы, созданные из шаблона, должны нести CXP). Затем все, что нужно сделать, это чтение / запись с уже доступных узлов xml. Если VBA-кодер не имеет опыта в разборе XML, будет крутая кривая обучения.
Существует много способов чтения и записи, вот фрагмент, демонстрирующий основы чтения, чтобы дать представление о том, что в нем происходит:
Sub ReadCXP()
Dim cxp As Office.CustomXMLPart, CXPs As Office.CustomXMLParts
Dim doc As Word.Document
Dim sUri As String
Set doc = ActiveDocument
'object, not collection, because ID is unique and can return only one
'ID is unique to each CustomXMLPart - this is won't work as it stands!
Set cxp = doc.CustomXMLParts.SelectByID("{32B20BB8-F4FB-47D6-9DF4-FFAF5A1D8C18}")
Dim xmlNds As Office.CustomXMLNodes
Dim xmlNd As Office.CustomXMLNode
Set xmlNds = cxp.SelectSingleNode("trees").ChildNodes
For Each xmlNd In xmlNds
Debug.Print xmlNd.XML
Next
End Sub