您的解决方案不起作用的原因是,ActiveCell
当用户单击按钮时,工作表的值不会更改 - 他们单击按钮而不是单元格。
有几种方法可以解决这个问题。您可以创建许多按钮并使用一个通用子工作来完成工作,也可以捕获单元格更改事件并对其进行响应。第一个是更好的用户体验,但最初设置的工作量更大。
方法1:按钮
此方法使用按钮的名称在适当的单元格上执行相应的操作。作为概述,创建所有按钮,并让每个按钮调用相同的通用VBA子,这将反过来找出调用它的按钮,并执行适当的操作。
让我们假设你会打电话给你的按钮之类的东西ADD_D3
和SUB_D3
,例如增加/减少D3中的值。
首先,创建一个子程序来在VBA中完成工作:
Sub AdjustValue()
Dim btnName As String
Dim targetCell As String
Dim addAmount As Integer
btnName = Application.Caller
targetCell = Mid(btnName, 5, Len(btnName))
addAmount = IIf(Left(btnName, 3) = "ADD", 1, -1)
ActiveSheet.Range(targetCell).Value = _
ActiveSheet.Range(targetCell).Value + addAmount
End Sub
打破它:
- Application.Caller为您提供调用者的名称,在本例中为按钮的名称
- 我们通过跳过前四个字符来取出目标单元格的名称
- 我们根据前三个字符确定是否添加或减少
- 我们使用目标单元格名称来更新工作表单元格
接下来,创建按钮; 添加表单控件按钮,您的电子表格的每一个的+和-你需要的按钮。
对于每一个,如上所述,基于它应该靶向的单元为其分配系统名称。例如,在上面的屏幕截图中,您可以命名前两个按钮ADD_D3
和SUB_D3
。
要重命名按钮,右键单击它以选择它,然后在工作表左上角的地址框中用您的新名称覆盖名称(例如按钮1):
最后,上面也应该适用于多张纸,因为sub用于ActiveSheet
访问单元格。
方法2:选择更改
这个设置起来要简单得多,但有点笨拙。首先,在每个单元格中设置带有加号和减号的工作表,着色它们,但是要使它们看起来更像按钮。例如:
请注意,您必须使用单引号(')将符号作为文本放入单元格中,例如'-
和'+
(这在示例顶部的公式栏中可见)。
然后,创建一个例程来响应正在选择的其中一个单元格:
Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim numCell As Range
If Target.Count <> 1 Then Exit Sub
If Target.Value = "+" Then
Set numCell = Target.Offset(0, -1)
numCell.Select
numCell.Value = numCell.Value + 1
ElseIf Target.Value = "-" Then
Set numCell = Target.Offset(0, 1)
numCell.Select
numCell.Value = numCell.Value - 1
End If
End Sub
打破它:
- sub的名称很重要 - 只要用户点击任何单元格,它就会告诉Excel运行你的sub
- 该
Target
参数是被点击了用户的电池,,但它可能是一拖选择了。我们首先检查大小是否正好为1,如果不是则退出。
- 接下来,我们检查其值
+
或-
值。请注意,我们不必检查引号。
- 然后我们使用该
Offset
命令向左或向右找到单元格,具体取决于我们是处理a +
还是-
起始单元格
- 一旦我们有了数字单元格,我们首先选择它,然后向上或向下更改其值
我们选择数字单元格的原因是,它的动作选择关闭的+
或-
细胞,这样就可以再次点击它。如果您想要处理这些单元格,则需要暂时禁用此子单元,例如Exit Sub
在顶部放置一行。
小注意:Worksheet_SelectionChange
如果你在工作表的宏中工作,你会使用它:
如果您在ThisWorkbook
模块中工作,则需要使用全局选择更改子:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Code goes in here
End Sub
相同的代码应该可以工作 - 在这种情况下,它将适用于工作簿中的每个工作表。
实施例的电子表格示出了两个示例中在这里。