Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Скрыть одинаковые столбцы в каждом из необходимых листов макросом, Скрыть столбцы в каждом из листов
 
Подскажите, как решить следующую задачу:
Есть книга, в которой 100 листов.
Необходимо нажатием первой кнопки скрыть первые 5 столбцов в каждом из 100 листов.
Нажатием второй кнопки необходимо показать все скрытые столбцы в каждом из листов.

В идеале - данные действие произвести с использованием одной кнопки (одно нажатие - все скрыть, второе нажатие - все показать).

Для примера прикрепляю шаблон файла с пятью листами, я записал макросы, но они работают только применительно для первого листа...
Изменено: Maxim - - 10 сен 2020 19:55:32
 
Код
Sub Скрыть()
    Dim Sht As Worksheet

    For Each Sht In Worksheets
        With Sht
            If Sht.Name <> "ГЛАВНАЯ" Then
                .Columns("A:E").Hidden = True
            End If
        End With
    Next Sht
    MsgBox "Столбцы A:E на всех листах скрыты!", vbInformation, "Конец"
End Sub

Код
Sub Показать()
    Dim Sht As Worksheet
    
    For Each Sht In Worksheets
        With Sht
            .Columns.Hidden = False
        End With
    Next Sht
    MsgBox "Столбцы A:E на всех листах отображены!", vbInformation, "Конец"
End Sub
Изменено: New - 10 сен 2020 20:22:03
 
С одной кнопкой во вложении
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
New, Можно ли перечислить несколько листов, которые не будут участвовать в "работе" макроса

If Sht.Name <> "ГЛАВНАЯ" и "Главная2" и "Главная3" Then

В рабочем файле 100 листов, которые не участвуют в скрытии и 100 листов, которые участвуют.
Физически, один раз я смогу их перечислить, чтобы все работало
 
Создайте массив с листами. например
Код
Months = Array("январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь")
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox написал:
С одной кнопкой во вложении
Спасибо!
Такой же вопрос, как я писал выше, можно ли прописать, чтобы исключался не только лист "Главная", но и другие, которые я могу вручную прописать?

типа такого: If Sht.Name <> "ГЛАВНАЯ" и "Главная2" и "Главная3" Then
 
Цитата
Maxim написал:
В рабочем файле 100 листов, которые не участвуют в скрытии и 100 листов, которые участвуют.
А почему вы сразу это не сказали в вашем 1-м сообщении?
Какие ещё нюансы вы скрыли от нас. А то я сейчас снова напишу код, а вы потом ещё что-нибудь вспомните
Изменено: New - 10 сен 2020 20:52:59
 
Код
Sub Pokazat2()
Dim Sh As Worksheet
Dim T As Boolean
Application.ScreenUpdating = False
With Лист1.Shapes("КНОПКА").TextEffect
    If .Text = "СКРЫТЬ" Then
        T = True
        .Text = "ПОКАЗАТЬ"
    Else
        T = False
        .Text = "СКРЫТЬ"
    End If
End With
With ThisWorkbook
List = Array("Главная", "Лист6")
    For Each Sh In .Worksheets
        If Sh.Name <> List Then
            Sh.Columns("A:E").EntireColumn.Hidden = T
        End If
    Next Sh
End With
Application.ScreenUpdating = True
MsgBox "Выполнено", vbInformation, "EXCEL"
End Sub


пишет ошибку(
Изменено: Maxim - 10 сен 2020 20:53:50
 
во вложении пример с двумя главными листами
Скрытый текст

P.S. Если не хотите руками записывать наименования листов в коде. Можно вынести список главных листов на отдельный лист и этот диапазон загонять в массив. Но это уже другая история и код.
Изменено: Alemox - 10 сен 2020 21:00:09
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Maxim, потому что в этом мире не всё так просто

Код
Sub Pokazat()
    Dim Sh As Worksheet, T As Boolean
    Dim arrayEgnoreSheets
    
    'массив с назаниями листов, которые необходимо игнорировать
    arrayEgnoreSheets = Array("ГЛАВНАЯ", "Лист3", "Лист6")
    
    Application.ScreenUpdating = False
    
    With Лист1.Shapes("КНОПКА").TextEffect
        If .Text = "СКРЫТЬ" Then
            T = True
            .Text = "ПОКАЗАТЬ"
        Else
            T = False
            .Text = "СКРЫТЬ"
        End If
    End With
    
    With ThisWorkbook
        For Each Sh In .Worksheets
            If Not IsInArray(Sh.Name, arrayEgnoreSheets) Then
                Sh.Columns("A:E").EntireColumn.Hidden = T
            End If
        Next Sh
    End With
    
    Application.ScreenUpdating = True
    MsgBox "Выполнено", vbInformation, "EXCEL"
    
End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Изменено: New - 10 сен 2020 20:59:33
 
Alemox, Спасибо Вам еще раз Огромное! Вопрос снят!
 
New, принимал активное участие, думаю и он заслуживает благодарности.  ;)
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Спасибо )) но всё, что я пишу на форуме только лишь для себя - я вспоминаю, как писать макросы. Мне не важно, что пишут ТС, мне важно напрячь свою голову/память и т.д.
Изменено: New - 10 сен 2020 21:14:05
 
Цитата
Alemox написал:
New , принимал активное участие, думаю и он заслуживает благодарности.  
New, и Вам огромная благодарность!
 
Цитата
New написал:
With Лист1.Shapes("КНОПКА").TextEffect

Скажите, как создать такую кнопку?
Я вставляю объект, назначаю ему имя текущего макроса, но в новой созданной кнопке не появляется текст "Скрыть" и "Показать"

и почему в этой строке фигурирует "Лист1" ?
 
Вставка - фигуры (выбираете любую и мышкой рисуете её на листе)
Чтобы написать на ней текст - щёлкните правой клавишей на ней и выберите - изменить текст
В коде vba написано "Лист1" - это кодовое имя Лист1 (у каждого листа есть имя листа и его кодовое имя. К листу можно обращаться и так и так (или worksheets ("Лист1") или по кодовому имени)
Изменено: New - 11 сен 2020 08:11:42
 
Цитата
New написал:
Мне не важно, что пишут ТС, мне важно напрячь свою голову/память и т.д.
100500!
Страницы: 1
Читают тему (гостей: 1)
Наверх