这是此图中我的项目的一个例子
我喜欢收集,所以我正在用 Excel 制作库存表。
我想创建一种方法,让我可以单击一个按钮并影响下一个或上一个单元格
例如:
单元格 C3 上会有一个Add按钮,单元格 D3 上会显示我拥有的该项目的副本数量,单元格 E3 上会有一个Subtract按钮。单击 C3 中的按钮,单元格 D3 中的数字会再加一。如果单击 C1 中的按钮,单元格 D3 中的数字会减一。这似乎很简单。
但条件如下:
我在大约 20 张纸上每张纸上有大约 200 个项目(不在示例中)。我希望有某种方法可以将宏添加到所有按钮,而不必为每个按钮创建一个新的宏。我也不希望它与选定的单元格一起工作。它需要影响添加按钮右侧的单元格和减法按钮左侧的单元格。
我到处寻找答案,并且已经非常接近解决方案了。
这是我能找到的最接近的东西,但这不是我想要的:
Sub AddOne()
ActiveCell.Value = ActiveCell.Value + 1
End Sub
Sub SubtractOne()
ActiveCell.Value = ActiveCell.Value - 1
End Sub
我希望这是有意义的,并感谢大家的时间。
答案1
您的解决方案不起作用的原因是,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):
最后,上述方法也适用于多张工作表,因为子工作表用于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
具体来说:
- 子程序的名称很重要 - 它告诉 Excel 在用户单击任何单元格时运行你的子程序
- 参数
Target
是用户点击的单元格,但也可以是拖动选择。我们首先检查大小是否正好是 1,如果不是,则退出。 - 接下来我们检查它的值是否为 a
+
或-
value。请注意,我们不必检查引号。 - 然后,我们使用该
Offset
命令找到左侧或右侧的单元格,具体取决于我们处理的是单元格+
还是-
起始单元格 - 一旦我们有了数字单元格,我们首先选择它,然后向上或向下更改它的值
我们选择数字单元格的原因是它移动了选择离开+
或单元-
格,以便您可以再次单击它。如果您想处理这些单元格,则需要暂时禁用此子项,例如通过在Exit Sub
顶部添加一行。
小提示:Worksheet_SelectionChange
如果您在工作表的宏中工作,那么您会使用以下内容:
如果您在模块中工作ThisWorkbook
,您将需要使用全局选择更改子:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Code goes in here
End Sub
相同的代码应该可以工作 - 并且在这种情况下可以适用于工作簿中的每一张工作表。
显示两个示例的示例电子表格这里。