Выбор данных (по Месяцу)

Программирование на Visual Basic for Applications
Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Выбор данных (по Месяцу)

Сообщение Терминатор » 02.05.2005 (Пн) 13:54

Уважаемые,
не знаю даже как это правильно назвать, может не "выбор данных".

Видел тут на днях программку на VB, и одно мне понравилось.
Вверху ComboBox, в нём список месяцев - Январь, Февраль, ... Декабрь. Внизу сетка с данными. Первый столбец - даты. Справа в строках инфа, на против каждой даты. При выборе например определённого месяца, отображаются все даты. Другие даты не видны.
Я конечно мог бы такой вопрос задать в форуме по VB, но мне-то хочется повторить это в Excel !
Первое что пришло в голову использовать "написанный" автофильтр. Но вышла заморочка. Ведь понятное дело, если мы выбираем Январь, то должны отобразиться все данные - с 1.01.05 до 31.01.05. Получется надо искать значение в середине.
К тому же записей в Январе может быть не 31 одна, а 108, а в Феврале будет всего две 28.02.05 и 28.02.05. Т.е. всё пройдёт одним днём. Естественно у меня получилось нагромождение одной If ... Then на другую. Как в кошмарном сне.

Так вот, ребята, кто писал подобное в VB, там какой метод применяется? Наверняка есть какая-нибудь встроенная функция, или комбинация этих встроенных финкий. И главное, можно ли этим методом воспользоваться в VBA?

(Вот к примеру, я для себя обнаружил, что для условного форматирования не обязательно использовать If ... Then. Хотя по-другому я и не представлял что это можно.
FormatConditionObject.Add() - Получается компактно и красиво.)
Hasta la vista, baby!

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 02.05.2005 (Пн) 15:13

Да, забыл добавить

For Each c In [A1:A20]
If c.Value Like "**.01.*" Then
c.EntireRow.Hidden = True
End If
Next

:shock: не предлогать.

такое я пробовал, нормально работает, но я как всегда не удовлетворён. Ведь если что, и мне понадобиться в VB написать, то это не прокатит. Да к тому же, постоянно возврат к отображению c.EntireRow.Hidden = False приходиться делать.
Хочется сразу научится грамоте, чтоб потом не переучиваться.
:arrow: - Или может я "загибаю" ? 8)
Hasta la vista, baby!

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 02.05.2005 (Пн) 21:04

Вот она страшилка -
http://www.webfile.ru/285143
детям до 16... :lol: ибо взрослые дядьки будут смеятся.

Как видно, если убрать Application.ScreenUpdating = False
То всё пропало... :shock:
А если Set ListOne = Лист1.[A2:A500]
будет равен = Лист1.[A2:A65536]
Тогда можно вообще про всё забыть
и идти курить бамбук...:thumright:
Хотя с самого начала я думал только о диапазоне "A2:A65536"
Вот поэтому-то я и ищю другое решение.
Иначе с такой скоростью можно только..., ну, я даже и не знаю что можно делать. :lol:
Hasta la vista, baby!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 02.05.2005 (Пн) 21:26

Думаю, все-таки лучше сделать с помощью автофильтра, потому что задачка как будто специально для него создана. Один из способов - для каждого месяца задать два условия на дату как на число (даты в экселе хранятся как целые числа, 1 января 2005 года, например, - это число 38353). Соответственно, на каждый месяц накладываем два условия для автофильтра, например, для января 2005:

Код: Выделить всё
    Selection.AutoFilter Field:=1, Criteria1:=">=38353", Operator:=xlAnd, Criteria2:="<38384"


И так для каждого месяца.

Можно и другими способами, например, создать доп. столбец в экселе, в котором будет вычисляться только месяц, и делать автофильтр уже по нему.

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 03.05.2005 (Вт) 12:00

Ба..!
:arrow:
Я с самого начала когда просто поставил Автофильтр, и увидел что он не отображает уникальные данные более 1000 (да ещё в справочниках везде выделяют - "Внимание! Автофильтр с записями более 1000 может не отобразить...") сразу решил использовать для написаниа фильтрации любые методы кроме AutoFilter.
Прочитал Ваш совет, и думаю, ну раз человек советует, надо попробовать. Попробовал.
Прям стыдно стало, :oops: за себя самого. А я то уж полез, в дебри...
Уважаемый uhm , а что Вы мне можете сказать про VB6.
Ну или VB.NET, хотя бы теоритически.
Спасибо.
Hasta la vista, baby!

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 06.05.2005 (Пт) 9:06

Упс... :arrow: Оказывается,
Для правильной работы фильтра при выборе значений

Set Значение1 = Range("A1")
Set Значение2 = Range("A2")
' Или
' Set Значение1 = TextBox1.Value
' Set Значение2 = TextBox2.Value
'Необходимо добавить
Значение1 = "*" ' - для текста

Selection.AutoFilter field:=1, Criteria1:=Значение1, Operator:=xlAnd, Criteria2:=Значение2


ВОПРОС >>>
Что необходимо для цифр, дат, времени. Или может возможно воспользоваться чем то универсальным, чтоб один раз обьявил, и какие бы данные не содержались в условии отбора(текст ,даты, время,) автофильтр работал бы. :?:
Hasta la vista, baby!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 06.05.2005 (Пт) 10:26

1) Я не программист по профессии и практически ничего не знаю про VB.NET, поэтому воздержусь здесь от комментариев - не моя область :)

2) А что касается второго вопроса - я немножко его не понял. Универсальные условия для разных типов данных вряд ли можно задать. И про звездочку тоже не понял: * - это значит, совпадение с любым количеством символов, т. е. если просто указать в условии "*" - это значит, ничего не указать. Вот, например, текст "a*" выберет все слова, начинающиеся на "а", а "*а*" - все слова, содержащие "а".

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 08.05.2005 (Вс) 23:12

С датами разобрался.
Код: Выделить всё
CLng(Calendar1.Value)
подходит на все случаи, проверил.
(Это при условии выбора даты из встроенного календаря, который расположен на форме или Листе. )
Спасибо за наводку , uhm .

Но как быть со временем ? Перепробовал почти всё, ничего не получается. (к примеру критерий - выбрать строки с 12.30 часов , до 21.15 часов) Мало того, это тоже надо через на UserForm.
Хотя бы подсказку..., маленькую. 8)
Hasta la vista, baby!

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 09.05.2005 (Пн) 9:45

Образец -
http://www.webfile.ru/294457
работает только по выбору дат. Выделить первую OptionButton1, потом выбрать начальную дату в календаре, выделить вторую OptionButton2, выбрать конечную дату в календаре, далее батон отчёт... По ФИО, тоже всё просто.
По времени вопрос остался открытым. :idea:
Hasta la vista, baby!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 09.05.2005 (Пн) 22:37

Продолжаем наводки :)
Дата и время - задаются одним и тем же числом, просто за дату отвечает целая часть этого числа, а за время - дробная. Соответственно, чтобы ввести дату со временем, нужно сначала определить целую часть числа как нужную дату, а потом дробную часть как время, для этого нужно количество времени поделить на 24 часа. Пример: 10 часов 15 минут утра 1 января 2005 года: целая часть - 38353 (количество дней, прошедешее с 31 декабря 1899 года), дробная часть - 0,427...=(10+1/4)/24 (время, прошедшее с начала суток, как доля суток).

Можно очень просто это все посмотреть - в одну ячейку вводишь дату и время, потом приравниваешь к ней другую ячейку и ставишь в ней числовой формат - получишь число, соотвествующее дате и времени.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 10.05.2005 (Вт) 16:57

Разрешите присоединиться к обсуждению.
Прикольно. Я уже подумываю о создании мастера для "жонглирования данными".
Есть несколько замечаний:
Код: Выделить всё
With ActiveWindow
        .Top = 25
        .Left = 25
        .Width = 400
        .Height = 150
    End With
у меня вылетает с ошибкой т.к. смотрю листы раскрытыми на полный экран.

И вот здесь
Терминатор писал(а):То всё пропало...
А если Set ListOne = Лист1.[A2:A500]
будет равен = Лист1.[A2:A65536]
Тогда можно вообще про всё забыть
и идти курить бамбук...
Хотя с самого начала я думал только о диапазоне "A2:A65536"
Вот поэтому-то я и ищю другое решение.
Иначе с такой скоростью можно только..., ну, я даже и не знаю что можно делать.


Диапазон вполне рабочий, но для его работы нужно хорошее железо, и если таких данных много, то железо необходимо отличное.
Из личного опыта:
построчная обработка диапазона порядка 25000 - 30000 строк, с результатом в новой книге порядка 50000 - 60000 строк, занимает примерно 30 минут на 4 пне с 512Мб ОЗУ. И там куда я делал это вполне довольны результатом, потому что иначе это делалось бы вручную. И там-же, задержку работы автофильтра на полном листе данных вполне понимают и не переживают.

Удачи!
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 10.05.2005 (Вт) 20:37

Терминатор писал(а):

Ну ты Игорь дал!. Не, я мужского пола. :shock:
По поводу ошибки, ты прав, но мой релиз ещё в переди, он будет без ошибок. По поводу скористи не согласен. Код должен работать на любой тачке. А аргумент, что в ручную это ещё дольше, хорошо звучит, я так и буду на работе говорить, а то заколебали уже совсем.
Но это для них. А для нас это не подход.

...ухм! Птичка-невеличка :lol: , я бы точно не догодался что делить надо на 24. Ну если только к утру, хотя вчера почти до утра так и просидел, больно интересно было всё попробовать.
Почти всё готово, уважаемый uhm, я написать Вам хотел, однако адреса Вашего не увидел. Просто поделиться хотел, что получилось из всего этого.
Если успею сегодня, тогда адрес на файл тут оставлю, если нет, то выслал бы Вам на почту, а то завтра на работе буду, может так и не удастся на форум зайти от туда. Сисадмин просёк что я часто в инете сижу, заблокировал, нехороший человек...
А проблема одна ещё не решенная осталась. Почти мелочь. Время это ведь 12: 30 или 10:15, так вот чтоб всё по уму было, хочу чтоб это значение учитывалось. Значение вывисти удалось в TexBox, и в ячейку тоже. Но на этом всё закочилось. Автофильтр не видит значений после знака : , то есть минут. Но ведь он должен.! Ох как он мне должен! (понятное дело, что-то я не учёл, где-то промахнулься)
:lol: Надеюсь делить в этом случае не надо. :P

Эх, сбросить бы мне годков эдак 25-30, я б с удовольствием учится заново пошёл.
Hasta la vista, baby!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 11.05.2005 (Ср) 9:55

Пусть тот кто скажет, что ты Изображение женщина, кинет в меня камень. :wink:

Код и так работает на любой тачке.
igor_123 писал(а):построчная обработка диапазона порядка 25000 - 30000 строк, с результатом в новой книге порядка 50000 - 60000 строк, занимает примерно 30 минут на 4 пне с 512Мб ОЗУ.

У меня дома пень 133Мг было 32Мб ОЗУ, так на ней работа растягивалась на 2 - 3 часа.

Теперь по поводу времени:
Код: Выделить всё
    Selection.AutoFilter Field:=2, Criteria1:=">=9:00", Operator:=xlAnd, _
        Criteria2:="<=13:00"

Вот это я записал макросом на примере твоего файла, что мешает сделать так-же?

Терминатор писал(а):Эх, сбросить бы мне годков эдак 25-30, я б с удовольствием учится заново пошёл.

:D Не понятно, кто мешает. Учиться никогда не поздно!
Меня всегда страшил момент, когда я решу что учиться уже поздно :cry: . Мне кажеться тогда я стану старым. Но растет сын, которого я хочу научить всему, что знаю сам, и в процессе обучения сына, я буду учиться и сам.
Так, что
Народная мудрость писал(а):Бороться и искать! Найти и перепрятать!!! :D
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 11.05.2005 (Ср) 20:45

Igor , По поводу подростающего поколения (сына) ты в точку попал. Оно, подастающее поколение, подстёгивает, не даёт на лаврах почивать, а порой наши лавры уже сами по себе не лавры, покрайней мере для них -
http://terminatorium.narod.ru/Images/Mm_image/t2_19.jpg
но мы то знаем, что если понадобится, то можем иногда и стариной тряхнуть -
http://terminatorium.narod.ru/Images/Mm_image/t2_20.jpg

По поводу железа. Я думаю что самый быстрый комп вот этот,
правда в продаже он появится не скоро, но обещают. По крайней мере фото уже сделали - http://terminatorium.narod.ru/Images/Mm_image/t3_59.jpg

Ах да про код...
http://www.webfile.ru/298092
Это конечно не релиз, но уже поближе, будь внимателен, посмотри, время выбирается точно например с 10:30 по 17:30
но фильтруется не коректно, то есть минуты не учитываются. Я даже знаю из-за чего
но не знаю как исправить.
Для выбора часов или минут просто кнопочки понажимай, быстро догадаешься какая к какой относится.
:arrow: Ну так что :?:

Ухм, Вы где? ( с птичкой который) :lol:
Hasta la vista, baby!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.05.2005 (Чт) 11:35

Прикольное собрание кадров!!!
Эх какое время было, пойти в видеосалон на 11 часовой сеанс, что-бы посмотреть Коммандо или Хищника или Школу стюардес. Да много чего!
Спасибо за поддержаное настроение, надеюсь ответить тем-же:
В модуле объявлено
Код: Выделить всё
Public FirstHour As String * 5
Public LastHour As String * 5

и при построении отчета получаем:
Код: Выделить всё
FirstHour = ">=" & UserForm1.OptionButton1.Caption

т.е. значение переменной должно быть такое:
">=14:35" - 7 символов, а обрезаеться до 5 символов.
Вот и вся проблема.

И мне показался удобнее предыдущий вариант интерфейса.

Удачи
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 12.05.2005 (Чт) 16:45

Просто нет слов.! (это по поводу моей ошибки)

Наверное как в известном тебе фильме, когда дело близилось к концу, прозвучала фраза -
"Стареешь Джон, стареешь..."

Так и у меня. Вниматильность уже не та... :(
Спасибо.
Hasta la vista, baby!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.05.2005 (Чт) 17:06

В известном тебе мультфильме прозвучала фраза:
"Ты ещё крепкий старик Розен Бом"
а в каком-то известном фильме:
"Побольше-бы таких стариков как ты" :wink:

Так что во-первых никакой ты не старик, и до старости ещё далеко!!!
нечего раньше времени себя хоронить. А во-вторых каждая понятая и исправленная нами ошибка делает нас опытнее, а некоторых и мудрее :D
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч


Вернуться в VBA

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

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

    TopList  
cron