Word VBA: получить таблицу, которая в данный момент находится на экране дисплея - PullRequest
0 голосов
/ 14 января 2020

Предположим, у вас есть файл Microsoft Word (.DOCX), вы открываете его и начинаете просматривать его, используя прокрутку мыши, от страницы 1 к последней странице.

Затем, предположим, вы видите таблицу Например, на странице 4.

Теперь я спрашиваю: может ли Word-VBA сказать вам, каков индекс или имя этой таблицы, которая в данный момент находится на экране, независимо от того, где курсор расположен?

Я хочу, чтобы word-VBA заполнял таблицу, которую я вижу в тот момент, независимо от того, где находится курсор.

Надеюсь, я достаточно ясно ...

1 Ответ

1 голос
/ 15 января 2020

Word не имеет прямого способа получить то, что видно на экране. Это можно вычислить, но не со 100% точностью.

Следующий пример кода помогает мне, на моей машине. Может потребоваться некоторая настройка для работы с другим набором.

Объектная модель действительно возвращает координаты окна приложения (ActiveWindow, здесь), высоту этого окна и UsableHeight - высота фактического рабочего пространства документа. Это можно использовать для получения оценочной позиции.

Существует также Windows эквивалент функции API - RangeFromPoint - для объекта Window, который возвращает Range в документе для данного экрана координаты.

Этот код вычисляет левую и верхнюю позиции для начала видимой части документа, а также для конца видимого документа. (В моем тесте это было немного больше, но не намного). Затем он проверяет, есть ли одна или несколько таблиц в этой области. Если это так, он берет первый (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...