实例需求:某预测模型有4个输入参数,使用过程中需要依次分别加载4组不同的参数,参数组位于工作表中的第4行到第7行,并且在A列中添加了四个窗体控件按钮,单击某个按钮,希望将相应行的数据(一组参数)加载到第2行单元格中。
对于略有VBA基础的人来说,解决这个问题并不难,每个按钮写一个事件代码,将相应行的四个参数拷贝(写入)到第2行单元格中,但是如果要求四个按钮共用同一个事件代码,那么如何实现这个需求呢?
示例代码如下。
Sub LoadParameters()
Dim s As Shape
For Each s In ActiveSheet.Shapes
If s.Type = msoFormControl Then
If Replace(s.Name, "Button", "按钮") = Application.Caller Then
[b2].Resize(1, 4).Value = s.TopLeftCell.Offset(0, 1).Resize(1, 4).Value
End If
End If
Next
End Sub
【代码解析】
可以使用Shapes对象集合循环遍历工作表中的Shape,并根据其类型来定位窗体控件按钮。
第3~9行代码用于循环遍历工作表中的Shape对象。
第4行代码根据Type
属性识别窗体控件。
窗体控件按钮的Name
属性是Button x
的形式,Application.Caller
返回调用此事件过程的控件名称,其值为按钮 x
的形式,因此第5行代码需要使用Replace函数进行替换,进而确定被点击按钮控件。
第6行代码中,使用控件的TopLeftCell
属性返回按钮所在单元格,然后将该行的参数写入到第2行的单元格中。
只要使用按钮控件的指定宏
功能,关联LoadParameters
过程,然后单击按钮,就可以加载相应的参数组。
灵活使用对象的属性与方法通常可以简化VBA代码过程。