Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/92: Рейтинг темы: голосов - 92, средняя оценка - 4.72
2 / 2 / 0
Регистрация: 24.07.2013
Сообщений: 54
1

И опять работа только с видимыми ячейками

25.09.2013, 16:31. Показов 17124. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем)

Хочу после применения автофильтра занести в массив только видимые ячейки
Visual Basic
1
otfil = Range(Cells(10, 1), Cells(last, 1)).SpecialCells(xlCellTypeVisible)
Но,проблема в том, что после применения фильтра может получиться ситуация как на картинке


в этом случае в массив заносятся данные только до 57 строки, что нужно сделать чтобы заносились все??
Миниатюры
И опять работа только с видимыми ячейками  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2013, 16:31
Ответы с готовыми решениями:

Как сделать видимыми только 3 новости?
У меня есть вопросик! Есть сайдбарчик и в нем разные новости с разными категориями... Как сделать...

Работа c .doc(word). Сделать границы созданной таблицы видимыми
Доброго времени суток. Написал создание файла .doc. создал в нем таблицу, заполнил ее значениями из...

Работа с ячейками
Нужно затабулировать изменение ячейки. Но: Пример INITIAL X1 14 MIY TABLE X1,0,3,5 GENERATE...

Работа с ячейками
Как узнать какая ячейка выделена на определенном листе Excel в VBA?

14
1589 / 662 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
25.09.2013, 17:17 2
Используйте цикл
Visual Basic
1
2
For Each Cell in Range(Cells(10, 1), Cells(last, 1)).SpecialCells(xlCellTypeVisible)
...
1
2 / 2 / 0
Регистрация: 24.07.2013
Сообщений: 54
25.09.2013, 17:48  [ТС] 3
спасибо)

хотелось правда без цикла (просто размера массива заранее даже не знаю), но наверно так не получиться
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
25.09.2013, 17:58 4
Да, одним движением массив из SpecialCells(xlCellTypeVisible) не получается, тоже сталкивался.
А жаль...
Недоработали...
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
25.09.2013, 21:23 5
Я так выхожу с этого (результаты будут в mARR):
Заменил. См. ниже.

Добавлено через 2 часа 49 минут
Под конец дня все бегом... Не заметил, что Вас там интересует только 1-й ст. Тогда уточняю (и прописываю last, что б застраховаться):
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub afterAutoFilter()
 Dim mRNG As Range, mARR(), last&, LastCol&
   with activesheet
      last=.usedrange.row-1 + .usedrange.rows.count
      lastCol=.usedrange.column-1 + .usedrange.columns.count
   end with
   Set mRNG =range(cells(10,1), cells(last, lastCol))
   mRNG.columns(1).SpecialCells(xlCellTypeVisible).Copy
   With Workbooks.Add(xlWBATWorksheet).Sheets(1)
      ActiveSheet.Paste: Application.CutCopyMode = False
      mARR= .UsedRange.Value: .Parent.Close 0
   End With
End Sub
1
2 / 2 / 0
Регистрация: 24.07.2013
Сообщений: 54
26.09.2013, 09:26  [ТС] 6
оо,Игорь,спасибо вам)
у меня тоже была мысль с копированием,правда на скрытый лист какой-нибудь)

Добавлено через 8 минут
я кстати поставила таймер, на ваш вариант и вариант с циклом, с циклом чуть-чуть быстрее получается)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.09.2013, 09:34 7
Можна и на скрытый, но считаю - лишние действия. Здесь лист создался, принял, отдал в массив и закрылся без сохранения. И забыл. Там пропишите в процедуру application.screenupdating=false/true, не помешает. Тогда будет быстрее. Но и цикл - неплохо.
Но если совсем честно, то стараюсь в процедурах не использовать autofilter. Нудный он, медленный, не на мой темперамент.

Добавлено через 7 минут
Вот не проснулся еще, наверно... Забыл еще добавить - использую на лист в основном в тех случаях, если результаты нужно еще и посортировать (а оригиналы оставить как есть).
0
2 / 2 / 0
Регистрация: 24.07.2013
Сообщений: 54
26.09.2013, 10:20  [ТС] 8
Да, мне тоже автофильтр не особо нравиться, просто это было первое и самое простое, что пришло в голову)

Я бы вообще эту часть из основной своей программы убрала, она мне не нравиться, без нее гораздо лучше всё было

