添加/减去按钮 Excel VBA

添加/减去按钮 Excel VBA

这是此图中我的项目的一个例子

在此处输入图片描述

我喜欢收集,所以我正在用 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

具体来说:

  1. Application.Caller 为您提供呼叫者的名称,在本例中是按钮的名称
  2. 我们通过跳过前四个字符来删除目标单元格的名称
  3. 我们根据前三个字符判断是加还是减
  4. 我们使用目标单元格名称来更新工作表单元格

接下来,创建按钮;将所需的每个按钮的 +“表单控制”按钮添加到电子表格中。-

对于每个按钮,根据其应定位的单元格为其分配一个系统名称,如上所述。例如,在上面的屏幕截图中,您可以将前两个按钮命名为ADD_D3SUB_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

具体来说:

  1. 子程序的名称很重要 - 它告诉 Excel 在用户单击任何单元格时运行你的子程序
  2. 参数Target是用户点击的单元格,但也可以是拖动选择。我们首先检查大小是否正好是 1,如果不是,则退出。
  3. 接下来我们检查它的值是否为 a+-value。请注意,我们不必检查引号。
  4. 然后,我们使用该Offset命令找到左侧或右侧的单元格,具体取决于我们处理的是单元格+还是-起始单元格
  5. 一旦我们有了数字单元格,我们首先选择它,然后向上或向下更改它的值

我们选择数字单元格的原因是它移动了选择离开+或单元-格,以便您可以再次单击它。如果您想处理这些单元格,则需要暂时​​禁用此子项,例如通过在Exit Sub顶部添加一行。

小提示:Worksheet_SelectionChange如果您在工作表的宏中工作,那么您会使用以下内容: 在此处输入图片描述

如果您在模块中工作ThisWorkbook,您将需要使用全局选择更改子:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'Code goes in here
End Sub

相同的代码应该可以工作 - 并且在这种情况下可以适用于工作簿中的每一张工作表。


显示两个示例的示例电子表格这里

相关内容