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

Вход

Регистрация

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

 

= Мир MS Excel/Как запустить макрос при группировке столбцов - Мир MS Excel

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

Excel 2007
Подскажите, пожалуйста, как в Excel 2007 запустить макрос при группировке столбцов при нажатии на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы)? Заранее спасибо!
 
Ответить
СообщениеПодскажите, пожалуйста, как в Excel 2007 запустить макрос при группировке столбцов при нажатии на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы)? Заранее спасибо!

Автор - Dmitriymifns
Дата добавления - 29.10.2018 в 11:51
Roman777 Дата: Понедельник, 29.10.2018, 12:06 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Dmitriymifns, Скорее всего, нет предусмотренных событий на это дело. Поэтому придётся делать "костыли".
Опишите задачу полностью, что вы пытаетесь сделать?


Много чего не знаю!!!!
 
Ответить
СообщениеDmitriymifns, Скорее всего, нет предусмотренных событий на это дело. Поэтому придётся делать "костыли".
Опишите задачу полностью, что вы пытаетесь сделать?

Автор - Roman777
Дата добавления - 29.10.2018 в 12:06
StoTisteg Дата: Понедельник, 29.10.2018, 13:20 | Сообщение № 3
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Ну да, отдельного события пожалуй что и нет. Можно так. Предыдущее состояние хранить где-то в книге, найти событие, которое группировка столбцов вызывает (обыкновенное Change подойдёт скорее всего), проверять текущее состояние, если оно изменилось — запустить макрос и запомнить состояние.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеНу да, отдельного события пожалуй что и нет. Можно так. Предыдущее состояние хранить где-то в книге, найти событие, которое группировка столбцов вызывает (обыкновенное Change подойдёт скорее всего), проверять текущее состояние, если оно изменилось — запустить макрос и запомнить состояние.

Автор - StoTisteg
Дата добавления - 29.10.2018 в 13:20
sboy Дата: Понедельник, 29.10.2018, 14:16 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
обыкновенное Change подойдёт скорее всего

не подойдет к сожалению


Яндекс: 410016850021169
 
Ответить
Сообщение
обыкновенное Change подойдёт скорее всего

не подойдет к сожалению

Автор - sboy
Дата добавления - 29.10.2018 в 14:16
StoTisteg Дата: Понедельник, 29.10.2018, 14:29 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Тогда надо события перебирать... И хотелось бы в этом случае от ТС хотя бы минималистский примерчик, а самому ваять лень.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеТогда надо события перебирать... И хотелось бы в этом случае от ТС хотя бы минималистский примерчик, а самому ваять лень.

Автор - StoTisteg
Дата добавления - 29.10.2018 в 14:29
Dmitriymifns Дата: Вторник, 30.10.2018, 06:16 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

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

Например, есть Книга1, в ней есть 2 листа ("2018" и "2019"), в которых сгруппированы по 3 группы одних и тех же столбцов ("C:H", "J:O" и "Q:V"). Нужно, чтобы на каждом из этих листов ("2018" и "2019") постоянно были свернутыми столбцы F, M и T, независимо оттого, сколько раз нажимать на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).

На данный момент макрос сворачивает столбцы F, M и T на листах "2018" и "2019" только при открытии книги. А нужно, чтобы столбцы были вообще всегда свернутыми, независимо от действий на листах, даже если это будет просто нажатие на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).

См. файл во вложении
К сообщению приложен файл: 5891526.xlsm (15.0 Kb)
 
Ответить
СообщениеЗдравствуйте! Задача состоит в том, чтобы при раскрытии сгруппированных столбцов в каждой такой группе не отображалось по одному определенному столбцу на двух листах книги. Причем если открыть книгу и сначала свернуть сгруппированные столбцы, а затем раскрыть, то по одному столбцу в каждой такой группе не должны отображаться.

Например, есть Книга1, в ней есть 2 листа ("2018" и "2019"), в которых сгруппированы по 3 группы одних и тех же столбцов ("C:H", "J:O" и "Q:V"). Нужно, чтобы на каждом из этих листов ("2018" и "2019") постоянно были свернутыми столбцы F, M и T, независимо оттого, сколько раз нажимать на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).

