Как получить диапазон ячеек с .Value Like Mask & "*

Программирование на Visual Basic for Applications
Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Как получить диапазон ячеек с .Value Like Mask & "*

Сообщение Чудовище под кроватью » 19.01.2007 (Пт) 19:50

Хочу просто получить диапазон ячеек листа, подходящих под текстовый шаблон. Без всяких циклов. Методом Find, SpecialCells или чем-то подобным.
У-у-у!!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 19.01.2007 (Пт) 20:32

Не уверен, что такое возможно. Самое быстрое, что мне приходит в голову это след. код (приблизительно то же делает кнопка "найти все" в диалоге "поиск")

Код: Выделить всё
Option Explicit
Sub Test()
    Dim rng As Range, c As Range, cnt As Long
    Dim i As Long, msk As String, res As Range
    msk = "Я идиот! Убейте меня, кто-нибудь!???PhotoSmart*"
    On Error Resume Next
    Set rng = ActiveSheet.UsedRange
    Set c = rng.Find(msk, rng(1), , xlWhole)
    cnt = Application.CountIf(rng, msk)
    For i = 1 To cnt
        If res Is Nothing Then Set res = c Else Set res = Union(res, c)
        Set c = rng.Find(msk, c, , xlWhole)
    Next i
    res.Select
End Sub
Привет,
KL

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 19.01.2007 (Пт) 21:28

KL писал(а):Не уверен, что такое возможно. Самое быстрое, что мне приходит в голову это след. код (приблизительно то же делает кнопка "найти все" в диалоге "поиск")

Я быстрее как-нибудь хочу - чтобы без цикла. Вызвал метод - получил Range объект. Но countif тоже хорошо придумано.
В моем случае надо искать не во всех ячейках, а только в определенном столбце и шаблон начинается известным текстом (т.е. параметром, но это не важно).
Вот, думаю, сортировку сделать, чтобы они в кучу встали. Тогда нужный мне диапазон будет: Range().Find.Resize(CountIf). - Без цикла, что неплохо,... НО работает только с вызовом сортировки и только если шаблон не начинается с "*"
Последний раз редактировалось Чудовище под кроватью 19.01.2007 (Пт) 22:26, всего редактировалось 1 раз.
У-у-у!!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 19.01.2007 (Пт) 22:13

Чудовище под кроватью писал(а):Я быстрее как-нибудь хочу - чтобы без цикла. Вызвал метод - получил Range объект.


Да-ааааа? Ну тогда сразу отбрасывай Find и SpecialCells (последний просто не ищет по маскам, а лишь по индексированным ячейкам)
Привет,
KL

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 19.01.2007 (Пт) 22:30

KL
А AdvancedFilter?
У-у-у!!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 19.01.2007 (Пт) 22:59

Это первое что пришло мне в голову после твоего ответа :-)
Думаю, без цикла не обойдется, т.к. придется фильтровать столбец за столбцем во избежание конфликтов в строках. Правда цикл будет ограничен 256 пассами, но все равно придется использовать медлительную функцию Union (правда всего 255 раз) и ограниченный 8.192 несмежными областями метод SpecialCells(xlCellTypeVisible). На мой вкус могло бы получиться довольно сносно, но опять же от цикла не убежишь.
Привет,
KL

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 19.01.2007 (Пт) 23:07

Чудовище под кроватью,

Ты напрасно дописываешь в сообщения после того, как я на них ответил я уже дважды чудом наскакивал на твои дополнения. Получается что некоторые мои ответы какбы невпопад :-(

Чудовище под кроватью писал(а):В моем случае надо искать не во всех ячейках, а только в определенном столбце и шаблон начинается известным текстом (т.е. параметром, но это не важно).


в таком сл. AdvancedFilter - это то, что надо (см. приложение)

вот сам код:

Код: Выделить всё
Sub Macro1()
    Dim strMsk As String, rng As Range, rngCrit As Range
   
    On Error Resume Next
    strMask = InputBox("Insert a mask", "Select by mask", "'=TEST*")
    Set rngCrit = Sheets("Sheet2").Range("A1:A2")
    Set rng = Sheets("Sheet1").[C:C]
    rngCrit(1) = rng(1)
    rngCrit(2) = strMask
   
    rng.AdvancedFilter xlFilterInPlace, rngCrit
    rng.Resize(rng.Count - 1).Offset(1).SpecialCells(xlCellTypeConstants).SpecialCells(xlCellTypeVisible).Select
    rng.Parent.ShowAllData
End Sub


Но помни о 8.192 несмежных областях - Excel подло промолчит в случае ошибки :-(
Вложения
Book1.xls
(315.5 Кб) Скачиваний: 55
Привет,
KL

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 20.01.2007 (Сб) 16:15

KL
Большое спасибо! :D
У-у-у!!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 91

    TopList