字符串值未正确传递

时间:2019-05-05 10:55:30

标签: vba ms-word word-vba data-conversion

我有一个单词表。我编写了一个宏以从表中获取值。当它运行时,我收到运行时错误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 个答案:

答案 0 :(得分:1)

这是在Word 2013中进行测试时发现对我有用的最小更改。

一般要点:

  • 我添加了Option Explicit,以便计算机可以帮助我查找错误。在这种情况下,使用了变量JFormatDate,但未进行Dim编辑,并且使用了ends,但从未对其进行初始化(我将其更改为startDate) 。
  • 表单元格中的Range.Text包含空格和表尾标记(¤)。这就是CDate给出错误的原因。
    • 对于日期,由于您似乎总是使用Left()格式的日期,因此我使用yyyy-mm-dd仅保留了剩下的十个字符。
    • 对于天数,由于这些天数可以是任意长度,因此我使用Range.Words(1).Text仅保留第一个Word(如MS Word所定义),即数字。
  • 我还向CLng()的参数中添加了DateAdd调用,因为DateAdd想要一个数字 * 而不是一个字符串。

对于生产用途,我还建议仅在一个地方使用Selection,然后执行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

答案 1 :(得分:0)

尝试:

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