На данный момент макрос сворачивает столбцы F, M и T на листах "2018" и "2019" только при открытии книги. А нужно, чтобы столбцы были вообще всегда свернутыми, независимо от действий на листах, даже если это будет просто нажатие на "+" (отобразить сгруппированные столбцы) или "-" (скрыть сгруппированные столбцы).

См. файл во вложении

Автор - Dmitriymifns
Дата добавления - 30.10.2018 в 06:16
Roman777 Дата: Вторник, 30.10.2018, 10:14 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
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
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    
End Sub
[/vba]

и добавить в любую ячейку самописную функцию:
[vba]
Код
Function VisibleCnt(r As Range)
HiddenCnt = r.SpecialCells(xlCellTypeVisible)
End Function
[/vba]

PS, функция добавлена, чтобы возникало событие Worksheet_Calculate() при изменении скрытия-раскрытия столбцов
и конечно, она должна указывать на строку, или диапазон ячеек, где при нажатии + - будут скрываться-раскрываться ячейки
К сообщению приложен файл: TTTTT.xlsm (20.9 Kb)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Вторник, 30.10.2018, 10:18
 
Ответить
Сообщение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
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    
End Sub
[/vba]

и добавить в любую ячейку самописную функцию:
[vba]
Код
Function VisibleCnt(r As Range)
HiddenCnt = r.SpecialCells(xlCellTypeVisible)
End Function
[/vba]

PS, функция добавлена, чтобы возникало событие Worksheet_Calculate() при изменении скрытия-раскрытия столбцов
и конечно, она должна указывать на строку, или диапазон ячеек, где при нажатии + - будут скрываться-раскрываться ячейки

Автор - Roman777
Дата добавления - 30.10.2018 в 10:14
Dmitriymifns Дата: Среда, 31.10.2018, 04:52 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Roman777, Но тогда возникает циклическая ссылка! А если в самописной функции указать другой диапазон ячеек, то столбцы не скрываются!
 
Ответить
СообщениеRoman777, Но тогда возникает циклическая ссылка! А если в самописной функции указать другой диапазон ячеек, то столбцы не скрываются!

Автор - Dmitriymifns
Дата добавления - 31.10.2018 в 04:52
Roman777 Дата: Среда, 31.10.2018, 07:49 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Dmitriymifns, действительно, я оказался не прав, тут работает именно из-за цикличности.
То есть, функция VisibleCnt даже не нужна. Достаточно зациклить любую ячейку саму на себя. В этом случае Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов.
Что интересно, работает и при запрете на итеративные вычисления...
Но это самый близкий вариант того, что Вам было нужно...
Самый большой минус, это если Вы раскроете вручную скрытый столбец, потом двойной щелчок на любую ячейку и выбор другой ячейки приведёт к вновь сокрытию столбца.


Много чего не знаю!!!!
 
Ответить
СообщениеDmitriymifns, действительно, я оказался не прав, тут работает именно из-за цикличности.
То есть, функция VisibleCnt даже не нужна. Достаточно зациклить любую ячейку саму на себя. В этом случае Worsheet_Calculate будет возникать в случае любого изменения в ячейках на листе и в том числе при скрытии-раскрытии столбцов.
Что интересно, работает и при запрете на итеративные вычисления...
Но это самый близкий вариант того, что Вам было нужно...
Самый большой минус, это если Вы раскроете вручную скрытый столбец, потом двойной щелчок на любую ячейку и выбор другой ячейки приведёт к вновь сокрытию столбца.

