Подскажите, пожалуйста, как в Excel 2007 запустить макрос при группировке столбцов при нажатии на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы)? Заранее спасибо!
Подскажите, пожалуйста, как в Excel 2007 запустить макрос при группировке столбцов при нажатии на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы)? Заранее спасибо!Dmitriymifns
Dmitriymifns, Скорее всего, нет предусмотренных событий на это дело. Поэтому придётся делать "костыли". Опишите задачу полностью, что вы пытаетесь сделать?
Dmitriymifns, Скорее всего, нет предусмотренных событий на это дело. Поэтому придётся делать "костыли". Опишите задачу полностью, что вы пытаетесь сделать?Roman777
Ну да, отдельного события пожалуй что и нет. Можно так. Предыдущее состояние хранить где-то в книге, найти событие, которое группировка столбцов вызывает (обыкновенное Change подойдёт скорее всего), проверять текущее состояние, если оно изменилось — запустить макрос и запомнить состояние.
Ну да, отдельного события пожалуй что и нет. Можно так. Предыдущее состояние хранить где-то в книге, найти событие, которое группировка столбцов вызывает (обыкновенное Change подойдёт скорее всего), проверять текущее состояние, если оно изменилось — запустить макрос и запомнить состояние.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Здравствуйте! Задача состоит в том, чтобы при раскрытии сгруппированных столбцов в каждой такой группе не отображалось по одному определенному столбцу на двух листах книги. Причем если открыть книгу и сначала свернуть сгруппированные столбцы, а затем раскрыть, то по одному столбцу в каждой такой группе не должны отображаться.
Например, есть Книга1, в ней есть 2 листа ("2018" и "2019"), в которых сгруппированы по 3 группы одних и тех же столбцов ("C:H", "J:O" и "Q:V"). Нужно, чтобы на каждом из этих листов ("2018" и "2019") постоянно были свернутыми столбцы F, M и T, независимо оттого, сколько раз нажимать на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).
На данный момент макрос сворачивает столбцы F, M и T на листах "2018" и "2019" только при открытии книги. А нужно, чтобы столбцы были вообще всегда свернутыми, независимо от действий на листах, даже если это будет просто нажатие на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).
См. файл во вложении
Здравствуйте! Задача состоит в том, чтобы при раскрытии сгруппированных столбцов в каждой такой группе не отображалось по одному определенному столбцу на двух листах книги. Причем если открыть книгу и сначала свернуть сгруппированные столбцы, а затем раскрыть, то по одному столбцу в каждой такой группе не должны отображаться.
Например, есть Книга1, в ней есть 2 листа ("2018" и "2019"), в которых сгруппированы по 3 группы одних и тех же столбцов ("C:H", "J:O" и "Q:V"). Нужно, чтобы на каждом из этих листов ("2018" и "2019") постоянно были свернутыми столбцы F, M и T, независимо оттого, сколько раз нажимать на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).
На данный момент макрос сворачивает столбцы F, M и T на листах "2018" и "2019" только при открытии книги. А нужно, чтобы столбцы были вообще всегда свернутыми, независимо от действий на листах, даже если это будет просто нажатие на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).
Dmitriymifns, как вариант такой костыль: это в модуль соответствующего листа [vba]
Код
Private Sub Worksheet_Calculate() Dim r Application.ScreenUpdating = False Application.EnableEvents = False For i = 0 To 2 Set r = Range(Columns(3 + i * 7), Columns(9 + i * 7)) If (r.Columns(r.Columns.Count).ShowDetail) Then r.Columns(4).Hidden = True End If Next i
и добавить в любую ячейку самописную функцию: [vba]
Код
Function VisibleCnt(r As Range) HiddenCnt = r.SpecialCells(xlCellTypeVisible) End Function
[/vba]
PS, функция добавлена, чтобы возникало событие Worksheet_Calculate() при изменении скрытия-раскрытия столбцов и конечно, она должна указывать на строку, или диапазон ячеек, где при нажатии + - будут скрываться-раскрываться ячейки
Dmitriymifns, как вариант такой костыль: это в модуль соответствующего листа [vba]
Код
Private Sub Worksheet_Calculate() Dim r Application.ScreenUpdating = False Application.EnableEvents = False For i = 0 To 2 Set r = Range(Columns(3 + i * 7), Columns(9 + i * 7)) If (r.Columns(r.Columns.Count).ShowDetail) Then r.Columns(4).Hidden = True End If Next i
и добавить в любую ячейку самописную функцию: [vba]
Код
Function VisibleCnt(r As Range) HiddenCnt = r.SpecialCells(xlCellTypeVisible) End Function
[/vba]
PS, функция добавлена, чтобы возникало событие Worksheet_Calculate() при изменении скрытия-раскрытия столбцов и конечно, она должна указывать на строку, или диапазон ячеек, где при нажатии + - будут скрываться-раскрываться ячейкиRoman777
Dmitriymifns, действительно, я оказался не прав, тут работает именно из-за цикличности. То есть, функция VisibleCnt даже не нужна. Достаточно зациклить любую ячейку саму на себя. В этом случае Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов. Что интересно, работает и при запрете на итеративные вычисления... Но это самый близкий вариант того, что Вам было нужно... Самый большой минус, это если Вы раскроете вручную скрытый столбец, потом двойной щелчок на любую ячейку и выбор другой ячейки приведёт к вновь сокрытию столбца.
Dmitriymifns, действительно, я оказался не прав, тут работает именно из-за цикличности. То есть, функция VisibleCnt даже не нужна. Достаточно зациклить любую ячейку саму на себя. В этом случае Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов. Что интересно, работает и при запрете на итеративные вычисления... Но это самый близкий вариант того, что Вам было нужно... Самый большой минус, это если Вы раскроете вручную скрытый столбец, потом двойной щелчок на любую ячейку и выбор другой ячейки приведёт к вновь сокрытию столбца.Roman777
[/vba] немного улучшит этот недуг (позволяет вручную раскрыть столбец, когда столбцы развернуты). Тогда само событие нужно немного подправить:
[vba]
Код
Private Sub Worksheet_Calculate() Dim r
Application.ScreenUpdating = False Application.EnableEvents = False For i = 0 To 2 Set r = Range(Columns(3 + i * 7), Columns(9 + i * 7)) If (r.Columns(r.Columns.Count).ShowDetail) Then If Not firstflg(i) Then r.Columns(4).Hidden = True firstflg(i) = True End If Else firstflg(i) = False End If Next i Application.EnableEvents = True Application.ScreenUpdating = True End Sub
[/vba]
Добавление глобальной массивной переменной [vba]
Код
Public firstflg(0 To 2) As Boolean
[/vba] немного улучшит этот недуг (позволяет вручную раскрыть столбец, когда столбцы развернуты). Тогда само событие нужно немного подправить:
[vba]
Код
Private Sub Worksheet_Calculate() Dim r
Application.ScreenUpdating = False Application.EnableEvents = False For i = 0 To 2 Set r = Range(Columns(3 + i * 7), Columns(9 + i * 7)) If (r.Columns(r.Columns.Count).ShowDetail) Then If Not firstflg(i) Then r.Columns(4).Hidden = True firstflg(i) = True End If Else firstflg(i) = False End If Next i Application.EnableEvents = True Application.ScreenUpdating = True End Sub
Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов
если в любой ячейке написать любую волатильную функцию (СЕГОДНЯ, ТДАТА, СЛЧИС, ...), то при использовании группировки событие пересчета возникает Макросы в модуль книги можно вот так, например, написать [vba]
Код
Private Sub Workbook_Open() Skr End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Skr End Sub
Sub Skr() Dim Sh As Worksheet Application.EnableEvents = 0 For Each Sh In Sheets With Sh If .Name <> "Лист2" And .Name <> "Лист3" Then Range("F1,M1,T1").EntireColumn.Hidden = True End If End With Next Sh Application.EnableEvents = 1 End Sub
[/vba] Но, если честно, мне это все очень не нравится. Да и отмена последних действий сбрасывается. Не знаю, я бы что-нибудь другое придумал. Как вариант - вообще убрать эти столбцы на другой лист и сделать его xlSheetVeryHidden
Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов
если в любой ячейке написать любую волатильную функцию (СЕГОДНЯ, ТДАТА, СЛЧИС, ...), то при использовании группировки событие пересчета возникает Макросы в модуль книги можно вот так, например, написать [vba]
Код
Private Sub Workbook_Open() Skr End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Skr End Sub
Sub Skr() Dim Sh As Worksheet Application.EnableEvents = 0 For Each Sh In Sheets With Sh If .Name <> "Лист2" And .Name <> "Лист3" Then Range("F1,M1,T1").EntireColumn.Hidden = True End If End With Next Sh Application.EnableEvents = 1 End Sub
[/vba] Но, если честно, мне это все очень не нравится. Да и отмена последних действий сбрасывается. Не знаю, я бы что-нибудь другое придумал. Как вариант - вообще убрать эти столбцы на другой лист и сделать его xlSheetVeryHidden_Boroda_
Roman777, то есть, если я Вас правильно понял, 2 вариант тоже будет работать только при зацикливании ячейки A1 самой на себя и без зацикливания здесь никак не обойтись?
Roman777, то есть, если я Вас правильно понял, 2 вариант тоже будет работать только при зацикливании ячейки A1 самой на себя и без зацикливания здесь никак не обойтись?Dmitriymifns
Я тут подумал и решил обойтись без макросов и танцев с бубном следующим образом: 1. Уменьшил ширину столбцов F, M и T до 1 пикселя, визуально кажется, что они скрыты (у меня используется заливка на листах "2018" и "2019") 2. В случае если бы заливка на листах не использовалась, можно было бы для визуального эффекта, например, сделать левые границы столбцов F, M и T белым цветом (чтобы не было видно сдвоенных серых линий между столбцами E-F, L-M и S-T).
Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!
Я тут подумал и решил обойтись без макросов и танцев с бубном следующим образом: 1. Уменьшил ширину столбцов F, M и T до 1 пикселя, визуально кажется, что они скрыты (у меня используется заливка на листах "2018" и "2019") 2. В случае если бы заливка на листах не использовалась, можно было бы для визуального эффекта, например, сделать левые границы столбцов F, M и T белым цветом (чтобы не было видно сдвоенных серых линий между столбцами E-F, L-M и S-T).
Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!Dmitriymifns
Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!
Александр ( _Boroda_) в сообщении 11 дал понять, что вместо зацикливания, которое может навредить, можно использовать любую волатильную функцию. Специального функционала, позволяющего "правильно" решить задачу в том виде, в котором Вы её пытаетесь решить, в экселе нет. Вроде бы, есть возможность ещё с помощью специальных программ редактировать UI эксель-файла, добавив вызов своего кода на кнопку "+" или "-", например, но я такими вещами никогда не занимался...)
Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!
Александр ( _Boroda_) в сообщении 11 дал понять, что вместо зацикливания, которое может навредить, можно использовать любую волатильную функцию. Специального функционала, позволяющего "правильно" решить задачу в том виде, в котором Вы её пытаетесь решить, в экселе нет. Вроде бы, есть возможность ещё с помощью специальных программ редактировать UI эксель-файла, добавив вызов своего кода на кнопку "+" или "-", например, но я такими вещами никогда не занимался...)Roman777
Да здесь подробнить-то нечего, просто я иногда (не всегда) замечал, что если в файле есть ЦС, то расчеты выполняются неверно - формулы неправильно считают, если в них есть ссылки на ячейки левее-выше и правее-ниже ячейки с ЦС. Повторюсь - так не всегда. Когда точно - не знаю, я, как только ЦС вижу, сразу же ее убираю, не морочась что как где считает
Да здесь подробнить-то нечего, просто я иногда (не всегда) замечал, что если в файле есть ЦС, то расчеты выполняются неверно - формулы неправильно считают, если в них есть ссылки на ячейки левее-выше и правее-ниже ячейки с ЦС. Повторюсь - так не всегда. Когда точно - не знаю, я, как только ЦС вижу, сразу же ее убираю, не морочась что как где считает_Boroda_