2016-05-07 5 views
0

Я создаю макрос для автоматизации создания счетов-фактур. Одна вещь, которую он будет делать, это присвоить сегодняшнюю дату полю формы в счете-фактуре и рассчитать дату платежа, добавив дни (вставленные пользователем в поле формы как целое число) на сегодняшнюю дату.word vba date overflow

Я получаю очень простую ошибку на макрос, где следующий код работает в «ошибки 6: переполнение»:

dim invDate as Date, dueDate as Date 
dim days as Integer 
dim invDateFF as Formfield, dueDateFF as Formfield, daysFF as Formfield 

set invDateFF = Activedocument.Formfields("Date") 
set dueDateFF = Activedocument.Formfields("DueDate") 
set daysFF = Activedocument.Formfields("Days") 

invDate = Format(Now, "dd/MM/yyyy") 
days = daysFF.Result 
dueDate = DateAdd("d", days, invDate) 
invDateFF.Result = invDate 

Обе переменные (invDate и DueDate) переполнены ...

Поля формы являются текстовыми полями формы и имеют тип даты. Есть ли что-то очевидное, что мне не хватает?

Благодаря

+0

Код работает для меня с Word2013. Вы можете использовать Date вместо Format (Теперь, «dd/MM/yyyy») – INOPIAE

+0

Я нахожусь в Word 2016 для Mac. Может ли это иметь какое-то отношение к языковым настройкам компьютера? то есть компьютер находится на испанском языке, но код работает на английском языке; возможно, форматы дат разные ...? Что вы имеете в виду с «вы могли бы использовать Date вместо? Thx –

+0

Что такое значение daysFF.Result? Используйте debug.print daysFF.Result, если вы не знаете сейчас. – newguy

ответ

1

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

invDate = Format(Now, "dd/MM/yyyy") 

Проблема в том, что результатом «Формат» является строка, но invDate имеет тип даты. Таким образом, вы полагаетесь на Word, чтобы принудить дату в строчном формате к значению даты, что не является хорошей идеей в общем случае. Кроме того, я бы предположил, что основная причина, по которой вы это делаете, - избавиться от временной части результата функции «Сейчас». Если это так, вы можете использовать свойство Date VBA.DateTime, например,

invDate = Date 

или

invDate = VBA.Date 

Тогда следующие утверждения должны сделать правильную вещь:

days = daysFF.Result 
dueDate = DateAdd("d", days, invDate) 

Но теперь то, что вы, вероятно, хотите, чтобы подключить результат обратно в форму, которая будет необходимо

dueDateFF.Result = format(dueDate,"DD/MM/YYYY") 

и/или вы можете использовать свойства FormField, чтобы установить формат даты на тот, который вы хотите видеть (и быть принятым - Word обладает некоторой гибкостью в этой области).

Лично я хотел бы попытаться сосредоточиться на том, чтобы код выполнял то, что я хотел - проблема, которую вы описываете с помощью значения переменной «дней», конечно, немного странная, но, возможно, чтобы добиться успеха в форме.

+0

Спасибо за разъяснение, он уверен, помогает с проблемой переполнения. Тем не менее, я до сих пор не понимаю, почему функция DateAdd добавляет годы вместо дней, когда дается «d» в качестве аргумента ... Знаете ли вы? thx –

+0

Сделал ли внесенные изменения какие-либо изменения в этом поведении? –

+1

@DNunez On Stack Overflow должен быть только один «вопрос» в вопросе. Если в ответе bibadia исправлена ​​«большая» проблема (переполнение) - это тоже вопрос этого вопроса - тогда отметьте его как «Ответ», установив флажок рядом с ним. Затем обработайте всю имеющуюся у вас информацию и отправьте новый вопрос по другой проблеме. ** ПРИМЕЧАНИЕ ** и, пожалуйста, не забывайте отмечать вопросы MAC с помощью тегов Mac, как я сделал для этого сообщения :-) –