Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2011, 11:40   #1
Айвенго
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 59
По умолчанию Фильтровка данных в ячейке

вообщем у меня имеется таблица значений... а так же ячейка где осуществлен выбор этих значений (т.е. при нажатии на ячейку открывается поле со списком) вот... каким образом можно осуществить фильтровку данных в ячейке по некоторому условию... в данном примере хотелось осуществить чтобы ячейка отсеяла все пустые значения которые находятся колонке "свободен"... либо же наоборот оставляла только те записи где есть хоть какое нибудь значение...
Вложения
Тип файла: rar Лист Microsoft Excel.rar (3.0 Кб, 12 просмотров)

Последний раз редактировалось Айвенго; 21.04.2011 в 11:46.
Айвенго вне форума Ответить с цитированием
Старый 21.04.2011, 13:33   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Возможны варианты. Оба не идеальны, есть что улучшить...
Код:
Sub UniqInValidation()
Dim oDict As Object, iLastRow As Long, i As Long, Arr(), kk ', str_ As String
Set oDict = CreateObject("Scripting.Dictionary")
    oDict.CompareMode = vbTextCompare

    With Sheets("Лист1")
        iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = 2 To iLastRow
            On Error Resume Next
            oDict.Add .Cells(i, 2), CStr(.Cells(i, 3))
        Next
    ReDim Arr(1 To oDict.Count)
        i = 0
        For Each kk In oDict.keys
       If oDict.Item(kk) <> "" Then
'       str_ = str_ & kk & ","
       i = i + 1
       Arr(i) = kk
       End If
        Next
  '      str_ = Join(Arr, ",")
        Sheets("Лист1").[J1].Validation.Delete
        Sheets("Лист1").[J1].Validation.Add Type:=xlValidateList, Formula1:=Join(Arr, ",") 'str_
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.04.2011, 14:01   #3
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

А получится сразу Formula1:=Join(.Keys, ",") ?
Ага, получается, только пустые надо сразу отбрасывать, когда oDict.Add

Последний раз редактировалось nilem; 21.04.2011 в 14:04. Причина: Проверил :)
nilem вне форума Ответить с цитированием
Старый 21.04.2011, 14:38   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

И впрямь... Я переделывал из кода на коллекции - с коллекцией не получалось.
Надо добить и сохранить...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.04.2011, 14:43   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub UniqInValidation()
Dim oDict As Object, iLastRow As Long, i As Long
Set oDict = CreateObject("Scripting.Dictionary")
    oDict.CompareMode = vbTextCompare

    With Sheets("Лист1")
        iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
        On Error Resume Next
        For i = 2 To iLastRow
                    If Len(.Cells(i, 3)) Then oDict.Add .Cells(i, 2), CStr(.Cells(i, 3))
        Next
        .[J1].Validation.Delete
        .[J1].Validation.Add Type:=xlValidateList, Formula1:=Join(oDict.Keys, ",")
    End With
End Sub
Хотя что-то не выходит уникальность... есть повторы...

Вот кто скажет, почему
Код:
Sub WhyNonUniqInValidation()
Dim oDict As Object, iLastRow As Long, i As Long
Set oDict = CreateObject("Scripting.Dictionary")

    With Sheets("Лист1")
        iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = 2 To iLastRow
            If Len(.Cells(i, 3)) Then oDict.Add .Cells(i, 2), "1"
        Next
        .[J1].Validation.Delete
        .[J1].Validation.Add Type:=xlValidateList, Formula1:=Join(oDict.keys, ",")
        [n1].Resize(oDict.Count) = Application.Transpose(oDict.keys)
    End With
End Sub
И даже On Error Resume Next убрал - кладёт всё, что ни дашь...

Нашёл - .Value не хватало:
Код:
Sub UniqInValidation()
Dim oDict As Object, iLastRow As Long, i As Long
Set oDict = CreateObject("Scripting.Dictionary")

    With Sheets("Лист1")
        iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = 2 To iLastRow
            If Len(.Cells(i, 3).Value) Then oDict.Item(.Cells(i, 2).Value) = 1
        Next
        .[J1].Validation.Delete
        .[J1].Validation.Add Type:=xlValidateList, Formula1:=Join(oDict.keys, ",")
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.04.2011 в 15:34.
Hugo121 вне форума Ответить с цитированием
Старый 21.04.2011, 17:37   #6
Айвенго
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 59
По умолчанию

ммм... а как можно сделать... если имеется вторая таблица значений... и в той же самой ячейке фильтровались данные в зависимости какая таблица выбрана...

Последний раз редактировалось Айвенго; 22.04.2011 в 08:02.
Айвенго вне форума Ответить с цитированием
Старый 22.04.2011, 08:04   #7
Айвенго
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 59
По умолчанию

вот сам документ
Вложения
Тип файла: rar Лист Microsoft Excel.rar (8.8 Кб, 10 просмотров)
Айвенго вне форума Ответить с цитированием
Старый 22.04.2011, 09:58   #8
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

В I1 выбираем таблицу.
Вложения
Тип файла: zip Айвенг.zip (13.9 Кб, 12 просмотров)
nilem вне форума Ответить с цитированием
Старый 22.04.2011, 12:27   #9
Айвенго
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 59
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
В I1 выбираем таблицу.
тут как получается то... он выбирает значения из колонки "свободен" и еще откидывает повторяющиеся значения... надо чтоб отображал значения из второй колонки и сверял с третей где есть некое значение
__________________________
хотя нет... все... сам подредактировал

Последний раз редактировалось Айвенго; 22.04.2011 в 12:30.
Айвенго вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет данных введенных в одной ячейке. Hagen83 Microsoft Office Excel 12 15.06.2013 12:31
изменение текстовых данных в одной ячейке Bordyug Microsoft Office Excel 2 19.02.2010 15:07
Фильтровка crit БД в Delphi 9 05.06.2009 21:33
удаление лишних данных в ячейке mistx Microsoft Office Excel 2 24.02.2009 18:32
Фильтровка и редактирование БД rainbow БД в Delphi 1 17.10.2008 12:44