VBA与Excel中单元格命令按钮的制作

piv4azn7  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(470)

如何将电子表格单元格转换为按钮,并执行VBA代码,而不插入按钮、形状或其他Active-X对象?

gopyfrb3

gopyfrb31#

使用@TimWilliams的建议和引用的URL,基于阅读那里和进一步,我提出了一些演示代码,它为我在Excel 2010工作:IfError在早期版本中可能不起作用,我想知道它在以后的版本中的行为是否不同。
注意:这段代码 * 不能 * 像普通的VBA一样调试。这是因为它是在“电子表格端”作为用户定义的函数执行的。
将公式放入单元格(此处为A2):

  1. =IFERROR(HYPERLINK("#MyUDF()","CellText"),"Junk")
    1.单元格A2中将显示“单元格文本”。
  2. "#...."指向UDF,结合代码中的Set语句,强制执行“click”,并且只在单击时执行一次,而不是在单元格中悬停和移动时执行的可重复事件
  3. =IFERROR(HYPERLINK(...),...)是#name或其他错误的解决方法,在使用=HYPERLINK(....)时会出现。
    将此代码放在模块中(尺寸和UDF):
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

单击A2中的URL将增加A1中显示的值-每次单击增加一个增量。
要观察悬停效果:
1.注解掉“Set语句”
1.去掉UDF引用周围的引号和磅号。2单元格现在将显示“asdf”而不是“Test”。
1.在URL上滚动,单元格A1将随着您的移动/悬停而递增。
要使整个单元格都执行UDF(和递增值),请打开单元格的自动换行。
请注意鼠标悬停时,代码是如何随着您在单元格中的移动而执行的。对我来说,如果我在单元格中停止移动,代码就不会执行。

osh3o9ms

osh3o9ms2#

“在单元格中放置按钮”的替代方法

选择要使用工作表事件执行代码的单元格:Worksheet_SelectionChange
将代码放在特定工作表的模块中,而不是工作簿模块中。根据需要为单元格添加颜色/边框/文本;单元格在任何计算机或屏幕上都是单元格。当用户点击一个简短的标签/描述时,我用它来引用加载到用户表单中的帮助,从帮助工作表上的查找中。这在合并的单元格上作为按钮工作。使用单元格/按钮避免了来自IT的Active-X对象投诉。
需要考虑的事情,示例代码如下:

  1. Target.Address使用“$”字符返回绝对地址
    1.即使只有一个单元格/按钮,也可以在代码中使用Select Case,这样可以简化以后添加单元格/按钮的过程
    1.考虑在电子表格中使用命名区域,并在代码中引用它们。这样,VBA就不会在意您是否移动了单元格/按钮
  • 如果已合并单元格并为其创建了命名区域,请记住,在电子表格中,命名区域仅指向左上角的单元格
  • 但是,合并区域的Target.Address返回整个区域,而不仅仅是一个单元格。如果Select Case引用Target左上角单元格的地址,则可以避免此问题。
  • 使用Target.Cells(1,1).Address
  • 合并单元格的错误选择:不要使用MergeArea.AddressMergeArea不适用于合并单元格[只适用于单个单元格];它返回单元格所在的合并范围。
    示例代码
'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

uqzxnwby

uqzxnwby3#

@John我知道这是多年以后的事了,但是对于你使用的最后一个公式来说,它是完美的,但是,每当我点击单元格时,它执行模块,但是它要么从0开始,从那里开始,要么从它改变的最后一个数字继续,而不是单元格中的当前数字。你知道为什么吗?
即A1单元格的值为100。第一次点击A2将该值更改为0。第二次点击A2将该值更改为1、2、3、4。将A1中的值更改回100。再次点击A2,值将继续为5、6、7、8等。

相关问题