Подскажите, как решить следующую задачу: Есть книга, в которой 100 листов. Необходимо нажатием первой кнопки скрыть первые 5 столбцов в каждом из 100 листов. Нажатием второй кнопки необходимо показать все скрытые столбцы в каждом из листов.
В идеале - данные действие произвести с использованием одной кнопки (одно нажатие - все скрыть, второе нажатие - все показать).
Для примера прикрепляю шаблон файла с пятью листами, я записал макросы, но они работают только применительно для первого листа...
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, Можно ли перечислить несколько листов, которые не будут участвовать в "работе" макроса
If Sht.Name <> "ГЛАВНАЯ" и "Главная2" и "Главная3" Then
В рабочем файле 100 листов, которые не участвуют в скрытии и 100 листов, которые участвуют. Физически, один раз я смогу их перечислить, чтобы все работало
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Спасибо! Такой же вопрос, как я писал выше, можно ли прописать, чтобы исключался не только лист "Главная", но и другие, которые я могу вручную прописать?
типа такого: If Sht.Name <> "ГЛАВНАЯ" и "Главная2" и "Главная3" Then
Maxim написал: В рабочем файле 100 листов, которые не участвуют в скрытии и 100 листов, которые участвуют.
А почему вы сразу это не сказали в вашем 1-м сообщении? Какие ещё нюансы вы скрыли от нас. А то я сейчас снова напишу код, а вы потом ещё что-нибудь вспомните
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
Sub Pokazat()
Dim Sh As Worksheet
Dim T As Boolean, Teg As Boolean
Dim SpisokListov()
Dim SL
Application.ScreenUpdating = False
SpisokListov = Array("ГЛАВНАЯ", "ГЛАВНАЯ 2", "ГЛАВНАЯ 3")
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
Teg = False
For Each SL In SpisokListov
If Sh.Name = SL Then Teg = True
Next SL
If Teg = False Then Sh.Columns("A:E").EntireColumn.Hidden = T
Next Sh
End With
Application.ScreenUpdating = True
MsgBox "Выполнено", vbInformation, "EXCEL"
End Sub
P.S. Если не хотите руками записывать наименования листов в коде. Можно вынести список главных листов на отдельный лист и этот диапазон загонять в массив. Но это уже другая история и код.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
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, принимал активное участие, думаю и он заслуживает благодарности.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Спасибо )) но всё, что я пишу на форуме только лишь для себя - я вспоминаю, как писать макросы. Мне не важно, что пишут ТС, мне важно напрячь свою голову/память и т.д.
New написал: With Лист1.Shapes("КНОПКА").TextEffect
Скажите, как создать такую кнопку? Я вставляю объект, назначаю ему имя текущего макроса, но в новой созданной кнопке не появляется текст "Скрыть" и "Показать"
Вставка - фигуры (выбираете любую и мышкой рисуете её на листе) Чтобы написать на ней текст - щёлкните правой клавишей на ней и выберите - изменить текст В коде vba написано "Лист1" - это кодовое имя Лист1 (у каждого листа есть имя листа и его кодовое имя. К листу можно обращаться и так и так (или worksheets ("Лист1") или по кодовому имени)