Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
28.03.2024, 23:23:25

Войти
Название темы должно отражать её содержание.
Темы типа "ПОМОГИТЕ!!!", "Срочно!", "Не получается сделать", "Нужна помощь" и т.п. будут удаляться без объяснения причин
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Word и VBA
| | |-+  Как кодом VBA найти в ворд документе имеющиеся таблицы ?
Страниц: [1]   Вниз
Печать
Автор Тема: Как кодом VBA найти в ворд документе имеющиеся таблицы ?  (Прочитано 5875 раз)
0 Пользователей и 1 Гость смотрят эту тему.
YKR
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« : 19.04.2022, 10:55:29 »

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

Если не в тот раздел форума поместил вопрос - подскажите в какой, спасибо?
YKR22 на форуме   
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #1 : 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
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
YKR
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #2 : 20.04.2022, 17:01:05 »

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

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #3 : 21.04.2022, 14:01:09 »

Замените везде wd на ActiveDocument
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
YKR
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #4 : 21.04.2022, 15:30:38 »

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

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

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #5 : 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. А это проблема, если за такие коды сходу решили взяться. Начните с азов, иначе каждый код будет делать то, что Вам не видно Улыбка
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
YKR
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #6 : 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)


Спасибо за помощь и хороших выходных!
« Последнее редактирование: 22.04.2022, 17:57:58 от YKR » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #7 : 22.04.2022, 18:34:24 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru