У меня есть файл с макросом, который изначально был создан как файл .doc
. Если я попытаюсь сохранить его как файл .docm
или .dotm
, он не сохранится. Нет сообщения об ошибке, но файл не сохраняется.
Если я удалю модуль; или сохраните его как файл .docx
, он сохранится.
Если я
.docx
опять же, его нельзя сохранить как .docm
Если я удалю модуль, я смогу сохранить его как .docm
Или, даже если макрос присутствует и был запущен, я могу сохранить его как файл .doc
.
Таким образом, кажется, что в макросе может быть что-то, что после запуска создает файл, который нельзя сохранить как .docm
, но все же можно сохранить как файл .doc
.
Макрос проверяет некоторые пользовательские свойства документа, введенные вручную. Он вычисляет различные переменные документа, которые используются в полях по всему документу, а затем обновляет эти поля.
Используя точки останова, кажется, что когда код присваивает значение Document.Variable
"sign"
, документ больше не может быть сохранен. Это поле даты, но в документе есть другие поля даты, которые не вызывают этой проблемы.
code.text для конкретных полей:
docvariable "sign" \@ "MMMM, yyyy" \*upper \* MERGEFORMAT
docvariable "sign" \@ "d" \* OrdText \*upper\* MERGEFORMAT
Код макроса (в обычном модуле):
Option Explicit
Sub Update()
Dim prop As DocumentProperty
Dim area As Double, rent As Double, start As Date, tend As Date, notice As Date, term As Long, Sign As Date
Dim annual As Double, annualcents As Double, monthly As Double, monthlycents As Long
Dim var As Variables
'get Document Properties
For Each prop In ThisDocument.CustomDocumentProperties
If prop.Name = "area" Then area = prop.Value
If prop.Name = "rent" Then rent = prop.Value
If prop.Name = "start" Then start = Int(prop.Value)
If prop.Name = "term" Then term = prop.Value
If prop.Name = "sigDate" Then Sign = Int(prop.Value)
Next prop
annual = area * rent
annualcents = 100 * (annual - Int(annual))
monthly = annual / 12
monthlycents = 100 * (monthly - Int(monthly))
tend = DateAdd("yyyy", term, start)
tend = DateAdd("d", -1, tend)
notice = DateAdd("m", -4, tend)
Set var = ThisDocument.Variables
var("area").Value = area
var("rent").Value = rent
var("start").Value = start
var("term").Value = term
'if this line is not run or
'if this document variable is deleted,
'the file will save as expected
var("sign").Value = Sign
var("annual").Value = annual
var("annualcents").Value = annualcents
var("monthly").Value = monthly
var("monthlycents").Value = monthlycents
var("tend").Value = tend
var("notice").Value = notice
ThisDocument.Fields.Update
End Sub
Document.Variable "sign"
используется Word для обозначения того, что к проекту кода применена действительная цифровая подпись.
Выберите другое имя для вашей переменной, например «sigDate».
Спасибо за решение. Я искал такие вещи, как «зарезервированные слова ms-word», и ничего не нашел. Я посмотрел
Sign
и обнаружил, что он указан как метод объектаSignature
. Я изменил имя в спискеCustomDocumentProperties
, но никогда не менял его в спискеVariables
. Это сводит меня с ума уже много лет!