OnClick在Excel VBA中

有没有办法在Excel中用VBA捕捉单元格? 我不是指Worksheet_SelectionChange事件,因为如果多次单击单元格,将不会触发多次。 BeforeDoubleClick也无法解决我的问题,因为我不想要求用户双击那个顺序。

我目前的解决scheme与SelectionChange事件一起工作,但似乎需要使用全局variables和其他次优编码实践。 这似乎也容易出错。

显然,没有完美的答案。 但是,如果你想让用户来

  1. select某些细胞
  2. 让他们改变这些细胞,和
  3. 陷阱每次点击,甚至重复点击同一个单元格,

那么最简单的方法似乎是将焦点从选中的单元格移开,以便点击它将触发Select事件。

一种select是按照我上面的build议移动焦点,但是这样可以防止单元格编辑。 另一个select是将select范围扩大到一个单元格(左/右/上/下),因为这允许编辑原始单元格,但是如果单元格单独再次单击,将触发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 

为了防止重复点击同一个单元格,您需要将焦点移至不同的单元格,以便每次单击时,都会移动select。

当你点击任何单元格时,下面的代码将select屏幕上可见的左上angular的单元格。 很明显,它有一个缺陷,就是它不会在左上angular的单元格上点击鼠标,但是可以进行pipe理(例如,如果活动单元格在左上angular,则select右上angular的单元格)。

 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 

SelectionChange是内置于Excel对象模型中的事件。 它应该完全按照你想要的,任何时候用户点击任何地方发射…

我不确定是否理解你对全局variables的反对,如果你使用Application.SelectionChange事件,你只需要1。 但是,如果使用工作簿类代码(用于捕获Workbook.SelectionChange事件)或Worksheet类代码(用于捕获Worksheet.SelectionChange)事件,则不需要任何工具。 (除非你的问题是VBA中的“全局variables重置”问题,对于这个问题只有一个解决scheme:任何地方都有error handling,不要允许任何未处理的错误,而是logging和/或“软报告”错误作为消息框给用户。)

您可能还需要捕获Worksheet.Activate()和Worksheet.Deactivate()事件(或Workbook类中的等效项)和/或Workbook.Activate和Workbook.Deactivate()事件,以便知道用户何时切换工作表和/或工作簿。 窗口激活和停用事件应该使这种方法完成。 他们都可以调用相同的确切程序,但是,它们都表示相同的事情:如果您愿意,用户更改了“焦点”。

如果你不喜欢VBA,顺便说一句,你可以使用VB.NET或C#做同样的事情。

[编辑:当用户在当前选中的单元格内点击时,Dbb对SelectionChange事件做了一个很好的说明,而不是点击一下。 如果你需要select,那么你需要使用子类。]

我不这么认为。 但是你可以创build一个形状对象(或者艺术字体或类似的东西)钩住Click事件并把对象放置到指定单元格的位置。

这对我有用…..

 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的数据范围内添加了一个项目,则实际使用中的此function会重新计算数据透视表。 在表单中有受保护和不受保护的部分,因此如果列小于“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