"взять" списоок неодинаковых значений

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
oleg_vm
Сообщения: 21
Зарегистрирован: 16 сен 2005, 10:19

Всех приветствую!
Друзья помогите в следующем вопросе:
Есть таблица. Если сделать автофильтр в заголовке, как известно, Excel заносит в список автофильтра перечень неодинаковых значений данного столбца. Кто может подскажет, как программно в VB взять такой список по конкретному столбцу, занести скажем в массив и далее уже работать и обрабатывать его?
treider
Сообщения: 57
Зарегистрирован: 01 сен 2005, 13:29
Откуда: Алматы
Контактная информация:

Думаю это можно сделать только обработав весь столбец.
К списку который формирует автовильтр добраться из VB возможности нет. Или эта возможность хорошо скрыта.
oleg_vm
Сообщения: 21
Зарегистрирован: 16 сен 2005, 10:19

неужели ручками в цикле прогонять всю выборку и формировать список "встречающихся" значений? Как-то же можно добраться до списка автофильтра, какой-же метод его формирует?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

чисто в виде идеи: я бы попробовал копнуть в сторону обращения к листу как к базе данных ну и соответственно попытаться сделать там select distinct
Изображение
treider
Сообщения: 57
Зарегистрирован: 01 сен 2005, 13:29
Откуда: Алматы
Контактная информация:

есть еще функция 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
oleg_vm
Сообщения: 21
Зарегистрирован: 16 сен 2005, 10:19

класс, спасибо ребята!
treider
Сообщения: 57
Зарегистрирован: 01 сен 2005, 13:29
Откуда: Алматы
Контактная информация:

А в чем кривизна? У меня отлично работает. Немножко доделал:


Код:

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.

Если объединенных ячеек по близости нет, то можно попробовать втавлять
фиктивное значение в качестве заголовка

Код: Выделить всё

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 с таблицами без заголовка!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

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
Ответить