Автор - Roman777
Дата добавления - 31.10.2018 в 07:49
Roman777 Дата: Среда, 31.10.2018, 07:56 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Добавление глобальной массивной переменной
[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
[/vba]
К сообщению приложен файл: 4059088.xlsm (19.7 Kb)


Много чего не знаю!!!!
 
Ответить
СообщениеДобавление глобальной массивной переменной
[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
[/vba]

Автор - Roman777
Дата добавления - 31.10.2018 в 07:56
_Boroda_ Дата: Среда, 31.10.2018, 09:43 | Сообщение № 11
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Достаточно зациклить любую ячейку саму на себя
А вот этого лучше не делать. Остальные расчеты могут полететь
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
К сообщению приложен файл: 5891526_2.xlsm (17.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Достаточно зациклить любую ячейку саму на себя
А вот этого лучше не делать. Остальные расчеты могут полететь
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_
Дата добавления - 31.10.2018 в 09:43
Dmitriymifns Дата: Среда, 31.10.2018, 09:51 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Roman777, то есть, если я Вас правильно понял, 2 вариант тоже будет работать только при зацикливании ячейки A1 самой на себя и без зацикливания здесь никак не обойтись?
 
Ответить
СообщениеRoman777, то есть, если я Вас правильно понял, 2 вариант тоже будет работать только при зацикливании ячейки A1 самой на себя и без зацикливания здесь никак не обойтись?

Автор - Dmitriymifns
Дата добавления - 31.10.2018 в 09:51
Dmitriymifns Дата: Среда, 31.10.2018, 10:18 | Сообщение № 13
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Я тут подумал и решил обойтись без макросов и танцев с бубном следующим образом:
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
Дата добавления - 31.10.2018 в 10:18
Roman777 Дата: Среда, 31.10.2018, 10:40 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
А вот этого лучше не делать. Остальные расчеты могут полететь

Можно поподробней? Ато я не сталкивался с такими вещами особо, а когда использовал, проблем не наблюдал.

Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!

Александр ( _Boroda_) в сообщении 11 дал понять, что вместо зацикливания, которое может навредить, можно использовать любую волатильную функцию. Специального функционала, позволяющего "правильно" решить задачу в том виде, в котором Вы её пытаетесь решить, в экселе нет. Вроде бы, есть возможность ещё с помощью специальных программ редактировать UI эксель-файла, добавив вызов своего кода на кнопку "+" или "-", например, но я такими вещами никогда не занимался...)


Много чего не знаю!!!!
 
Ответить
Сообщение
А вот этого лучше не делать. Остальные расчеты могут полететь

Можно поподробней? Ато я не сталкивался с такими вещами особо, а когда использовал, проблем не наблюдал.

Но все же хотелось бы знать, можно ли в принципе решить такую задачу с помощью макросов, которые бы не повлияли на вычисления и расчеты в листах "2018" и "2019"?!!

Александр ( _Boroda_) в сообщении 11 дал понять, что вместо зацикливания, которое может навредить, можно использовать любую волатильную функцию. Специального функционала, позволяющего "правильно" решить задачу в том виде, в котором Вы её пытаетесь решить, в экселе нет. Вроде бы, есть возможность ещё с помощью специальных программ редактировать UI эксель-файла, добавив вызов своего кода на кнопку "+" или "-", например, но я такими вещами никогда не занимался...)

Автор - Roman777
Дата добавления - 31.10.2018 в 10:40
_Boroda_ Дата: Среда, 31.10.2018, 10:46 | Сообщение № 15
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Можно поподробней?

Да здесь подробнить-то нечего, просто я иногда (не всегда) замечал, что если в файле есть ЦС, то расчеты выполняются неверно - формулы неправильно считают, если в них есть ссылки на ячейки левее-выше и правее-ниже ячейки с ЦС. Повторюсь - так не всегда. Когда точно - не знаю, я, как только ЦС вижу, сразу же ее убираю, не морочась что как где считает


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Можно поподробней?

Да здесь подробнить-то нечего, просто я иногда (не всегда) замечал, что если в файле есть ЦС, то расчеты выполняются неверно - формулы неправильно считают, если в них есть ссылки на ячейки левее-выше и правее-ниже ячейки с ЦС. Повторюсь - так не всегда. Когда точно - не знаю, я, как только ЦС вижу, сразу же ее убираю, не морочась что как где считает

Автор - _Boroda_
Дата добавления - 31.10.2018 в 10:46
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как запустить макрос при группировке столбцов (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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