我有一个单词表。我编写了一个宏以从表中获取值。当它运行时,我收到运行时错误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
答案 0 :(得分:1)
这是在Word 2013中进行测试时发现对我有用的最小更改。
一般要点:
Option Explicit
,以便计算机可以帮助我查找错误。在这种情况下,使用了变量J
和FormatDate
,但未进行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