Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Создать массив для цикла и скрыть строки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Создать массив для цикла и скрыть строки (Макросы/Sub)
Создать массив для цикла и скрыть строки
Olena Дата: Среда, 18.01.2023, 15:19 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 1 ±
Замечаний: 0% ±

Доброго времени. Подскажите пожалуйста по массивам, они мне ну просто не даются, что то с трудом нацарапаю и то не особо правильно.
Есть таблица с огромным количеством строк от 40тыс., тот макрос что я написала конечно работает, но очень уж долго.
Помогите пожалуйста как можно написать массив и потом по его результату скрыть строки. Была бы вам признательна если бы с комментариями. Очень мало знаний в массивах(
Макрос который использую
[vba]
Код
Sub sdf()
x = Cells(Rows.Count, 15).End(xlUp).Row
Dim i&
    For i = 8 To x
        If Range("o" & i).Value <> "" Then
            Rows(i).EntireRow.Hidden = True
        Else: Rows(i).EntireRow.Hidden = False '
        End If
    Next
   End Sub
[/vba]
Под него у меня и обработчики подсоеденины. Но очень уж долго этот цикл работает.
К сообщению приложен файл: TEST.xls(73.5 Kb)


Сообщение отредактировал Olena - Среда, 18.01.2023, 15:29
 
Ответить
СообщениеДоброго времени. Подскажите пожалуйста по массивам, они мне ну просто не даются, что то с трудом нацарапаю и то не особо правильно.
Есть таблица с огромным количеством строк от 40тыс., тот макрос что я написала конечно работает, но очень уж долго.
Помогите пожалуйста как можно написать массив и потом по его результату скрыть строки. Была бы вам признательна если бы с комментариями. Очень мало знаний в массивах(
Макрос который использую
[vba]
Код
Sub sdf()
x = Cells(Rows.Count, 15).End(xlUp).Row
Dim i&
    For i = 8 To x
        If Range("o" & i).Value <> "" Then
            Rows(i).EntireRow.Hidden = True
        Else: Rows(i).EntireRow.Hidden = False '
        End If
    Next
   End Sub
[/vba]
Под него у меня и обработчики подсоеденины. Но очень уж долго этот цикл работает.

Автор - Olena
Дата добавления - 18.01.2023 в 15:19
Kuzmich Дата: Среда, 18.01.2023, 15:33 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 706
Репутация: 154 ±
Замечаний: 0% ±

Excel 2003
А не пробовали в начало кода вставить
[vba]
Код
Application.ScreenUpdating = False
[/vba]
и в конце
[vba]
Код
Application.ScreenUpdating = True
[/vba]
 
Ответить
СообщениеА не пробовали в начало кода вставить
[vba]
Код
Application.ScreenUpdating = False
[/vba]
и в конце
[vba]
Код
Application.ScreenUpdating = True
[/vba]

Автор - Kuzmich
Дата добавления - 18.01.2023 в 15:33
Olena Дата: Среда, 18.01.2023, 15:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 1 ±
Замечаний: 0% ±

А не пробовали в начало кода вставить

Спасибо, в проекте так и написано, там еще попутно обработчики есть. Поэтому без этого увы никак)
 
Ответить
Сообщение
А не пробовали в начало кода вставить

Спасибо, в проекте так и написано, там еще попутно обработчики есть. Поэтому без этого увы никак)

Автор - Olena
Дата добавления - 18.01.2023 в 15:35
Pelena Дата: Среда, 18.01.2023, 15:39 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 18707
Репутация: 4260 ±
Замечаний: ±

Excel 2016 & Mac Excel
Можно так попробовать
[vba]
Код
Sub sdf()
    x = Cells(Rows.Count, 15).End(xlUp).Row
    Dim i&, rng As Range
    For i = 8 To x
        If Range("o" & i).Value <> "" Then
            If rng Is Nothing Then Set rng = Rows(i) Else Set rng = Union(rng, Rows(i))
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Hidden = True
End Sub
[/vba]
или с массивом
[vba]
Код
Sub sdf()
    Dim x&, i&, rng As Range, arr
    x = Cells(Rows.Count, 15).End(xlUp).Row
    arr = Range(Cells(1, 1), Cells(x, 15)).Value
    For i = 8 To x
        If arr(i, 15) <> "" Then
            If rng Is Nothing Then Set rng = Rows(i) Else Set rng = Union(rng, Rows(i))
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Hidden = True
End Sub
[/vba]

