Подтвердить что ты не робот

OnClick в Excel VBA

Есть ли способ щелкнуть по ячейке в VBA с помощью Excel? Я не имею в виду событие Worksheet_SelectionChange, поскольку это не будет срабатывать несколько раз, если ячейка будет нажата несколько раз. BeforeDoubleClick также не решает мою проблему, так как я не хочу требовать от пользователя двойного щелчка по нему.

Мое текущее решение работает с событием SelectionChange, но, похоже, оно требует использования глобальных переменных и других методов субоптимального кодирования. Это также кажется склонным к ошибке.

4b9b3361

Ответ 1

Ясно, что нет идеального ответа. Однако, если вы хотите разрешить пользователю

  • выберите определенные ячейки
  • позволяют им изменять эти ячейки, и
  • захватывать каждый клик, даже повторяющиеся клики в той же самой ячейке,

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

Один из вариантов - это перемещение фокуса, как я предложил выше, но это предотвращает редактирование ячейки. Другой вариант - расширить выделение на одну ячейку (влево/вправо/вверх/вниз), поскольку это позволяет редактировать исходную ячейку, но вызывает событие Select, если эта ячейка снова нажата сама по себе.

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  'prevent Select event triggering again when we extend the selection below
  Application.EnableEvents = False
  Target.Resize(1, 2).Select
  Application.EnableEvents = True
End Sub

Ответ 2

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

В приведенном ниже коде будет отображаться верхняя левая ячейка, видимая на экране, когда вы нажимаете на любую ячейку. Очевидно, что у него есть недостаток, что он не будет ловить клик по верхней левой ячейке, но это можно управлять (например, выбрав верхнюю правую ячейку, если activecell - верхний левый).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  'put your code here to process the selection, then..
  ActiveWindow.VisibleRange.Cells(1, 1).Select
End Sub

Ответ 3

SelectionChange - это событие, встроенное в модель объекта Excel для этого. Он должен делать то, что вам нужно, стрелять в любое время, когда пользователь щелкает куда угодно...

Я не уверен, что я понимаю ваши возражения против глобальных переменных здесь, вам понадобится только 1, если вы используете событие Application.SelectionChange. Тем не менее, вам не понадобится, если вы используете код класса рабочей книги позади (чтобы уловить событие Workbook.SelectionChange) или код класса рабочего листа (для захвата события Worksheet.SelectionChange). (Если ваша проблема не является проблемой "глобальной переменной reset" в VBA, для которой существует только одно решение: обработка ошибок во всем мире. Не допускайте никаких необработанных ошибок, вместо этого регистрируйте их и/или "мягкий отчет" с ошибкой как окно сообщения пользователю.)

Вам также может потребоваться захватить события Worksheet.Activate() и Worksheet.Deactivate() (или эквивалент в классе рабочей книги) и/или события Workbook.Activate и Workbook.Deactivate(), чтобы вы знали, когда пользователь переключил рабочие листы и/или книги. Окно активирует и деактивирует события, чтобы этот подход был завершен. Они все могут назвать ту же самую точную процедуру, однако все они обозначают одно и то же: пользователь изменил "фокус", если вы это сделаете.

Если вам не нравится VBA, кстати, вы можете сделать то же самое с помощью VB.NET или С#.

[Edit: Dbb делает очень хорошее замечание о событии SelectionChange, не нажимая клик, когда пользователь нажимает текущую выбранную ячейку. Если вам нужно это сделать, вам нужно будет использовать подклассы.]

Ответ 4

Я так не думаю. Но вы можете создать объект фигуры (или Wordart или что-то похожее). Нажмите событие Click и поместите объект в позицию указанной ячейки.

Ответ 5

Это сработало для меня.....

Private Sub Worksheet_Change(ByVal Target As Range)

    If Mid(Target.Address, 3, 1) = "$" And Mid(Target.Address, 2, 1) < "E" Then
       ' The logic in the if condition will filter for a specific cell or block of cells
       Application.ScreenUpdating = False
       'MsgBox "You just changed " & Target.Address

       'all conditions are true .... DO THE FUNCTION NEEDED 
       Application.ScreenUpdating = True
    End If
    ' if clicked cell is not in the range then do nothing (if condttion is not run)  
End Sub

ПРИМЕЧАНИЕ. Эта функция в реальном использовании пересчитала сводную таблицу, если пользователь добавил элемент в диапазоне данных от A4 до D500. Там были защищенные и незащищенные разделы на листе, поэтому фактическая проверка щелчка - это если столбец меньше, чем "E". Логика может быть такой же сложной, как вы хотите включить или исключить любое количество областей

block1  = row > 3 and row < 5 and column column >"b" and < "d" 
block2  = row > 7 and row < 12 and column column >"b" and < "d" 
block3  = row > 10 and row < 15 and column column >"e" and < "g"

If block1 or block2 or block 3 then
  do function .....
end if