Vba как найти таблицу на листе

Цитата
Сообщение от Jimmyyong
Посмотреть сообщение

В этой теме задан вопрос относительно поиска таблиц

Сугубо личное мнение, но постановка вопроса, на мой взгляд, абсурдна. Отсюда и вопросы к вам.
Если вы ищете на бескрайних просторах книги Excel «то, не знаю, что», тогда становится непонятно: зачем это делать макросом? Ведь в этом случае, вам, в любом случае, придется залезать на лист книги и находить эти таблицы самому, чтобы понять что с ними делать.
Если вы знаете, что вы ищете, то есть знаете: что представляет из себя эта таблица, какие у нее столбцы и сколько их, тогда непонятно: зачем искать границы — естественней и проще вести поиск по заголовкам, либо по известной вам информации, то есть отталкиваться от содержания каждой таблицы.
Если таблицы разбросаны по листу книги, и вам не хочется работать полосой прокрутки, то естественней найти пустые столбцы и строки и удалить их, чтобы собрать информацию в одной компактной зоне.
Возможно, есть какие-то другие нюансы в вашем случае, но при любом раскладе, скорее всего, найдутся и другие, более простые способы поиска, чем отслеживание очерченных границ. Поэтому у вас и пытаются выяснить эти нюансы.

Sub Поиск_и_вставка()

    Dim tbl As Table

            ‘1. Цикл по всем таблицам в файле в поисках нужной таблицы.
    For Each tbl In ActiveDocument.Tables
        ‘ Если начало таблицы находится на странице 3, то выход из цикла, при этом таблице,
            ‘ которая находится на странице 3, будет присвоено vba-имя «tbl».
        If ActiveDocument.Range(Start:=tbl.Range.Start, End:=tbl.Range.Start). _
                Information(wdActiveEndPageNumber) = 3 Then
            Exit For
        End If
    Next tbl

        ‘2. Проверка, была ли найдена нужная таблица.
    If tbl Is Nothing Then
        MsgBox «На странице 3 нет таблицы.», vbExclamation
        Exit Sub
    End If

        ‘3. Вставка в конец таблицы строки.
    tbl.Rows.Add

    End Sub

A «table» in Excel is indeed known as a ListObject.

The «proper» way to reference a table is by getting its ListObject from its Worksheet i.e. SheetObject.ListObjects(ListObjectName).

If you want to reference a table without using the sheet, you can use a hack Application.Range(ListObjectName).ListObject.

NOTE: This hack relies on the fact that Excel always creates a named range for the table’s DataBodyRange with the same name as the table. However this range name can be changed…though it’s not something you’d want to do since the name will reset if you edit the table name! Also you could get a named range with no associated ListObject.

Given Excel’s not-very-helpful 1004 error message when you get the name wrong, you may want to create a wrapper…

Public Function GetListObject(ByVal ListObjectName As String, Optional ParentWorksheet As Worksheet = Nothing) As Excel.ListObject
On Error Resume Next

    If (Not ParentWorksheet Is Nothing) Then
        Set GetListObject = ParentWorksheet.ListObjects(ListObjectName)
    Else
        Set GetListObject = Application.Range(ListObjectName).ListObject
    End If

On Error GoTo 0 'Or your error handler

    If (Not GetListObject Is Nothing) Then
        'Success
    ElseIf (Not ParentWorksheet Is Nothing) Then
        Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found on sheet '" & ParentWorksheet.Name & "'!")
    Else
        Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found!")
    End If

End Function

Also some good ListObject info here.

 

lcf2003

Пользователь

Сообщений: 2
Регистрация: 13.11.2015

Есть необходимость вставить через VBA в строку «умной» таблицы на которой стоит курсор (выделена) некоторые данные.
На одном листе таблиц может быть несколько поэтому ListObjects(1) не подходит. Надо знать индекс (или имя) именно той таблицы, на которой курсор.
Поиск ничего похожего не дал.

 

Пытливый

Пользователь

Сообщений: 4662
Регистрация: 22.12.2012

#2

13.11.2015 14:39:57

Код
ActiveCell.ListObject.Name

Кому решение нужно — тот пример и рисует.

 

МВТ

Пользователь

Сообщений: 1198
Регистрация: 01.02.2015

#3

13.11.2015 14:44:56

Как-то так

Код
Sub tt_1()
 Dim Obj As ListObject
 If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
 For Each Obj In ActiveSheet.ListObjects
    If Not Intersect(ActiveCell, Obj.Range) Is Nothing Then
        MsgBox Obj.Name
        Exit Sub
    End If
 Next
End Sub

Пытливый, здорово,не знал про такой способ  

Изменено: МВТ13.11.2015 14:46:39

 

lcf2003

Пользователь

Сообщений: 2
Регистрация: 13.11.2015

Спасибо, ребят. Все получилось!

 

Pelik

Пользователь

Сообщений: 3
Регистрация: 29.08.2019

Как получить имя — понятно. А как узнать индекс (присвоенный порядковый номер) умной таблицы?

 

Ігор Гончаренко

Пользователь

Сообщений: 13808
Регистрация: 01.01.1970

#6

07.08.2022 12:49:46

Цитата
Как получить имя — понятно

а понятно потому, что написали как это сделать?
перебирайте ActiveSheet.ListObjects по индексу пока имя не совпадет с найденным

Изменено: Ігор Гончаренко07.08.2022 12:51:03

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Pelik

Пользователь

