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

Скрыть несколько строк

11.10.2018, 09:16. Показов 11623. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Уважаемые форумчане, помогите неразумному.
Вроде все подобные темы просмотрел, но так сделать и не получилось, ввиду своей далекости от данной темы.
Задача тривиальная, необходимо скрыть строки Excel, при помощи макроса:
При условии что в ячейке "А1" значение =1, то необходимо скрыть строки 2:10 , 12:20, 30:40 на листе 1;
При условии что в ячейке "А1" значение =2, то необходимо скрыть строки 5:8 на листе 1;
При условии что в ячейке "А1" значение =3, то необходимо скрыть строки 2:10 и столбцы 2:10 на листе 2.
Трудности возникают при скрытии одинаковых строк при разных условиях (строки 5:8 по условию 2, входят в 2:10 по условию 1)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2018, 09:16
Ответы с готовыми решениями:

Скрыть несколько полей
Вечер добрый. Прошу подсказать, как правильно перечислить поля в VBA ? Ниже пример, который...

Записать в файл несколько строк, а затем записать несколько строк из этого файла в другой
Заранее создать текстовый файл 1.txt и записать в него несколько строк текста. Программа должна...

Скрыть несколько TextBox
Вопрос! как мне сделать для других TextBox чтоб тоже они пропадали при нажатии? private void...

Скрыть несколько столбцов
Здравствуйте, помогите пожалуйста скрыть несколько столбцов, сейчас закрывается только 1 пара,...

20
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
11.10.2018, 11:09 2
Добрый день.
Какие могут быть трудности, когда условия не пересекаются? Отображаете всё, затем скрываете ненужное.
0
0 / 0 / 0
Регистрация: 11.10.2018
Сообщений: 6
11.10.2018, 11:54  [ТС] 3
Когда значение "2" - скрываются строки 5:8
Когда же значение "1" скрываются 12:20, 30:40, а из диапазона 2:10, скрываются строки 2:4, 9:10. А строки 5:8 Остаются раскрытыми.
Меня хватило только вот на это:

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
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Target = "1" Then
            Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = True
        Else
            Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = False
        End If
    End If
If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Target = "2" Then
            Sheets("Лист1").[5:8].EntireRow.Hidden = True
        Else
            Sheets("Лист1").[5:8].EntireRow.Hidden = False
        End If
    End If
If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Target = "3" Then
            Sheets("Лист2").[2:10].EntireRow.Hidden = True
            Sheets("Лист2").[2:10].EntireColumn.Hidden = True
        Else
            Sheets("Лист2").[5:8].EntireRow.Hidden = False
            Sheets("Лист2").[2:10].EntireColumn.Hidden = False
        End If
    End If
End Sub
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
11.10.2018, 12:05 4
Так сперва открываете всё, затем скрываете по условию, удобнее использовать select case.
0
0 / 0 / 0
Регистрация: 11.10.2018
Сообщений: 6
11.10.2018, 12:16  [ТС] 5
Если все сперва открыто, а потом в А1 выставить значение "1" строки 5:8 при этом по неведомой мне причине не скрываются.
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
11.10.2018, 14:15 6
Georgiy11,
Цитата Сообщение от Georgiy11 Посмотреть сообщение
выставить значение "1" строки 5:8 при этом по неведомой мне причине не скрываются.
да причина то ведома, смотрите внимательно, что вы написали во втором If - будет скрытие при А1=2, а вам хочется при А1=1, тогда так и пишите.
Но, конечно с интерсектами перемудрено, во-первых вполне достаточно одного на все три блока, во-вторых можно в начале Sub просто поставить If Target.Address(0,0) <> "A1" then exit Sub и выкинуть все интерсекты
0
0 / 0 / 0
Регистрация: 11.10.2018
Сообщений: 6
11.10.2018, 14:45  [ТС] 7
Перемудрено от незнания, нахватал из похожих тем. А хочется чтоб при А1 значении «1» скрывались строки 2:10, а при значении «2» только строки 5:8. Так вот, при значении «1» строки 5:8 из диапазона 2:10 не скрываются(т.е. строки 2,3,4,9,10 скрылись, а 5:8 нет), а при значении «2» работает правильно. Попробую к Вы сказали оптимизировать, может поможет, спасибо
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
11.10.2018, 15:48 8
Georgiy11, ну я же писал. почему так происходит, смотрите свой код внимательнее. В первом блоке 5:8 прячутся т.к. входят в диапазон 2:10, но затем во втором блоке 5:8 снова открываются.
Может вам лучше подойдет структура If .... Then.... Elseif ,,, Endif Чтобы при выполнении А1=1 следующие ветки не рассматривались?

Добавлено через 29 минут
например, для условий первого листа это можно записать так
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
      If Target = 1 Then
        Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = True
      Else
        Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = False
        If Target = 2 Then Sheets("Лист1").[5:8].EntireRow.Hidden = True
      End If
    End If
End Sub
0
0 / 0 / 0
Регистрация: 11.10.2018
Сообщений: 6
11.10.2018, 15:55  [ТС] 9
Теперь я понял Вас, спасибо. Действительно, необходимо просто убрать строку которая открывает строки 5:8 при значении 2

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address <> "$A$1" Then Exit Sub
     If Target = 1 Then
     Sheets("Лист").[2:10,12:20,30:40].EntireRow.Hidden = True
     Else
     Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = False
    End If
    If Target = 2 Then
     Sheets("Лист1").[5:8].EntireRow.Hidden = True
       End If
