Excel это не сложно

Основные форумы => Вопросы по Word и VBA => Тема начата: YKR от 19.04.2022, 10:55:29



Название: Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: YKR от 19.04.2022, 10:55:29
Как кодом VBA найти в ворд документе имеющиеся таблицы ?
С указанием номеров страниц, где они есть?
И как к ним обращаться кодом? (через имя таблицы или через номер)

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


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: Дмитрий Щербаков(The_Prist) от 20.04.2022, 10:38:01
А что уже сами пробовали сделать? Не вижу попыток.
Алгоритм: цикл по всем таблицам в документе и определение их местоположения.
Или цикл по страницам с определением есть ли на них таблицы.
В общем и целом код может быть таким:
Код: (vb)
    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


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: YKR от 20.04.2022, 17:01:05
Добрый день!   Спасибо за отклик,  более предметно ответил в другом посте.
код к сожалению выдает ошибку 424.... object recuired  на строке
Код: (vb)
Set rr = wd.Range(ls, Selection.GoTo(wdGoToBookmark, , , "\EndOfDoc").Start)


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: Дмитрий Щербаков(The_Prist) от 21.04.2022, 14:01:09
Замените везде wd на ActiveDocument


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: YKR от 21.04.2022, 15:30:38
Спасибо,  так код работает. Он определяет есть ли на странице таблицы в принципе.
И если из несколько, то это не видно.

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


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: Дмитрий Щербаков(The_Prist) от 21.04.2022, 17:50:24
Пробую
Как именно и что именно?
нужен Алгоритм: цикл по всем таблицам в документе и их местоположения
Вы сами поняли что написали?  :) Мне кажется, что Вы даже не вдумались в представленный код. Этот алгоритм там уже реализован - есть цикл по каждой странице документа и по всем таблицам в ней. На основании этого получить и таблицу и где она находится и обратиться к ней - вообще не проблема.
Обратиться к каждой из таблиц в коде выше без проблем - у Вас есть переменная цикла otbl. Это уже объект таблица.
Узнать на какой странице? Это тоже уже реализовано - переменная lp это и есть номер страницы.
Нужно знать сколько их? Добавьте в цикл счетчик. Нужно знать сколько на странице - есть свойство Count.
если из несколько, то это не видно
кому не видно? Вставьте две таблицы в страницу - будет два MsgBox-а.
Вот чуть модифицированный код с комментариями - смотрите и поймете, что надо вникать глубже в примеры, чтобы получить результат самостоятельно:
Код: (vb)
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. А это проблема, если за такие коды сходу решили взяться. Начните с азов, иначе каждый код будет делать то, что Вам не видно :)


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: YKR от 22.04.2022, 17:41:49
Что было мне непонятно написано.  
Найти таблицы в документе, чтобы потом это использовать. Например,  знать номер или имя таблицы на нужной странице, чтобы потом можно было написать:
    
Код: (vb)
Dim p As InlineShape
    Set p = ThisDocument.Tables(I).Rows(2).Cells(2).Range.InlineShapes.AddPicture("D:\файл.png", False, True)


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


Название: Re:Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Отправлено: Дмитрий Щербаков(The_Prist) от 22.04.2022, 18:34:24
Что было мне непонятно написано
так и ответ был дан сразу же :) Отсюда и не понятно, что еще можно подразумевать под "Найти таблицы в документе, чтобы потом это использовать".
По факту у таблиц есть только индексы и обратиться по ним можно к любой таблице в документе. Другой вопрос, что скорее всего Вам нужна была какая-то конкретная таблица. Но какая - я до сих пор не знаю, а следовательно помочь-то больше и нечем.
Может надо было написать как именно и в какой момент планировалось использовать таблицы? Мы же здесь за одним ПК с Вами Ваши задачи не решаем, чтобы угадывать 100% что и для чего Вам надо  ;) учитывайте это, описывая задачи.