"взять" списоок неодинаковых значений
Модератор: Naeel Maqsudov
Всех приветствую!
Друзья помогите в следующем вопросе:
Есть таблица. Если сделать автофильтр в заголовке, как известно, Excel заносит в список автофильтра перечень неодинаковых значений данного столбца. Кто может подскажет, как программно в VB взять такой список по конкретному столбцу, занести скажем в массив и далее уже работать и обрабатывать его?
Друзья помогите в следующем вопросе:
Есть таблица. Если сделать автофильтр в заголовке, как известно, Excel заносит в список автофильтра перечень неодинаковых значений данного столбца. Кто может подскажет, как программно в VB взять такой список по конкретному столбцу, занести скажем в массив и далее уже работать и обрабатывать его?
Думаю это можно сделать только обработав весь столбец.
К списку который формирует автовильтр добраться из VB возможности нет. Или эта возможность хорошо скрыта.
К списку который формирует автовильтр добраться из VB возможности нет. Или эта возможность хорошо скрыта.
неужели ручками в цикле прогонять всю выборку и формировать список "встречающихся" значений? Как-то же можно добраться до списка автофильтра, какой-же метод его формирует?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
чисто в виде идеи: я бы попробовал копнуть в сторону обращения к листу как к базе данных ну и соответственно попытаться сделать там select distinct

есть еще функция range.AdvancedFilter, по описанию вроде оно но она покрайне мере у меня работает как-то криво
Код: Выделить всё
Sub f()
Dim r As Range
Dim r3 As Range
Set r = Range("A1:A21")
Set r3 = Range("C1:C21")
h = r.AdvancedFilter(xlFilterCopy, , r3, True)
End Sub
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
А в чем кривизна? У меня отлично работает. Немножко доделал:
Код: Выделить всё
Sub f()
Dim r As Range
Dim r3 As Range
Set r = Range("A1:A21")
Set r3 = Range("C1:C21")
r3.ClearComments
r.AdvancedFilter xlFilterCopy, , r3, True
r3.Sort r3.EntireColumn
End Sub
Так намного корректней стала работать, но:А в чем кривизна? У меня отлично работает. Немножко доделал:
Код:
Sub f()
Dim r As Range
Dim r3 As Range
Set r = Range("A1:A21")
Set r3 = Range("C1:C21")
r3.ClearComments
r.AdvancedFilter xlFilterCopy, , r3, True
r3.Sort r3.EntireColumn
End Sub
если дублирующиеся значения стоят в начале то первые два пропускает.
И если в диапазоне <r> дубликаты идут в разброс он их не видет (это решается сортировкой области <r>)
Возможно у меня Excel кривой (Excel 2002 SP2)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
ВНИМАНИЕ! Там опечатка ClearComments надо заменить на ClearContents.
Это получается из-за того, что AdvancedFilter считает первую строку за заголовок таблицы.
Содержимое заголовка также помещается в первую строку результата фильтрации.
Поэтому, если таблица начинается с двух одинаковых значений, то результирующая
содержит и заголовок, плюс одно вхождение строки.
Т.е. A1 никогда не участвует в фильтрации, а просто копируется в С1.
Если объединенных ячеек по близости нет, то можно попробовать втавлять
фиктивное значение в качестве заголовка
Но лучше, чтобы у фильтруемой таблицы был естественный свой собственный заголовок...
Ну не работает AdvancedFilter с таблицами без заголовка!
Да-а-а, есть такое дело.если дублирующиеся значения стоят в начале то первые два пропускает
Это получается из-за того, что AdvancedFilter считает первую строку за заголовок таблицы.
Содержимое заголовка также помещается в первую строку результата фильтрации.
Поэтому, если таблица начинается с двух одинаковых значений, то результирующая
содержит и заголовок, плюс одно вхождение строки.
Т.е. A1 никогда не участвует в фильтрации, а просто копируется в С1.
Если объединенных ячеек по близости нет, то можно попробовать втавлять
фиктивное значение в качестве заголовка
Код: Выделить всё
Sub f()
Dim r As Range
Dim r3 As Range
Range("A1").Insert xlShiftDown
Range("A1").Value = "[kill me]"
Set r = Range("A1:A22")
Set r3 = Range("C1:C22")
r3.ClearContents
r.AdvancedFilter xlFilterCopy, , r3, True
Range("C1").Delete xlShiftUp
r3.Sort r3.EntireColumn
Range("A1").Delete xlShiftUp
End Sub
Ну не работает AdvancedFilter с таблицами без заголовка!
Naeel Maqsudov конечно прав, ведь любая таблица MS Excel должна иметь заголовок (шапку), поэтому могу предложить пойти по пути "наименьшего сопротивления" и просто обхамить пользователя, который не следует основным заповедям электронных таблиц …
Код: Выделить всё
With ThisWorkbook.Worksheets(1).Range("A1:C100")
If .ListHeaderRows = 0 Then
MsgBox "Таблица не содержит заголовков (шапки)" & vbCrLf & _
"и поэтому не может быть корректно отфильтрована", , _
"Ошибка пользователя !!!" ' Exit Sub
Else
.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Worksheets.Add.Range("A1"), Unique:=True
End If
End With