Значение строки не проходит правильно - PullRequest
2 голосов
/ 05 мая 2019

У меня есть таблица слов.Я написал макрос, чтобы получить значения из таблицы.Когда он запускается, я получаю ошибку времени выполнения 13. Когда я отлаживаю и наблюдаю значение парсинга строки, оно выглядит следующим образом "2019-04-03 В строке есть только одна кавычка. Я думаю, что этоЕсли я не смог преобразовать эту строку в формат даты. Можете ли вы помочь мне исправить это?

Код

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
    For J = 2 To NumRows
        'Loop to select each cell in the current row
            startDate = Selection.Tables(1).Rows(J).Cells(5).Range.Text
            days = Selection.Tables(1).Rows(J).Cells(6).Range.Text
            FormatDate = CDate(ends)
            endDate = DateAdd("d", days, FormatDate)
            Selection.Tables(1).Rows(J).Cells(7).Range.Text = endDate
    Next J
End Sub

Таблица

This is the word Table

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Вот минимальное изменение, которое я нашел, которое работает для меня при тестировании в 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.

0 голосов
/ 06 мая 2019

Попробуйте:

Sub Demo()
Dim r As Long
With Selection
  If Not .Information(wdWithInTable) Then Exit Sub
  With .Tables(1)
    For r = 2 To .Rows.Count
      .Cell(r, 7).Range.Text = _
        Format(DateAdd("d", Split(.Cell(r, 6).Range.Text, vbCr)(0), CDate(Split(.Cell(r, 5).Range.Text, vbCr)(0))), "YYYY-MM-DD")
    Next r
  End With
End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...