Страницы: 1
RSS
Поиск по умной таблице с помощью функции find, как это работает?
 
Я балуюсь с макросами чуть больше недели, поэтому плохо понимаю как работают те или иные функции, в частности find,
У меня есть умная таблица "ClientsList_tbl" в одну колонку (вряд ли это имеет значение), с heading-ом в ячейке B2, на листе "Lists", в книге "Clients_wb".
Нужно найти соответствие значения в textbox-е "Name_txb" с содержимым таблицы "ClientsList_tbl", если его нет то добавить в таблицу строку с этим значением.
Подскажите как сформулировать код просто и действенно.
Код
If ["ClientsList_tbl"].Find(Name_txb.Value) Is Nothing Then
        Clients_wb.Lists.Range("B2").End(xlDown).Offset(1, 0).Select
        Clients_wb.Lists.ListObjects("ClientsList_tbl").ListRows.Add
        ActiveCell.Value = Name_cmb
End If
 
Что-то мне подсказывает, что метод Find надо применять к диапазону. А диапазон умной таблицы можно так:
ListObjects("ClientsList_tbl").Range

Опять же, читая справку, коя есть услада наша и опора в часы непонимания, выясняем, что метод Find, будучи применен к диапазону, возвращает Range(диапазон, первую ячейку), содержащую искомое значение, либо(если не нашел) возвращает значение - Nothing. Вот предлагаю этот самый Nothing отлавливать в условии If
Типа: если метод Find для диапазона таблицы по заданному значению выдал Nothing- ой. А иначе - не ой.
Ну, собственно, как у вас и задумано.
Изменено: Пытливый - 16.03.2018 18:06:03
Кому решение нужно - тот пример и рисует.
 
так не сработало
 
Чем докажете?
Согласие есть продукт при полном непротивлении сторон
 
Любитель, попробуйте так
Код
  With Clients_wb.Worksheets("Lists").ListObjects("ClientsList_tbl")
    If IsError(Application.Match(Name_txb.Value, .DataBodyRange, 0)) Then
      .ListRows.Add
      .DataBodyRange(.DataBodyRange.Count) = Name_txb.Value
    End If
  End With
А вообще, без файла-примера (Правила п.2.3.) это гадание на кофейной гуще.
Хорошая статья по работе с умными таблицами из VBA: https://www.thespreadsheetguru.com/blog/2014/6/20/the-vba-guide-to-listobject-excel-tables
Изменено: Казанский - 16.03.2018 19:39:29
 
Казанский, спасибо за решение и за ссылку, интересно. Возникла проблема с первой же строкой:
Код
Clients_wb.Worksheets("Lists").ListObjects("ClientsList_tbl")
Почему-то выкидывает ошибку "Method or data member not found" на слове Worksheets
И если менять строку:
Код
Clients_wb.Lists.ListObjects("ClientsList_tbl")
Код
Dim Clients_wb as Workbook
Dim Lists as Worksheet
Dim ClientsList_tbl as ListObject
Clients_wb.Worksheets("Lists").ListObjects("ClientsList_tbl")
Код
Dim Clients_wb as Workbook
Dim Lists as Worksheet
Dim ClientsList_tbl as ListObject
Clients_wb.Lists.ClientsList_tbl
Ошибка продолжает всплывать

P.S. Хотел прикрепить документ, но случайно удалил нафиг весь код в нём и сохранил. Поэтому ваши подсказки мне помогут при восстановлении.
Изменено: Любитель - 17.03.2018 11:03:47
 
Цитата
Казанский написал: А вообще, без файла-примера (Правила п.2.3.) это гадание на кофейной гуще.
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Любитель написал: Почему-то выкидывает ошибку "Method or data member not found" на слове Worksheets
Значит в книге Clients_wb отсутствует лист Lists
Посмотрите в Tools - References есть ли позиции начинающиеся с MISSING
Согласие есть продукт при полном непротивлении сторон
 
Лист на месте, отсутствующих библиотек нет, сам я библиотеки ни как не изменял
 
Цитата
Любитель написал:
У меня есть умная таблица "ClientsList_tbl" в одну колонку (вряд ли это имеет значение), с heading-ом в ячейке B2, на листе "Lists", в книге "Clients_wb"
Если "Clients_wb" это имя книги, "Lists" это имя листа (которое на ярлычке, а не CodeName), то наверно так
Код
With Workbooks("Clients_wb.xlsm").Worksheets("Lists").ListObjects("ClientsList_tbl") 'имя книги лучше с расширением
Разобраться с тем, доступ к какому объекту вызывает ошибку, можно так
Код
Sub test()
Dim x
Set x = Workbooks("Clients_wb")
Set x = x.Worksheets("Lists")
Set x = x.ListObjects("ClientsList_tbl")
End Sub
Страницы: 1
Наверх