End Sub
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
11.10.2018, 16:05 10
Лучший ответ Сообщение было отмечено Georgiy11 как решение

Решение

А можно ещё компактнее
Visual Basic
1
2
3
4
If Not Intersect(Target, Range("A1")) Is Nothing Then
      Sheets("Лист1").[2:10,12:20,30:40].EntireRow.Hidden = (Target = 1)
      If Target = 2 Then Sheets("Лист1").[5:8].EntireRow.Hidden = True
End If
1
0 / 0 / 0
Регистрация: 11.10.2018
Сообщений: 6
11.10.2018, 16:59  [ТС] 11
Буду экспериментировать, спасибо за ответ!
0
2 / 2 / 0
Регистрация: 29.04.2015
Сообщений: 278
12.03.2019, 10:25 12
Burk, Hugo121, Добрый день.

Я искала решение своей проблемы, увидела, что вы в макросах вроде разбираетесь, хотела бы спросить, если можно.

Я вообще в макросах не разбираюсь, но появилась необходимость использовать. Нужно было в очень большой таблице скрывать нужные месяцы. Вручную это занимает очень много времени так как повторение месяцев идет больше 100 раз.

Нашла в интернете макрос, что скрывал бы отмеченные столбцы :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Hide()
    Dim cell As Range
    Application.ScreenUpdating = False                              'отключаем обновление экрана для ускорения
    For Each cell In ActiveSheet.UsedRange.Rows(1).Cells            'проходим по всем ячейкам первой строки
        If cell.Value = "x" Then cell.EntireColumn.Hidden = True    'если в ячейке x - скрываем столбец
    Next
    For Each cell In ActiveSheet.UsedRange.Columns(1).Cells         'проходим по всем ячейкам первого столбца
        If cell.Value = "x" Then cell.EntireRow.Hidden = True       'если в ячейке x - скрываем строку
    Next
    Application.ScreenUpdating = True
End Sub
 
Sub Show()
    Columns.Hidden = False   'отменяем все скрытия строк и столбцов
    Rows.Hidden = False
End Sub
Но так как у меня условие это название месяца, я немного исправила, руководствуясь просто логикой:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Hide()
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange.Rows(1).Cells
        If cell.Value = "Январь" Then cell.EntireColumn.Hidden = True
        If cell.Value = "Февраль" Then cell.EntireColumn.Hidden = True
    Next
    Application.ScreenUpdating = True
End Sub
 
Sub Show()
    Columns.Hidden = False
    Rows.Hidden = False
End Sub
Теперь отображать месяца все он отображает, но нужное не скрывает.
Подскажите, пожалуйста, что я сделала не так?
Заранее спасибо!
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
12.03.2019, 10:28 13
Думаю что cell.Value <> "Январь"
Попробуйте cell.Text = "Январь"
1
95 / 38 / 15
Регистрация: 02.04.2015
Сообщений: 235
12.03.2019, 10:28 14
Veronka, Файл прикрепите
0
2 / 2 / 0
Регистрация: 29.04.2015
Сообщений: 278
12.03.2019, 10:34 15
Петр Аркадьевич, не могу, слишком большой размер файла

Цитата Сообщение от Hugo121 Посмотреть сообщение
Думаю что cell.Value <> "Январь"
Попробуйте cell.Text = "Январь"
--- попробовала заменить - не помогло. В чём ещё может быть дело?
0
2 / 2 / 0
Регистрация: 29.04.2015
Сообщений: 278
12.03.2019, 10:41 16
Петр Аркадьевич, Вот почти всё удалила, но смысл будет понятен, я думаю.
Вложения
Тип файла: xlsx пример.xlsx (84.0 Кб, 13 просмотров)
0
3911 / 2311 / 782
Регистрация: 02.11.2012
Сообщений: 6,147
12.03.2019, 10:44 17
в xlsx макросы не живут.
0
2 / 2 / 0
Регистрация: 29.04.2015
Сообщений: 278
12.03.2019, 10:48 18
Vlad999, сохранила с поддержкой макросов. не даёт прикрепить. пишет не корректный файл.
0
3911 / 2311 / 782
Регистрация: 02.11.2012
Сообщений: 6,147
12.03.2019, 10:48 19
Visual Basic
1
For Each cell In ActiveSheet.UsedRange.Rows(1).Cells
это цикл по первой строке данных листа, в вашем случае это строка 1, а там нет месяцев.
1
2 / 2 / 0
Регистрация: 29.04.2015
Сообщений: 278
12.03.2019, 10:51 20
Vlad999, точно, заработало. Сменила 1 на 4 и всё скрылось)

Спасибо огромное!
0
12.03.2019, 10:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2019, 10:51
Помогаю со студенческими работами здесь

скрыть несколько объектов на странице
возникла очередная проблема: необходимо скрыть несколько объектов на странице(лейблы и течт...

Скрыть и отобразить несколько DataGridView
Добрый день! Так как с vb.net начал работать относительно недавно столкнулся с проблемкой: Есть...

Скрыть сразу несколько блоков (javascript)
Здравствуйте! Скажите пожалуйста как можно с помощью события onclick скрыть несколько блоков div...

Как скрыть несколько элементов кнопками
Мне надо скрывать несколько див элементов с помощью кнопок (что бы каждая кнопка скрывала свой...


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

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