重复出现的vba代码按钮,每个按钮的范围都不同,但遵循规则

时间:2018-11-27 13:45:00

标签: excel vba

我目前在2个不同的工作表上使用2个表。

第一个用作项目列表,第二个用作活动工作表,最终用户可以在其中研究项目,并且可以进行与问题目的无关的几种可能的交互作用。

有没有办法使用按钮名称的一部分来组成我将在代码中使用的范围?

或者,有一种聪明的方法可以使它具有可伸缩性,可能保留1个代码副本,并根据按钮分配范围吗?

Sub Button2_Click()
    Dim cb As Shape
    Dim x As String
    Dim y As Variant
        On Error Resume Next
If IsEmpty(Range("A2").Value) Then
MsgBox "Barcode appears to be empty!"
Exit Sub
Else
        If IsError(Range("E2").Value) Then
            MsgBox "Barcode appears to have no match!"
            Exit Sub
        Else
            y = (Range("J2").Value)
            If IsNumeric(y) Then
                x = Range("J2").Value
            Else
                MsgBox "Ammount to add/subtract must be a number!"
                Exit Sub
            End If

            Set cb = ActiveSheet.Shapes("chkbx2")

            If cb.OLEFormat.Object.Value = 1 Then
                If (Range("E2").Value - Range("J2").Value) < 0 Then
                    MsgBox "quantity can't go below 0"
                Else
                    Range(Range("M2")).Value = Range("E2").Value - Range("J2").Value
                    MsgBox "Subtracted " + x + " part(s) to component: " + CStr(Range("A2").Value)
                End If
            Else
                Range(Range("M2")).Value = Range("E2").Value + Range("J2").Value
                MsgBox "Added " + x + " part(s) to component: " + CStr(Range("A2").Value)
            End If
         End If
End If
End Sub

我只保留了宏的完整代码,以确保没有任何丢失。

我的问题是:我的工作表中当前有25个这些按钮,而且我找不到“自动”改变坐标的方法。
例如,Button2_Click()->使用“ A2”,“ E2”,“ J2”等行2上的坐标,就像Button3_Click()“ A3”,“ E3”,“ J3” ...

当前,我每个按钮手动编写一次代码,这使项目难以升级到更大的比例。

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,并使用以下方法来生成一个有效的代码,而不是同一行的25个实例:

Dim r As Variant
Dim v As Variant
v = Application.Caller
v = Replace(v, "Button ", "")

r = "A" & v

要生成我需要的所有范围,从而在每个范围之前更改r中包含的值,以便在那里获得所需的确切范围,这成功地使项目易于扩展。

注意:使用变量构成范围的合法语法示例为:

这假设您正在通过名为“ Button x”的对象调用此函数
其中x是数字

Sub Button_Click()

Dim r As Variant
Dim v As Variant

v = Application.Caller
v = Replace(v, "Button ", "")

r = "A" & v

If IsEmpty(Range(r).Value) Then
MsgBox "Cell appears to be empty!"
Exit Sub
Else
MsgBox "cell " + r + " contains " + Range(r).Value
End If

End Sub
  • 我清楚地使用了字母+数字组成的单元格符号。
  • 我使用了2个变量,因为我需要组成多个范围,并且允许更简洁的实现方式
  • 我使用“ variant”类型的变量,认为它需要与代码中的不同类型的数据兼容。

注意:这也适用于我在问题中提到的复选框

通常,这将有助于构建可重用的代码,该代码将能够根据分配给调用该按钮的按钮的名称来知道数据的位置,还假定已设置并遵循命名约定,并且它的增量遵循与范围增量有关的规则。

感谢@EvR对帮助我跟踪前进功能的帮助