Word VBA:获取当前显示屏幕上的表格

Word VBA:获取当前显示屏幕上的表格,vba,ms-word,Vba,Ms Word,假设您有一个microsoft word文件.DOCX,打开它并开始查看它,使用鼠标从第1页滚动到最后一页 然后,假设您在第4页上看到一个表 现在我问:Word VBA是否可以告诉您当前屏幕上的表的索引或名称,无论光标位于何处 我希望word VBA fullfil是我当时看到的一个表,无论光标位于何处 我希望我说得够清楚了……Word没有直接的方法来获取屏幕上的可见内容。它可以算出来,有点像,但不是100%准确 下面的代码示例在我的机器上为我实现了这一点。它可能需要一些调整才能在不同的设置上工

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

然后,假设您在第4页上看到一个表

现在我问:Word VBA是否可以告诉您当前屏幕上的表的索引或名称,无论光标位于何处

我希望word VBA fullfil是我当时看到的一个表,无论光标位于何处


我希望我说得够清楚了……

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

下面的代码示例在我的机器上为我实现了这一点。它可能需要一些调整才能在不同的设置上工作

对象模型确实返回应用程序窗口ActiveWindow的坐标,这里是该窗口的高度和UsableHeight—实际文档工作空间的高度。这可以用来得到一个估计的位置

对于窗口对象,还有一个Windows API函数等价物RangeFromPoint,它返回文档中给定屏幕坐标的a范围

此代码计算文档可见部分的开始位置以及可见文档的结束位置的左侧和顶部位置。在我的测试中,它是多一点,但不多。然后检查该范围内是否有一个或多个表。如果是,则取第一个集合tbl=rngTargetStart.Tables1-这将返回代码需要处理的对象。作为奖励,代码将文档中表的索引号及其所在页面打印到即时窗口

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

非常聪明的解决方案!!即使直到现在我还不知道ActiveWindow对象及其方法和属性,我想我也不会想到使用RangeFromPoint方法,然后使用这行代码:rngTargetStart.End=rngTargetEnd.End。我想知道为什么要使用行rngTargetStart.Start=ActiveDocument.Content.Start。我用我的工作账户问了这个问题,所以我只能在周五确认我选择的答案,对不起。谢谢你,先生@sergiotrajano我使用您询问的行来获得一个范围,该范围从屏幕上的范围一直延伸到文档的开头,以便统计到该点的表格。我之所以这样做,是因为问题提到了该表的索引或名称。使用表时没有必要这样做,因为我们已经有了tbl对象,但只是为了防止您真正需要这些信息。@sergiotrajano啊,我看到我在代码中给RibbonFactor留下了一个赋值-当我删除声明时,这将产生一个错误。在我记起UsableHeight之前,我本来是要考虑顶部的空间的。当我不在移动设备上时,我需要稍后删除它。哦,当然!真丢脸,我没意识到我得到了表的绝对索引。我很抱歉,谢谢你的启示!是的,我看到了RibbonFactor=200,并立即意识到这是前一个算法的结果。