Новости:

Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru

Главное меню

Как кодом VBA найти в ворд документе имеющиеся таблицы ?

Автор YKR, 19.04.2022, 10:55:29

« назад - далее »

YKR

Как кодом VBA найти в ворд документе имеющиеся таблицы ?
С указанием номеров страниц, где они есть?
И как к ним обращаться кодом? (через имя таблицы или через номер)

Если не в тот раздел форума поместил вопрос - подскажите в какой, спасибо?
YKR22 на форуме   

Дмитрий Щербаков(The_Prist)

А что уже сами пробовали сделать? Не вижу попыток.
Алгоритм: цикл по всем таблицам в документе и определение их местоположения.
Или цикл по страницам с определением есть ли на них таблицы.
В общем и целом код может быть таким:
    Dim otbl As Table, v
    Dim lp As Long, ls As Long, le As Long, rr As Range
   
    le = 1
    Do While le > ls
        ActiveDocument.Range.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=lp).Select
        ls = Selection.Start
        Selection.GoToNext(wdGoToPage).Select
        le = Selection.Start
        If le > ls Then
            Set rr = wd.Range(ls, le - 1)
        Else
            Set rr = wd.Range(ls, Selection.GoTo(wdGoToBookmark, , , "\EndOfDoc").Start)
        End If
       
        For Each otbl In rr.Tables
            v = otbl.Range.InRange(rr)
            If v Then
                MsgBox "Есть таблица на странице" & lp
            End If
        Next
        lp = lp + 1
    Loop
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

YKR

Добрый день!   Спасибо за отклик,  более предметно ответил в другом посте.
код к сожалению выдает ошибку 424.... object recuired  на строке
Set rr = wd.Range(ls, Selection.GoTo(wdGoToBookmark, , , "\EndOfDoc").Start)

Дмитрий Щербаков(The_Prist)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

YKR

Спасибо,  так код работает. Он определяет есть ли на странице таблицы в принципе.
И если из несколько, то это не видно.

Получается, что нужен Алгоритм: цикл по всем таблицам в документе и их местоположения.  (какая таблица, на какой странице)
С указанием имени таблицы или номера таблицы в документе, чтобы было понятно как к таблице обратиться.
Подскажите как такой цикл сделать?  Пробую,  но пока в этом не преуспел.

Дмитрий Щербаков(The_Prist)

Цитата: YKR от 21.04.2022, 15:30:38Пробую
Как именно и что именно?
Цитата: YKR от 21.04.2022, 15:30:38нужен Алгоритм: цикл по всем таблицам в документе и их местоположения
Вы сами поняли что написали?  :) Мне кажется, что Вы даже не вдумались в представленный код. Этот алгоритм там уже реализован - есть цикл по каждой странице документа и по всем таблицам в ней. На основании этого получить и таблицу и где она находится и обратиться к ней - вообще не проблема.
Обратиться к каждой из таблиц в коде выше без проблем - у Вас есть переменная цикла otbl. Это уже объект таблица.
Узнать на какой странице? Это тоже уже реализовано - переменная lp это и есть номер страницы.
Нужно знать сколько их? Добавьте в цикл счетчик. Нужно знать сколько на странице - есть свойство Count.
Цитата: YKR от 21.04.2022, 15:30:38если из несколько, то это не видно
кому не видно? Вставьте две таблицы в страницу - будет два MsgBox-а.
Вот чуть модифицированный код с комментариями - смотрите и поймете, что надо вникать глубже в примеры, чтобы получить результат самостоятельно:
Sub FindTables()
   Dim otbl As Table, v
   Dim lp As Long, ls As Long, le As Long, it_cnt As Long, rr As Range
   
   le = 1
   Do While le > ls
       ActiveDocument.Range.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=lp + 1).Select
       ls = Selection.Start
       Selection.GoToNext(wdGoToPage).Select
       le = Selection.Start
       If le > ls Then
           Set rr = ActiveDocument.Range(ls, le - 1)
       Else
           Set rr = ActiveDocument.Range(ls, Selection.GoTo(wdGoToBookmark, , , "\EndOfDoc").Start)
       End If
       DoEvents
       If rr.Tables.Count > 0 Then
           MsgBox "Всего таблиц на странице " & lp + 1 & ": " & rr.Tables.Count
           For Each otbl In rr.Tables
               'подсчет таблиц
               it_cnt = it_cnt + 1
               MsgBox "Найдена таблица №" & it_cnt & " на странице №" & lp + 1
           Next
       End If
       lp = lp + 1
   Loop
   'выделяем любую таблицу в документе по индексу
   Set otbl = ActiveDocument.Tables(1)
   otbl.Select
End Sub


В общем что нужно в итоге и что именно не получается - мне лично непонятно.
Не вижу сильных сложностей, кроме той, что Вы совершенно не владеете VBA. А это проблема, если за такие коды сходу решили взяться. Начните с азов, иначе каждый код будет делать то, что Вам не видно :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

YKR

#6
Что было мне непонятно написано.  
Найти таблицы в документе, чтобы потом это использовать. Например,  знать номер или имя таблицы на нужной странице, чтобы потом можно было написать:
   Dim p As InlineShape
   Set p = ThisDocument.Tables(I).Rows(2).Cells(2).Range.InlineShapes.AddPicture("D:\файл.png", False, True)


Спасибо за помощь и хороших выходных!

Дмитрий Щербаков(The_Prist)

Цитата: YKR от 22.04.2022, 17:41:49Что было мне непонятно написано
так и ответ был дан сразу же :) Отсюда и не понятно, что еще можно подразумевать под "Найти таблицы в документе, чтобы потом это использовать".
По факту у таблиц есть только индексы и обратиться по ним можно к любой таблице в документе. Другой вопрос, что скорее всего Вам нужна была какая-то конкретная таблица. Но какая - я до сих пор не знаю, а следовательно помочь-то больше и нечем.
Может надо было написать как именно и в какой момент планировалось использовать таблицы? Мы же здесь за одним ПК с Вами Ваши задачи не решаем, чтобы угадывать 100% что и для чего Вам надо  ;) учитывайте это, описывая задачи.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Яндекс.Метрика Рейтинг@Mail.ru