Но быстрее всего строки скрываются фильтром. Запишите макрорекодером - будет макрос


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеМожно так попробовать
[vba]
Код
Sub sdf()
    x = Cells(Rows.Count, 15).End(xlUp).Row
    Dim i&, rng As Range
    For i = 8 To x
        If Range("o" & i).Value <> "" Then
            If rng Is Nothing Then Set rng = Rows(i) Else Set rng = Union(rng, Rows(i))
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Hidden = True
End Sub
[/vba]
или с массивом
[vba]
Код
Sub sdf()
    Dim x&, i&, rng As Range, arr
    x = Cells(Rows.Count, 15).End(xlUp).Row
    arr = Range(Cells(1, 1), Cells(x, 15)).Value
    For i = 8 To x
        If arr(i, 15) <> "" Then
            If rng Is Nothing Then Set rng = Rows(i) Else Set rng = Union(rng, Rows(i))
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Hidden = True
End Sub
[/vba]

Но быстрее всего строки скрываются фильтром. Запишите макрорекодером - будет макрос

Автор - Pelena
Дата добавления - 18.01.2023 в 15:39
Nic70y Дата: Среда, 18.01.2023, 16:14 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 8005
Репутация: 1949 ±
Замечаний: 0% ±

Excel 2010
если задача именно оставить пустые ячейки, где
Код
=ЕПУСТО()=ИСТИНА
предлагаю такой вариант:
[vba]
Код
    x = Cells(Rows.Count, 15).End(xlUp).Row
    Range("o3:o" & x).EntireRow.Hidden = False
    Range("o3:o" & x).SpecialCells(xlCellTypeConstants, 23).EntireRow.Hidden = True
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщениеесли задача именно оставить пустые ячейки, где
Код
=ЕПУСТО()=ИСТИНА
предлагаю такой вариант:
[vba]
Код
    x = Cells(Rows.Count, 15).End(xlUp).Row
    Range("o3:o" & x).EntireRow.Hidden = False
    Range("o3:o" & x).SpecialCells(xlCellTypeConstants, 23).EntireRow.Hidden = True
[/vba]

Автор - Nic70y
Дата добавления - 18.01.2023 в 16:14
Olena Дата: Среда, 18.01.2023, 16:22 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 1 ±
Замечаний: 0% ±

Можно так попробовать

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

О таком решении не читала, сейчас посмотрим будет ли на большом объеме подвисать, надо проверить)
Всем благодарна за советы.
 
Ответить
Сообщение
Можно так попробовать

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

О таком решении не читала, сейчас посмотрим будет ли на большом объеме подвисать, надо проверить)
Всем благодарна за советы.

Автор - Olena
Дата добавления - 18.01.2023 в 16:22
Nic70y Дата: Среда, 18.01.2023, 16:29 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 8005
Репутация: 1949 ±
Замечаний: 0% ±

Excel 2010
Olena, файл прикрепил,
кнопка U_700
К сообщению приложен файл: TEST.xlsm(144.6 Kb)


ЮMoney 41001841029809
 
Ответить
СообщениеOlena, файл прикрепил,
кнопка U_700

Автор - Nic70y
Дата добавления - 18.01.2023 в 16:29
Olena Дата: Среда, 18.01.2023, 16:33 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 1 ±
Замечаний: 0% ±

arr = Range(Cells(1, 1), Cells(x, 15)).Value

Елена, т.е. для массива достаточно указать начало (откуда) и конец(до куда брать данные), как типа таблицу?
и еще пожалуйста, что значит [vba]
Код
Is Nothing
[/vba] я сколько читала, ну ничего не поняла.
 
Ответить
Сообщение
arr = Range(Cells(1, 1), Cells(x, 15)).Value

Елена, т.е. для массива достаточно указать начало (откуда) и конец(до куда брать данные), как типа таблицу?
и еще пожалуйста, что значит [vba]
Код
Is Nothing
[/vba] я сколько читала, ну ничего не поняла.

Автор - Olena
Дата добавления - 18.01.2023 в 16:33
Pelena Дата: Среда, 18.01.2023, 16:40 | Сообщение № 9
Группа: Админы
Ранг: Местный житель
Сообщений: 18707
Репутация: 4260 ±
Замечаний: ±

Excel 2016 & Mac Excel
Is Nothing - это пустая переменная Range.
То есть если в переменной rng пусто, то мы просто присваиваем ей значение строки Row(i), а если там уже что-то есть, то добавляем через Union ещё одну строку.
Таким образом, объединяем все строки с выполненным условием, и потом одним махом их скрываем


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеIs Nothing - это пустая переменная Range.
То есть если в переменной rng пусто, то мы просто присваиваем ей значение строки Row(i), а если там уже что-то есть, то добавляем через Union ещё одну строку.
Таким образом, объединяем все строки с выполненным условием, и потом одним махом их скрываем

Автор - Pelena
Дата добавления - 18.01.2023 в 16:40
Olena Дата: Среда, 18.01.2023, 17:15 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 1 ±
Замечаний: 0% ±

Всем огромное спасибо и хорошего вечера)
 
Ответить
СообщениеВсем огромное спасибо и хорошего вечера)

Автор - Olena
Дата добавления - 18.01.2023 в 17:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Создать массив для цикла и скрыть строки (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2023 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!