添加/减去按钮Excel VBA


4

以下是此图片中我的项目示例

在此输入图像描述

我喜欢收集,所以我在Excel中制作库存表。

我想创建一种方法,我可以单击一个按钮,它会影响下一个或上一个单元格

例如:

单元格C3将有一个Add按钮,单元格D3将具有该项目的副本数量,而单元格E3将具有一个Subtract按钮。通过单击C3中的按钮,它将向Cell D3中的数字添加一个。如果单击C1中的按钮,它将从单元格D3中减去。似乎很直接。

尽管如此:

我每张纸上有200件物品,如20张(不在示例中)。我想要一些方法,我可以将宏添加到所有按钮,而无需为每个按钮创建一个特定的新宏。我也不希望它与所选单元格一起使用。它需要影响添加按钮右侧的单元格和减法按钮左侧的单元格。

我到处寻找答案,我非常接近解决方案。

这是我能找到的最接近的东西,但它并不是我不喜欢的东西:

 Sub AddOne()
 ActiveCell.Value = ActiveCell.Value + 1
 End Sub

 Sub SubtractOne()
 ActiveCell.Value = ActiveCell.Value - 1
 End Sub

我希望这是有道理的,谢谢大家的时间。


所以你想要什么?什么东西可以精确定位每个细胞或与活跃细胞一起使用的东西?
Raystafarian 2014年

I have like 200 items per sheet on like 20 sheets - 那么,你有多少张有多少张?一般来说,第一个问题很好,+ 1
Dave

基本上是Raystafarian我有两种选择。它们都不是我想要的。我想要一个通用的VBA代码来制作可以从中间单元格中加减的按钮。我知道有一个VBA代码可以从特定单元格中添加/减去。我会添加图片,这可能会有所帮助。对不起,我是这个网站的新手,也是半新的Excel。
Corkrum 2014年

Answers:


4

您的解决方案不起作用的原因是,ActiveCell当用户单击按钮时,工作表的值不会更改 - 他们单击按钮而不是单元格。

有几种方法可以解决这个问题。您可以创建许多按钮并使用一个通用子工作来完成工作,也可以捕获单元格更改事件并对其进行响应。第一个是更好的用户体验,但最初设置的工作量更大。

方法1:按钮

此方法使用按钮的名称在适当的单元格上执行相应的操作。作为概述,创建所有按钮,并让每个按钮调用相同的通用VBA子,这将反过来找出调用它的按钮,并执行适当的操作。

让我们假设你会打电话给你的按钮之类的东西ADD_D3SUB_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):
在此输入图像描述

最后,上面也应该适用于多张纸,因为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

打破它:

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

我们选择数字单元格的原因是,它的动作选择关闭+-细胞,这样就可以再次点击它。如果您想要处理这些单元格,则需要暂时​​禁用此子单元,例如Exit Sub在顶部放置一行。

小注意:Worksheet_SelectionChange如果你在工作表的宏中工作,你会使用它: 在此输入图像描述

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

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

相同的代码应该可以工作 - 在这种情况下,它将适用于工作簿中的每个工作表。


实施例的电子表格示出了两个示例中在这里


没问题 - 它解决了这个问题吗?
杰夫

还没有,我还是想弄清楚。我正在遵循指令的顶部。一切看起来都一样,但第一个运行错误,另一个我不知道如何使单元格可点击。所以我在两个人身上都运气好了。
Corkrum 2014年

对于第二个,您根本不需要使单元格可点击; magic是以sub(Worksheet_SelectionChange)的名义命名的,每次单击任何单元格时都会触发sub 。该子只是忽略了它不感兴趣的细胞。
Geoff

这绝对是我会使用的解决方案(“hacky”选择更改)。这意味着您可以将您的可收集名称,加号和减号放在您想要的任何地方,它将起作用。而且你不需要乱用表单控件。
Jonny Wright

请参阅我的小编辑 - 您可能希望将代码放入ThisWorkbook,在这种情况下您可以使用Workbook_SheetSelectionChange。这为您提供全局点击处理。
杰夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.