首页 > 解决方案 > Word VBA:获取当前显示屏幕上的表格

问题描述

假设您有一个 microsoft word 文件 (.DOCX),您打开它并开始查看它,使用鼠标滚动,从第 1 页到最后一页。

然后,假设您看到一个表格,例如,在第 4 页。

现在我问:无论光标在哪里,Word-VBA 是否有可能告诉你当前屏幕上的那个表的索引或名称是什么?

无论光标位于何处,我都希望 word-VBA 填满我当时看到的表格。

我希望我足够清楚...

标签: vbams-word

解决方案


Word 没有直接的方法来获取屏幕上可见的内容。它可以计算出来,有点,但不是 100% 准确。

以下代码示例在我的机器上为我解决了问题。它可能需要一些调整才能在不同的设置上工作。

对象模型确实返回了应用程序窗口的坐标(ActiveWindow此处为 ,)、该窗口的高度UsableHeight- 实际文档工作空间的高度。这可以用来获得估计的位置。

还有一个等效的 Windows API 函数RangeFromPoint- 用于Window返回Range文档中给定屏幕坐标的 a 的对象。

此代码计算文档可见部分的开头以及可见文档的结尾的左侧和顶部位置。(在我的测试中,它有点多,但不多)。然后它检查该范围内是否有一个或多个表。如果是,则采用第一个 ( Set tbl = rngTargetStart.Tables(1)) - 这将返回您的代码需要使用的对象。作为“奖励”,代码将文档中表格的索引号和它所在的页面打印到即时窗口。

Sub CheckForTableOnPage()
    Dim WordWindowTop As Long   'in points
    Dim WordWindowLeft As Long  'in points
    Dim windowUsableHeight As Long 'in points
    Dim rngTargetStart As Range
    Dim rngTargetEnd As Range
    Dim pageNumberTarget As Long
    Dim tbl As Table

    WordWindowTop = ActiveWindow.height
    WordWindowLeft = ActiveWindow.left
    windowUsableHeight = ActiveWindow.UsableHeight
    RibbonFactor = 200
    Set rngTargetStart = ActiveWindow.RangeFromPoint(WordWindowLeft, WordWindowTop - windowUsableHeight)
    Set rngTargetEnd = ActiveWindow.RangeFromPoint(WordWindowLeft, WordWindowTop + windowUsableHeight)
    rngTargetStart.End = rngTargetEnd.End
    If rngTargetStart.Tables.Count >= 1 Then
        pageNumberTarget = rngTargetStart.Information(wdActiveEndPageNumber)
        Set tbl = rngTargetStart.Tables(1)
        rngTargetStart.Start = ActiveDocument.Content.Start
        Debug.Print "The table on page " & pageNumberTarget & " is number: " & rngTargetStart.Tables.Count
    End If
End Sub

推荐阅读