Страницы: 1
RSS
Список умных таблиц, содержащихся в одном файле
 
Коллеги, прошу помощи:
Есть ли какой-то способ получить список умных таблиц, которые "живут" в книге (той же самой - ThisWorkbook)?
В идеале, чтобы такой список попадал на какой-то лист, специально отведенный для этого и столбцы списка показывали:
1) Наименование умной таблицы
2) Лист (имя), на котором  она размещена
3) Адрес диапазона умной таблицы

Спасибо!
 
Код
For Each Sheet In Sheets
For Each LO In Sheet.ListObjects
With LO
    Debug.Print .Name, .Parent.Name, .Range.Address
End With
Next
Next
По вопросам из тем форума, личку не читаю.
 
Dollinsky, цикл по всем листам книги (For Each sh in ActiveWorkBook), в нём цикл по всем умным таблицам (For Each LO in sh.ListObjects)
1. LO.Name
2. sh.Name
3. LO.Range.Address(0,0,xlA1)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Спасибо! В Immediate попадает, а как на лист вывести? Скажем, Лист4 начиная со 2-й строки по столбцам B,C,D ?
Слаб в VBA :( Сорри
 
Цитата
Dollinsky написал:
Слаб в VBA  Сорри
та же фигня + еще и лень  :D  
По вопросам из тем форума, личку не читаю.
 
Спасибо!
Не знал, какого типа переменной объявить LO и Sheet. Пришлось отключить Option Explicite, заработало. Если LO  объявлять как ListObject, то выдает ошибку. Если Object, то работает.
Спасибо еще раз!
Изменено: Dollinsky - 11.08.2021 18:47:55
 
Цитата
Dollinsky написал:
Если LO  объявлять как ListObject, то выдает ошибку.
Не должно. Проверьте:
Код
Dim Sheet As Worksheet, LO As ListObject
Владимир
 
И правда! Спасибо!
 
Цитата
sokol92: Dim Sheet As Worksheet
Владимир, приветствую! Всё-таки я не сторонник подменять служебные имена своими, и потому переменную листа я бы назвал sh As WorkSheet или sh As Sheet
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: и потому переменную листа я бы
и потом в объектной модели появился объект SH и ты такой "ой блин все переписывать".
то что не вредит - используй и не парься. Удобно SH ок, objSheet - тоже , да и Sheet не пострадает.

да и
Цитата
Jack Famous написал: Всё-таки я не сторонник подменять служебные имена своими,
что-то не то во фразе.  :D
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ:в объектной модели появился объект SH и ты такой "ой блин все переписывать"
VBE Replace  :idea:
да и ты веришь-то сам, что в VBA что-то обновится?  :D
Цитата
БМВ: что-то не то во фразе
"своими" можно было не писать, но и так корректно
Изменено: Jack Famous - 12.08.2021 11:26:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
VBA что-то обновится
в нем нет, а вот в объектной модели может.
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
Всё-таки я не сторонник подменять служебные имена своими
Я имена привел для #2.
Насколько я помню, идентификатор Sheet никак не задействован в VBA и его нет среди имен объектов.
Перекрытие имен вещь не рекомендуемая, но иногда полезная, как в случае с функцией VBA Msgbox, которая совсем не дружит с юникодом.
Изменено: sokol92 - 12.08.2021 20:41:34
Владимир
 
Цитата
sokol92: идентификатор Sheet никак не задействован в VBA
это тип переменной
Цитата
Jack Famous: sh As Sheet

Цитата
sokol92: Перекрытие имен вещь не рекомендуемая, но иногда полезная, как в  случае  с функцией VBA Msgbox
ну тут уже вкусовщина. Я, как разработчик, лучше вызову MyMsgBox с блэкджеком и прочим, чем буду вызывать MsgBox, с разным результатом в зависимости от того, есть подмена или нет  :)
Ну и всегда есть Replace, если нужно заменить функцию  ;)
Изменено: Jack Famous - 13.08.2021 09:31:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Off
Цитата
Jack Famous написал:
MyMsgBox
да ладно , вангую будет PRDXMsgBox  :D
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ:PRDXMsgBox
почти: PRDX_MsgBox  :D
У меня в этом порядок - где код находится, оттуда и префикс, чтобы не путаться  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
For Each Sheet In Sheets
в зависимости от ситуации может очень сильно подвести, выдав ошибку типов. Например, если в книгу будет вставлен лист типа Диаграмма, либо Лист макросов, Диалоговых окон...У этих листов нет таких объектов, как таблицы и в них они не могут быть вставлены.
Поэтому правильнее будет делать цикл исключительно по Worksheets, т.к. только в них могут быть вставлены умные таблицы:
Код
For Each Sheet In WorkSheets
Цитата
Jack Famous написал:
не сторонник подменять служебные имена своими
а нет служебного Sheet. Поэтому можно и попользовать :)
Цитата
Jack Famous написал:
это тип переменной
нет такого типа. Есть коллекция Sheets, которая подразделяется на 5 других типов:
  • Рабочие листы
  • Листы диаграмм
  • Листы макросов 4.0
  • Листы международных макросов
  • Листы диалогов
Есть Worksheets, которая содержит только рабочие листы. И есть Worksheet - это как раз тип. А типа Sheet нет и не было. И скорее всего не будет, т.к. не может быть просто типа Sheet, т.к. его нельзя будет отнести к конкретному типу листов, а MS любит конкретику в этом плане :)
Изменено: Дмитрий(The_Prist) Щербаков - 13.08.2021 12:55:27
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков: нет служебного Sheet
проверил, действительно нет, спасибо тебе и Мише с Соколом  :)
Наверное по аналогии Worksheet(s) = Sheet(s) подумал, т.к. коллекция Sheets есть  :sceptic:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
правильнее будет делать цикл исключительно по Worksheets,
да, согласен. Редко такое бывает но ради универсальности лучше так.
По вопросам из тем форума, личку не читаю.
 
Dollinsky, тоже столкнулся с таким вопросом пришлось писать макрос  
Код
Sub ListAllTables()
    Dim ws As Worksheet
    Dim newSheet As Worksheet
    Dim tbl As ListObject
    Dim i As Integer

    ' Создаем новый лист
    Set newSheet = ThisWorkbook.Sheets.Add
    newSheet.Name = "TableList"

    ' Заголовки для нашего списка таблиц
    newSheet.Cells(1, 1).Value = "Table Name"
    newSheet.Cells(1, 2).Value = "Sheet Name"
    newSheet.Cells(1, 3).Value = "Table Range"

    i = 2

    ' Проходим по каждому листу и каждой таблице
    For Each ws In ThisWorkbook.Sheets
        For Each tbl In ws.ListObjects
            ' Записываем информацию о таблице в новый лист
            newSheet.Cells(i, 1).Value = tbl.Name
            newSheet.Cells(i, 2).Value = ws.Name
            newSheet.Cells(i, 3).Value = tbl.Range.Address

            i = i + 1
        Next tbl
    Next ws
End Sub
Страницы: 1
Наверх