Dim j as integer
Function MyUDF() ' this is a user-defined-function
'NOTE: can't be traced when executed,
'so this creates debugging issues
Set MyUDF = Selection
Range("a1") = j
j = j + 1
End Function
'How to Make Cells into Buttons that execute code
' place code in the specific Worksheet module of interest
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' in this example, I create named ranges on the spreadsheet '
' [complicated names, here, so you can read what's what]:
' one cell: "Button_OneCellNameRange"
' one set of merged cells: "Button_MergedCellNameRange"
' [the reference is the top-left cell, only]
' a VBA created cell/button location [not very useful for later sheet edits]
Dim myVBACellButton As Range
Set myVBACellButton = Range("B2")
Debug.Print "Target Address: " & Target.Address
'merged cells will return a range: eg "$A$1:$D$3"
Debug.Print "Target.Cells(1,1).Address: " & Target.Cells(1, 1).Address
'merged cells will return the top left cell, which would match
' a named reference to a merged cell
Select Case Target.Cells(1, 1).Address
'if you have merged cells, you must use the ".cells(1,1).address"
' and not just Target.Address
Case Is = "$A$1"
MsgBox "Hello from: Click on A1"
' [execute a procedure/subroutine call, or more code, here...]
Case Is = myVBACellButton.Address
MsgBox "Hello from: Click on B2, a VBA referenced cell/button"
' "myCellButton" defined as range in VBA
'using a range named on the spreadsheet itself ...
' named ranges allow one to move the cell/button freely,
' without VBA worries
Case Range("Button_OneCellNameRange").Address
MsgBox "Hello From: Button Click on Button_OneCellNameRange"
Case Range("Button_MergedCellNamedRange").Address
'note that the address for merged cells is ONE CELL, the top left
MsgBox _
"Hello from: Button_MergedCellNamedRange.Address: " _
& Range("Button_MergedCellNamedRange").Address _
Case Else ' normally you wouldn't be using this, for buttons
MsgBox "NOT BUTTONS"
End Select
End Sub
3条答案
按热度按时间gopyfrb31#
使用@TimWilliams的建议和引用的URL,基于阅读那里和进一步,我提出了一些演示代码,它为我在Excel 2010工作:
IfError
在早期版本中可能不起作用,我想知道它在以后的版本中的行为是否不同。注意:这段代码 * 不能 * 像普通的VBA一样调试。这是因为它是在“电子表格端”作为用户定义的函数执行的。
将公式放入单元格(此处为A2):
=IFERROR(HYPERLINK("#MyUDF()","CellText"),"Junk")
1.单元格A2中将显示“单元格文本”。
"#...."
指向UDF,结合代码中的Set
语句,强制执行“click”,并且只在单击时执行一次,而不是在单元格中悬停和移动时执行的可重复事件=IFERROR(HYPERLINK(...),...)
是#name或其他错误的解决方法,在使用=HYPERLINK(....)
时会出现。将此代码放在模块中(尺寸和UDF):
单击A2中的URL将增加A1中显示的值-每次单击增加一个增量。
要观察悬停效果:
1.注解掉“Set语句”
1.去掉UDF引用周围的引号和磅号。2单元格现在将显示“asdf”而不是“Test”。
1.在URL上滚动,单元格A1将随着您的移动/悬停而递增。
要使整个单元格都执行UDF(和递增值),请打开单元格的自动换行。
请注意鼠标悬停时,代码是如何随着您在单元格中的移动而执行的。对我来说,如果我在单元格中停止移动,代码就不会执行。
osh3o9ms2#
“在单元格中放置按钮”的替代方法
选择要使用工作表事件执行代码的单元格:
Worksheet_SelectionChange
将代码放在特定工作表的模块中,而不是工作簿模块中。根据需要为单元格添加颜色/边框/文本;单元格在任何计算机或屏幕上都是单元格。当用户点击一个简短的标签/描述时,我用它来引用加载到用户表单中的帮助,从帮助工作表上的查找中。这在合并的单元格上作为按钮工作。使用单元格/按钮避免了来自IT的Active-X对象投诉。
需要考虑的事情,示例代码如下:
1.即使只有一个单元格/按钮,也可以在代码中使用
Select Case
,这样可以简化以后添加单元格/按钮的过程1.考虑在电子表格中使用命名区域,并在代码中引用它们。这样,VBA就不会在意您是否移动了单元格/按钮
Target.Address
返回整个区域,而不仅仅是一个单元格。如果Select Case
引用Target
左上角单元格的地址,则可以避免此问题。Target.Cells(1,1).Address
MergeArea.Address
(MergeArea
不适用于合并单元格[只适用于单个单元格];它返回单元格所在的合并范围。示例代码
uqzxnwby3#
@John我知道这是多年以后的事了,但是对于你使用的最后一个公式来说,它是完美的,但是,每当我点击单元格时,它执行模块,但是它要么从0开始,从那里开始,要么从它改变的最后一个数字继续,而不是单元格中的当前数字。你知道为什么吗?
即A1单元格的值为100。第一次点击A2将该值更改为0。第二次点击A2将该值更改为1、2、3、4。将A1中的值更改回100。再次点击A2,值将继续为5、6、7、8等。