Есть ли события ListObject в VBA? - PullRequest
0 голосов
/ 11 мая 2019

Я вижу из .NET API (VSTO) для ListObject, что события существуют для этого объекта. VSTO Docs

Однако я не пишу код в .NET, я просто делаю ванильный Excel VBA и хотел бы подключиться к событиям, которые вызывает ListObject.

Официальная документация Microsoft по ListOjbect не показывает никаких событий, но я надеюсь, что, возможно, существует "неофициальный" способ, которым это может быть достигнуто?

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Прямых Events нет, но есть обходные пути.

например.Вы можете проверить, пытался ли пользователь щелкнуть внутри или одной строкой под ListObject

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   Dim tbl As ListObject: Set tbl = ListObjects("Table1")

   If Not Intersect(Target, tbl.Range.Offset(1, 0)) Then
        Exit Sub 'clicked elsewhere, exit
   Else
        'tried to access table do something <code here>
   End If

End Sub
0 голосов
/ 10 июня 2019

Я не знаю ни о каких конкретных событиях для объектов Listobject, но вы можете легко воспроизвести это поведение, используя события листов.

Если вы хотите, чтобы событие происходило, когда вы просто щелкаете в ОДНОЙ ячейке:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim mytbl As ListObject
Set tbl = thisworkbook.sheets("whatever sheet").ListObjects("Table1")

dim overlap as range
set overlap = Intersect(Target, mytbl.databodyrange)
If Not overlap in nothing Then
   'your selection is totally or partially inside the table
    if overlap.count=1
    ' you selected only one cell
    ' do something
    ' If you want to access the cell selected
    ' use target.range
Else
    msg box('you did not make a proper selection of one cell inside the listobject')
End If
End if

End Sub

Если вы хотите, чтобы событие сработало, когда вы ИЗМЕНИТЕ ЗНАЧЕНИЕ КЛЕТОК ЛИСТОБЪЕКТА: Вы можете изменить только ячейку за раз. Поэтому нет необходимости проверять количество клеток. Это всегда один.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim mytbl As ListObject
Set tbl = thisworkbook.sheets("whateversheet").ListObjects("Table1")
' the list object table is in sheet 'whateversheet"
dim overlap as range
set overlap = Intersect(Target, mytbl.databodyrange)
If Not overlap is nothing Then
    ' your selection is inside the table
    ' code is here when you change the value of a cell of the table.
    ' do some stuff
    ' if you want to add the introduced value: 
    newvalue=target.value
Else
    ' You might inform the user that the change took place outside the listobject
End If

End Sub

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

в основном это всегда поиск того, инициируется ли событие ячейкой листа, которая принадлежит объекту списка (отсюда и интервал между диапазонами). И если это так, запустить соответствующий код.

...