OnClick в Excel VBA

21
задан ashleedawg 27 June 2018 в 14:18
поделиться

5 ответов

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

  1. , выбирают определенные ячейки
  2. , позволяют им изменять те ячейки, и
  3. прерывание каждый щелчок, даже повторенный, нажимает на ту же ячейку,

тогда, самый легкий путь, кажется, для перемещения фокуса от выбранной ячейки, так, чтобы нажатие на него инициировало событие 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
20
ответ дан 29 November 2019 в 21:32
поделиться

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

код ниже выберет верхнюю левую ячейку, видимую на экране при нажатии на любую ячейку. Очевидно, это имеет дефект, что это не захватит щелчок по вершине, оставленной ячейку, но этим можно управлять (например, путем выбора верхней правой ячейки, если 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
7
ответ дан 29 November 2019 в 21:32
поделиться

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

я не уверен, что понимаю Ваши возражения на глобальные переменные здесь, Вам только было бы нужно 1 при использовании Приложения. Событие SelectionChange. Однако Вам не был бы нужен никто при использовании кода класса Рабочей книги позади (для захвата Рабочей книги. Событие SelectionChange), или класс Рабочего листа кодируют позади (для захвата Рабочего листа. SelectionChange) событие. (Если Вашей проблемой не является "проблема" сброса глобальной переменной в VBA, для которого существует только одно решение: обработка ошибок везде. Не позволяйте необработанные ошибки, вместо этого регистрируйте их и/или "мягкий отчет" ошибка как окно сообщения пользователю.)

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

, Если Вам не нравится VBA, btw, можно сделать то же использование VB.NET или C#.

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

1
ответ дан 29 November 2019 в 21:32
поделиться

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

0
ответ дан 29 November 2019 в 21:32
поделиться

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

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  
0
ответ дан 29 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: