在Excel VBA中单击OnClick

has*_*slo 21 excel vba excel-vba

有没有办法用Excel在VBA中捕获单元格?我不是指Worksheet_SelectionChange事件,因为如果多次单击该单元格,则不会多次触发.BeforeDoubleClick也没有解决我的问题,因为我不想要求用户双重点击那个.

我当前的解决方案确实适用于该SelectionChange事件,但似乎需要使用全局变量和其他次优编码实践.它似乎也容易出错.

dbb*_*dbb 20

显然,没有完美的答案.但是,如果您想允许用户

  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
Run Code Online (Sandbox Code Playgroud)


小智 7

为了捕获同一单元格上的重复单击,您需要将焦点移动到不同的单元格,这样每次单击时,实际上都是移动选择.

当您单击任何单元格时,下面的代码将选择屏幕上可见的左上角单元格.显然,它有一个缺陷,它不会在左上角的单元格上捕获点击,但是可以进行管理(例如,如果活动单元格是左上角,则选择右上角的单元格).

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您所需要做的只是增加点击次数,那么这是一个非常好的主意。但如果用户还需要能够编辑单元格值等,那么这将是不行的。(即使没有,也可能会令人困惑。)然而,SelectionChange 没有选择“同一单元格”点击这一点非常好;我错过了。 (2认同)