Но нет же, надо говорят это и всё тут, и никуда не денешься)И сижу вот уже кучу времени, переделываю готовую,рабочую программу! (так как дававшая мне задание, неожиданно!! вспомнила о существовании еще парочки условий)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.09.2013, 10:29 9
Ну да, все от условий. Я бы просто тупо в начало процедуры вставил application.inputbox (type:=8), указал мышью ячейки с нужными, заменил autofilter словарем (или advancedfilter) - и все бы улетело. Но если нужна сортировка, все-таки использовал Workbooks.Add(xlWBATWorksheet).Sheets(1)... Мне autofilter хороший только в ручном режиме.
0
2 / 2 / 0
Регистрация: 24.07.2013
Сообщений: 54
26.09.2013, 10:49  [ТС] 10
Я прям задумалась после вашего сообщения, чую что накрутила у себя в программе много всякого ненужного и лишних сложностей. Но, это мой еще совсем маленький опыт в этом виновен, а переделывать уже не хочется)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.09.2013, 10:58 11
А что там думать. Все зависит от того, сколько из сколько нужно выбрать и передать машине. Если у Вас ~ 10000 записей из 100 оригинальных раскиданных, а нужно выбрать 50 - то, думаю, все таки нужет autofilter в ручном, а дальше листинг. А если нужно только ~ 5 - 10, тогда другое дело. Может и SQL запросом... Все упирается в то, как показать машине что Вам нужно. А дальше - чепуха.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
26.09.2013, 12:36 12
Кстати вот как раз сегодня было обсуждение "у соседей за стенкой" - думаю могу сюда цитату запостить, раз уж речь об уникальных:
Смотрю пример - сразу напрашивается фильтр.
Но проще как начинающему делать так:
циклом по исходному диапазону (или массиву) собираем словарь уникальных значений, каждому новому в item кладём увеличивающийся счётчик (начинаем с 2).
Но сперва проверка - если уникального ещё нет в словаре - заносим в словарь, на лист этого счётчика в первую свободную строку копируем текущую строку.
Если уже есть - извлекаем счётчик-номер листа из словаря, на лист этого счётчика в первую свободную строку копируем текущую строку.
Вот такая схема.
Можно использовать массив при чтении/анализе диапазона, можно использовать массивы и при копировании, но это расточительно по использованию памяти - нужно на каждое уникальное значение создать массив размером с исходный (чтоб точно хватило места), держать его в словаре вместе с счётчиком заполненных строк.
На примере таких всего 2, но представьте что на листе 10000 строк, и там например 100 уникальных - значит нужно будет 100 массивов по 10000 строк!
Или тогда такой ход - сперва анализ всего массива данных, сразу каждому уникальному собираем коллекцию номеров отбираемых строк (коллекция наращивается в процессе).
Затем уже цикл по словарю - создаём массив по размеру очередной коллекции, циклом по коллекции копируем данные из одного массива (исходного) в созданный, выгружаем массив на очередной лист.
Вот так будет и быстро, и на массивах/словарях/+коллекциях
2
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.09.2013, 12:58 13
Все правильно. Я еще только имел ввиду, что, если всего много, и уникальных тоже, и из этих уникальных нужно "в отчет" тоже много выбрать, то, наверное, делал бы где-то так: запустил вручную autofilter, указал нужные, запустил листинг (пуск под правую кнопку в shortcut menu), вытянул уникальные в массив (но там все равно бутут повторы) из массива опять уникальные - и загнал в критерии. А дальше - уже просто техника. Но жизнь бы показала. Или как делать, или откуда ноги...
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
26.09.2013, 13:01 14
Вот кстати там и код написал:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Option Explicit
 
Sub tt()
    Dim a(), i&, t$
    Dim k, el
 
    With CreateObject("Scripting.Dictionary"): .comparemode = 1
 
        'собираем словарь
        a = Range([F1], Range("F" & Rows.Count).End(xlUp)).Value
        For i = 2 To UBound(a)
            t = a(i, 1)
            ' если нет в словаре, добавляем с коллекцией
            If Not .exists(t) Then .Add t, New Collection
            .Item(t).Add i    'в коллекцию критерия добавляем номер строки
        Next
 
        'смотрим что собралось - вместо "смотрим" можно сразу и копировать
        For Each k In .keys
            For Each el In .Item(k)
                Debug.Print k & " - " & el
            Next
        Next
    End With
 
End Sub
Отбор уникальных по F, шапку не учитываем.
0
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 2
30.07.2015, 17:05 15
Попробуйте проверку значения
Visual Basic
1
 cell.Rows.Hidden = False
0
30.07.2015, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2015, 17:05
Помогаю со студенческими работами здесь

Работа с ячейками
Интересует такой вопрос, каким способом отлавливать изменения в ячейках? Допустим дано 3 ячейки,...

Замена батареи с 6 ячейками на батарею с 12 ячейками для HP Pavilon g6
Назрел вопрос замены батареи в ноутбуке HP Pavilon g6, старая держит только 15 минут. По разным...

Работа с ячейками StringGrid
Как занести значение переменной в ячейку StringGrid из переменной?

StringGrid работа с ячейками
Доброе время . Решил сделать кодер изображений для вывода их на различные дисплеи с помощью мк. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru