在 Word 中读取 table 的日期,无需其他字符

Reading date from table in Word without additional characters

所以我从昨天开始 VBA 并一直 运行 宁到墙上。在漫长的 运行 中,我正在尝试创建一个 Word 模板来检查它是否仍然是最新的或者是否到了修订的时候。

现在我想将文档中的日期存储在一个变量中。我找不到直接读取日期格式内容的方法,所以现在我正在使用 Selection.Text 和 CDate 但这给了我一个错误(不兼容的类型),因为我的 selection 似乎包含另一个字符或标记 ([])。我猜这与书签在我的 Word 文档中 table 的单元格上有关,因为它在 运行ning 文本中工作正常。

我在 table 中执行此操作,因为这样我可以确定相关日期在文档中的位置,因为我不确定如何在日期更改后重置书签改变了。

我试图通过使用将 selection 限制为日期 Selection.SetRange 开始:=0,结束:=8(和一些变体)但是 select 只是一个 space 和不祥的标记(或完全是另一个单元格)。

我也研究过 Ranges,但据我所知,它并没有解决我的问题,我还不能真正使用它们,所以现在我坚持使用 selection。

这是我的代码:

Sub ChangeNextRev()

Dim nextRevision As Date
Dim RevisionDate As Date
Dim temp As String

'Selection.GoTo what:=wdGoToBookmark, Name:="lastRevision"
'Selection.SetRange Start:=0, End:=8

'Selection.GoTo what:=wdGoToBookmark, Name:="lastRevision"
Selection.GoTo what:=wdGoToBookmark, Name:="runningText"

temp = Selection.Text

RevisionDate = CDate(temp)
Debug.Print (RevisionDate)

nextRevision = RevisionDate + 14

With Selection

.GoTo what:=wdGoToBookmark, Name:="nextRevision"
.TypeText Text:=Format$(nextRevision, "DD.MM.YY")

End With

End Sub

有人能指出我正确的方向吗?我怎样才能只 select 我需要的日期?除了 table 之外,还有更简单的方法来控制输入日期的位置或之后查找日期吗? 任何关于我哪里出错的帮助将不胜感激:)

您可以按照这些思路尝试一些东西

Sub test()

Dim d As Date

d = CDate(Replace(ThisDocument.GoTo(wdGoToBookmark, , , "TEST_BM").Text, ".", "/"))

Debug.Print d

End Sub

您对 table 单元格的猜测是正确的,但您可以通过删除无关字符来解决这个问题。 End-of-cell 是一个Chr(13) + Chr(7) (Word paragraph plus cell structure marker).

有多种编码方法,但我有以下函数at-hand:

'Your code, relevant lines, slightly altered:
  Selection.GoTo what:=wdGoToBookmark, Name:="runningText"

  temp = TrimCellText(Selection.Text)

  RevisionDate = CDate(temp)
  Debug.Print (RevisionDate)

'Function to return string without end-of-cell characters
Function TrimCellText(s As String) As String
    Do While Len(s) > 0 And (Right(s, 1) = Chr(13) Or Right(s, 1) = Chr(7))
        s = Left(s, Len(s) - 1)
    Loop
    TrimCellText = s
End Function

如果日期是您可以使用的单元格中的唯一内容:

Dim Dt As Date
Dt = CDate(Replace(Split(ActiveDocument.Bookmarks("runningText").Range.Text, vbCr)(0), ".", "/"))