Вот минимальное изменение, которое я нашел, которое работает для меня при тестировании в Word 2013.
Общие замечания:
- Я добавил
Option Explicit
, чтобы компьютер помог мне найтиошибки.В этом случае использовались переменные J
и FormatDate
, но не Dim
ed, а ends
, но никогда не инициализировались (я изменил его на startDate
). Range.Text
в ячейку таблицы входит пробел и маркер конца таблицы (¤
).Вот почему CDate
выдавал ошибку. - Для дат я использовал
Left()
, чтобы взять только десять левых десятичных символов, поскольку вы, кажется, всегда используете даты в формате yyyy-mm-dd
. - Для количества дней, так какони могут быть любой длины, я использовал
Range.Words(1).Text
, чтобы оставить только первое Word
(как его определяет MS Word), то есть число.
- Я также добавил
CLng()
вызовите параметр DateAdd
, так как DateAdd
хочет число * вместо строки.
Для производственного использования я бы также рекомендовал использовать только Выбор.в одном месте и занимаюсь Dim workTable as Table: Set workTable = Selection.Tables(1)
.Это упростит ваш код.
Код
<===
помечает измененные строки
Option Explicit ' <==
Sub Macro2()
Dim NumRows As Integer
Dim startDate As String
Dim days As String
Dim endDate As String
If Not Selection.Information(wdWithInTable) Then
Exit Sub
End If
NumRows = Selection.Tables(1).Rows.Count
'Loop to select each row in the current table
Dim J As Long ' <==
For J = 2 To NumRows
'Loop to select each cell in the current row
startDate = Selection.Tables(1).Rows(J).Cells(5).Range.Text
startDate = Left(startDate, 10) ' <== Remove the space and table mark
days = Selection.Tables(1).Rows(J).Cells(6).Range.Words(1).Text ' <===
Dim FormatDate As Date ' <==
FormatDate = CDate(startDate) ' <== not `ends`
endDate = DateAdd("d", CLng(days), FormatDate) ' <=== clng
Selection.Tables(1).Rows(J).Cells(7).Range.Text = endDate
Next J
End Sub
* DateAdd
на самом деле занимает Double
, но VBAможет повысить Long
до Double
.Я выбрал CLng
, так как похоже, что вы используете только целые интервалы дня.Если нет, используйте CDbl
.