Сообщений: 3
Регистрация: 29.08.2019

Так мне кажется очень сложно. Мне просто нужно придумать обращение к умной таблице на листе через ее индекс. Искал что-то типа ActiveCell.ListObject.Item, но это не работает. Думал есть какой-то другой выход на этот параметр . Он же где-то зашит, как я понимаю. И обращаться к нему можно, напримерMsgBox ThisWorkbook.Worksheets(1).ListObjects(1).Name.

 

Ігор Гончаренко

Пользователь

Сообщений: 13808
Регистрация: 01.01.1970

#8

08.08.2022 21:22:45

Цитата
Pelik написал:
Так мне кажется очень сложно

покажите способ проще, буду знать

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

New

Пользователь

Сообщений: 4649
Регистрация: 06.01.2013

#9

09.08.2022 00:15:00

нормальный способ Игорь предложил, у вас же на листе не миллион умных таблиц

Код
Sub Test()
    Dim objList As ListObject
        
    If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
    With ActiveSheet
        For Each objList In .ListObjects
            If Not Intersect(ActiveCell, objList.Range) Is Nothing Then
                MsgBox "Курсор стоит в таблице:" & vbLf & "Имя: " & objList.Name & vbLf & "Индекс: " & findIndexOfListObject(objList.Name), vbInformation, ""
                Exit Sub
            End If
        Next
    End With
    MsgBox "Курсор не стоит внутри таблицы!", vbExclamation, "Внимание"
End Sub

Private Function findIndexOfListObject(ByVal sName As String) As Long
    Dim i As Long
    With ActiveSheet
        For i = 1 To .ListObjects.Count
            If .ListObjects(i).Name = sName Then
                findIndexOfListObject = i
                Exit Function
            End If
        Next
    End With
End Function
 

Jack Famous

Пользователь

Сообщений: 11027
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#10

09.08.2022 09:04:52

Цитата
Pelik: Как получить имя — понятно. А как узнать индекс (присвоенный порядковый номер) умной таблицы?

вопрос из зала: нахрена, а, главное — зачем? У вас есть Таблица. Засуньте её в переменную и обращайтесь в любое время.
А пока выглядит так, как будто вы сознательно создаёте себе проблемы… Удачи в этом нелёгком деле  ;)

Изменено: Jack Famous09.08.2022 09:05:14

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

RAN

Пользователь

Сообщений: 7135
Регистрация: 21.12.2012

#11

09.08.2022 09:20:32

Цитата
Jack Famous написал:
вопрос из зала: нахрена, а, главное — зачем?

Поддерживаю всеми лапами и хвостом. С одной таблицей на листе (ActiveSheet.ListObjects(1)) понятно, но остальные?

 

если активная ячейка в умной таблице
то вот она эта таблица: ActiveCell.ListObject
а для чего нужен индекс??? похоже, это загадка для всех тут (не исключая автора вопроса)
в Камеди было (в разговоре Сталина с Берией)
— не посчитайте это прихотью, но я хочу мышью окна открывать и не смотря на советскую власть чтобы на столе были иконки… и хочу окна открывать мышью и закрывать!

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Pelik

Пользователь

Сообщений: 3
Регистрация: 29.08.2019

New

Спасибо! То что надо!

 

Ігор Гончаренко

Пользователь

Сообщений: 13808
Регистрация: 01.01.1970

#14

11.08.2022 08:41:54

Pelik, ???
на вопрос из заголовка этой темы :

Цитата
lcf2003 написал:
Как получить имя (или индекс) «умной» таблицы на которой сейчас стоит курсор?

ответ написан в сообщении 2:

Цитата
Пытливый написал:
ActiveCell.ListObject.Name

четкий короткий ответ на конкретный вопрос, все остальное к заявленной теме имеет мало отношения

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

Имена таблиц на листе

Leprotto

Дата: Четверг, 15.02.2018, 17:59 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

Всем привет! Друзья, подскажите как получить имена таблиц с активного листа?
В примере на первом листе одна таблица, на втором — две.
Имена, как вариант, можно записать в ячейки А1 и т.д.

К сообщению приложен файл:

tabName.xlsm
(15.6 Kb)

 

Ответить

nilem

Дата: Четверг, 15.02.2018, 18:24 |
Сообщение № 2

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

Leprotto, привет
попробуйте
[vba]

Код

Sub ttt()
Dim wsh As Worksheet, Lo As ListObject
For Each wsh In ThisWorkbook.Sheets
    For Each Lo In wsh.ListObjects
        wsh.Cells(Rows.Count, 1).End(xlUp)(2, 1) = Lo.Name
    Next Lo
Next wsh
End Sub

[/vba]


Яндекс.Деньги 4100159601573

 

Ответить

Leprotto

Дата: Пятница, 16.02.2018, 10:55 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

nilem, Спасибо большое!
Поправил под себя для активного листа ))
[vba]

Код

Sub ttt2()
Dim Lo As ListObject
    For Each Lo In ActiveSheet.ListObjects
        ActiveSheet.Cells(Rows.Count, 1).End(xlUp)(2, 1) = Lo.Name
    Next Lo
End Sub

[/vba]

 

Ответить

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найди человека по логину в скайпе
  • Одно плечо длиннее другого как исправить упражнениями
  • Как найти в айфоне настройки записи экрана
  • Проектор показывает вверх ногами как исправить optoma
  • Как составить круговую диаграмму в процентном соотношении

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии