Страницы: 1
RSS
Как обратиться к диапазону Умной таблицы?
 
Доброго времени суток!
Как обратиться к диапазону Умной таблицы. Написал код - он рабочий. Но на мой взгляд так писать не совсем верно.
Код
Private Sub ComboBox1_Change()
Dim n As String
Dim i As Long
Dim lLastRow As Long
Dim rgResult As Range
    lLastRow = Cells(Rows.Count, 2).End(xlUp).Row - 1
    n = ComboBox1.Text
Set rgResult = Range("B7:B14").Find(n, , xlValues)

    For i = 7 To lLastRow Step 1
        If rgResult = n Then
            rgResult.Select
    End If
    Next

End Sub
Я имею ввиду диапазон Range("B7:B14").
Дело в том что  у нас есть объект Умная таблица "Таблица1"  внутри которой именованный диапазон/массив "Наименование", а мы обращаемся к колонке активного листа.
А если в колонке "В" над таблицей будут записи? ...
Или колонка "В" не закончится на 14 строке?.... Можно, конечно написать Range("B7:B"), но опять обращаемся к колонке листа.
А что если взять и переместить таблицу внутри листа со смещением? И такое может быть.

Справка VBA так и предлагает обращаться Range("Test")? в моём случае Range("Наименование"), или Application.Goto "Test" - как бы не так??? Ни чего не выходит.
Объявлял объект, присваивал значения - ни чего и ни как?

Кто знает - подскажите.
Спасибо.
-
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Доброе время суток.
Цитата
KonstantinK написал:
Дело в том что  у нас есть объект Умная таблица "Таблица1"  внутри которой именованный диапазон/массив "Наименование",
А так не пробовали?
Код
Workbooks("Лист Microsoft Excel1.xlsm").Worksheets("Накладная").ListObjects("Таблица1").ListColumns("Наименование").DataBodyRange.Address
 
Ругается: "Требуется объект"
Код
Private Sub ComboBox1_Change()
Dim n As String
Dim i As Long
Dim lLastRow As Long
'Dim rgResult As Range
Dim rgResult As Object
    lLastRow = Cells(Rows.Count, 2).End(xlUp).Row - 1
    n = ComboBox1.Text
'Set rgResult = Range("B7:B14").Find(n, , xlValues)
Set rgResult = Workbooks("Лист Microsoft Excel1.xlsm").Worksheets("Накладная").ListObjects("Таблица1").ListColumns("Наименование").DataBodyRange.Address
    For i = 7 To lLastRow Step 1
        If rgResult = n Then
            rgResult.Select
    End If
    Next

End Sub
Изменено: KonstantinK - 10.02.2019 17:49:54
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал: Ругается: "Требуется объект"
Это естественно, Address возвращает строку. Не стоит столь слепо копировать пример. Удалите .Address получите объект Range области данных столбца Наименование.
 
KonstantinK, https://www.thespreadsheetguru.com/blog/2014/6/20/the-vba-guide-to-listobject-excel-tables
 
Родил. Кому будет интересно вот код (исключительно с Умной таблицей):
Код
Private Sub ComboBox1_Change()
Dim myTable As ListObject
Dim x As Long
Dim n As String
Dim myArray As Variant
    n = ComboBox1.Text
    Set myTable = ActiveSheet.ListObjects("Таблица2")
    myArray = myTable.DataBodyRange
        For x = LBound(myArray) To UBound(myArray)
            If myArray(x, 2) = n Then
                myTable.DataBodyRange.Rows(x).Select
            End If
        Next x
End Sub
Забыл, есть нюанс:
Данный код будет обрабатывать первую строку - шапку и последнюю - итоги.
Здесь я ни чего не делал, чтобы убрать их, т.к. я их исключил в другом коде см. прикреплённый файл.
Изменено: KonstantinK - 10.02.2019 21:23:41
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
Данный код будет обрабатывать первую строку - шапку и последнюю - итоги
Не будет. Сходите по ссылке, которую я дал - там на рисунках показано, что такое .Range, .DataBodyRange и другие части таблицы.
Страницы: 1
Наверх