Запустите один макрос при нажатии на ячейку, а другой макрос при двойном щелчке по ячейке. - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть база данных с заголовками категорий, которые содержат форматирование .Interior.Color и .Font, которое применяется к выбранным строкам при щелчке по ячейкам заголовков категорий.

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

Я добавил следующее в свой Лист1 (Код):

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, HideRow As 
Boolean)

If Not Application.Intersect(Target, Range("C1:W1")) Is Nothing Then
    LstRow = Cells.Find(What:="*", After:=Range("A1"), lookat:=xlPart, _
             LookIn:=xlFormulas, SearchOrder:=xlByRows, _ 
             SearchDirection:=xlPrevious, MatchCase:=False).Row   
    'Finds last row with data
    Set Dyn_AllEntries = ActiveSheet.Range("C5:C" & LstRow)  'range w/ all data
    If HiddenRows <> True Then  'Checks to see if the macro was already run
        For Each cl In Dyn_AllEntries
            If cl.Offset(0, 11) <> Target Then  'check if category matches
                cl.EntireRow.Hidden = True   'if not, hide row
            End If
        Next cl
        HiddenRows = True   'set boolean, to verify the macro is active
    ElseIf HiddenRows = True Then  'check if macro is active
        For Each cl In Dyn_AllEntries
            If cl.Offset(0, 11) <> Target And LCase(cl.Offset(0, -2)) <> _ 
            "true" Then  'if category not match & row not hidden by other macro
                cl.EntireRow.Hidden = False   'unhide row
            End If
        Next cl
        HiddenRows = False    'set boolean so I know macro isn't active
    End If
End If
End Sub

Сейчаскод, для которого я написал при выделении ячейки, выдает ошибку при компиляции:

Объявление процедуры не соответствует описанию события или процедуры с тем же именем.

Мой код "одного клика" называется Private Sub Worksheet_SelectionChange(ByVal Target As Range, HideText As Boolean), а мой код "двойного щелчка" - Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, HideRow As Boolean).

Оба находятся в модуле Sheet1 (Код).Мой код «одного щелчка» не изменился, поскольку он работал до того, как я добавил код «двойного щелчка».

Разве невозможно запустить два разных макроса одной и той же ячейки для разных действий выбора?

Вот как выглядит лист, если это поможет: Sheet1

1 Ответ

0 голосов
/ 25 сентября 2018

Вы не можете изменять сигнатуры обработчика событий, как вам угодно - это не так, как работают события.

События рабочего листа определяются в каком-то интерфейсе WorksheetEvents, а сигнатуры методов - это то, что они есть, и ониset in stone: источник события (т. е. рабочий лист) - это то, что обеспечивает значения для параметров - как рабочий лист узнает, какое значение следует предоставить для этого HideRow аргумента?Это не так, и поскольку модуль Worksheet, в котором вы находитесь, наследует своих членов от класса Worksheet, если вы называете процедуру Worksheet_BeforeDoubleClick в модуле рабочего листа, то, поскольку VBA не поддерживает метод перегрузка единственный способ получить это для компиляции - это иметь для этой процедуры точно такую ​​же * сигнатуру, с которой она определена.

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

* почти: параметр names на самом деле не имеет значения - их тип и порядок имеют значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...