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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2010, 17:24   #1
Kate-Rina
 
Регистрация: 31.03.2010
Сообщений: 3
Смущение доработка макроса

Еще раз обращаюсь за помощью.

помогите доработать макрос, пожалуйста)

Идея такая:
Лист проверка - идеальный вариант блоков, относительно которого идет сравнение блоков регионов.
Лист Невыходы блоков - результат- сюда добавляются данные из листа Проверка, отсортированные по столбцу 15 -непустые.

в данный момент: вручную на листе Блоки регионы надо отсортировать сначала первый регион, потом запустить макрос, потом вручную снова отфильтровать следующий регион и тд.

нужно: чтобы это происходило автоматически.
возможно такое?

спасибо
Вложения
Тип файла: rar Test.rar (576.0 Кб, 12 просмотров)
Kate-Rina вне форума Ответить с цитированием
Старый 02.04.2010, 05:33   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Не путайте сортировку с фильтрацией. Вас трудно понять.
2. В приложенном Вами файле большое количество формул. Поэтому, каждый раз при открытии, сохранении и т.п., а также после выполнения каких-либо действий макросом, Excel пересчитывает ячейки. А это очень долго.
3. Пример в виде рабочего файла приложить не могу, ибо у Вас в файле (в формулах и макросах) есть ссылки на несуществующую (у меня) книгу. Поэтому, предлагаю попробовать такой код:
Код:
Sub Main()
    Dim i As Long, x As New Collection, a()
    Application.Calculation = xlManual: Application.ScreenUpdating = False
    Sheets("блоки регионы").Activate
    a = Range([B2], Cells(Rows.Count, 2).End(xlUp)).Value: On Error Resume Next
    For i = 1 To UBound(a, 1)
        If a(i, 1) <> "" Then x.Add a(i, 1), CStr(a(i, 1))
    Next: On Error GoTo 0
    If x.Count > 1 Then
        For i = 1 To x.Count
            [A:K].AutoFilter Field:=2, Criteria1:=x(i)
            KopirLong 'Запуск Вашего макроса
        Next: ActiveSheet.ShowAllData
    End If
     Application.Calculation = xlAutomatic: Application.ScreenUpdating = True
End Sub
Небольшие пояснения:
а) Запрещаем пересчет ячеек и обновление экрана.
б) Создаем массив a из значений столбца "B", ибо с элементами массива работать существенно быстрее, чем с ячейками рабочего листа.
в) Создаем коллекцию x, содержащую уникальные (неповторяющиеся) значения из массива a.
г) Организуем цикл, в котором поочередно применяем автофильтр по столбцу "B" с критериями из коллекции x. При этом, после каждой фильтрации запускаем Ваш макрос (в примере кода это "KopirLong". А какой нужно, Вы не оговариваете).
д) Разрешаем пересчет ячеек и обновление экрана. Именно в этот момент времени Excel на некоторое время "задумается" (см. п.2)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 02.04.2010 в 07:21.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка программы akialex Помощь студентам 3 24.12.2009 21:09
Доработка A93 Общие вопросы C/C++ 4 28.11.2009 13:29
Доработка портала muh Фриланс 1 29.09.2009 21:31
Запуск макроса с параметрами из другого макроса Saladin Microsoft Office Excel 2 19.01.2009 09:43
доработка алгоритма... Sota Помощь студентам 2 13.06.2008 15:45