我在一张表单中有多个复选框,另一张表单中有表单。选中复选框后,相应的内容将作为表单中的一列添加。
我有 500 多个复选框,所以我想创建一种简单的方法来执行此操作。例如,我有以下复选框:
- 项目 ID
- 项目名称
- 项目类型
- 项目状态
这些复选框的对象名称以 开头,CB_
因此 Project_Type 复选框的对象名称是CB_Project_Type
。
现在,我为每个复选框创建了一个当它被点击时的函数。例如,函数名称是,Sub CB_Project_Type_Click()
然后该函数将检查该列是否存在并将其添加到表单中。
为所有复选框创建一个函数是愚蠢的。我想要一个动态方法。类似这样:如果已选中“ANY”复选框,则使用该复选框对象名称将具有匹配名称的列添加到表单表。
我现在正在使用这个:
Sub CB_Projects_Type_Click()
CB_List "Projects_Type"
End Sub
Sub CB_List(Name As String)
If ActiveSheet.Shapes("CB_" & Name).ControlFormat.Value = 1 Then
For i = 0 To 99
If IsEmpty(Sheets("English").Range("B1").Offset(0, i)) Then
Sheets("English").Columns(i + 2).Copy
Sheets("English").Columns(i + 3).Insert
Sheets("English").Range("B1").Offset(0, i).Value = Name
i = 99
End If
Next i
Else
For i = 0 To 99
If Sheets("English").Range("B1").Offset(0, i).Value = Name Then
Sheets("English").Columns(i + 2).Delete
i = 99
End If
Next i
End If
End Sub
所以您可以看到,至少我使用了一个函数从复选框中获取该列,但我仍然需要为每个复选框创建一个 Sub。我如何使用 1 个终极函数从对象名称中获取函数名称?
我希望我说清楚了。
答案1
循环检查复选框以找到已选中的复选框。
For Each c in ActiveSheet.CheckBoxes
If c.Value Then CB_List(c.Name)
Next c
编辑:我重读了你的代码,发现你的问题比我最初想象的要复杂一些。为了添加你需要的数据并删除你不需要的数据,我认为你需要每次循环遍历所有复选框。你可以制作一个用户点击的按钮并执行如下操作:
Sub Button1_click()
Dim c as Checkbox
For Each c in ActiveSheet.CheckBoxes
CB_List(c.Name)
Next c
End Sub
或者你可能必须这样做:
Sub Button1_click()
Dim c as OLEObject
For Each c in ActiveSheet.OLEObjects
CB_List(c.Name)
Next c
End Sub
并修改此行:
ActiveSheet.Shapes("CB_" & Name).ControlFormat.Value = 1
更改为:
ActiveSheet.Shapes(Name).ControlFormat.Value = 1