Excel VBA复制工作表时如何同步保留绑定了宏的按钮?
解决方案
你原来的代码仅复制了工作表单元格内容,没有包含控件对象,下面是适配两种常见按钮类型的实现代码:
方案1:适用于表单控件(开发工具插入的普通表单按钮)
Public Sub DuplicateSheetWithButtons() Dim srcSheet As Worksheet Dim newSheet As Worksheet Dim shp As Shape ' 定义原工作表 Set srcSheet = ActiveSheet ' 复制工作表到末尾 srcSheet.Copy After:=Worksheets(Sheets.Count) Set newSheet = ActiveSheet ' 重命名工作表,规避重名错误 On Error Resume Next newSheet.Name = "Test Sheet" On Error GoTo 0 ' 复制原表所有表单控件及绑定宏 For Each shp In srcSheet.Shapes If shp.Type = msoFormControl Then shp.Copy newSheet.Paste ' 保持新按钮位置与原表一致 With newSheet.Shapes(newSheet.Shapes.Count) .Top = shp.Top .Left = shp.Left .OnAction = shp.OnAction ' 保留原绑定的子过程 End With End If Next End Sub
方案2:适用于ActiveX控件按钮
如果使用的是ActiveX类型的按钮,使用如下代码:
Public Sub DuplicateSheetWithActiveXButtons() Dim srcSheet As Worksheet Dim newSheet As Worksheet Dim shp As Shape Set srcSheet = ActiveSheet srcSheet.Copy After:=Worksheets(Sheets.Count) Set newSheet = ActiveSheet On Error Resume Next newSheet.Name = "Test Sheet" On Error GoTo 0 For Each shp In srcSheet.Shapes If shp.Type = msoOLEControlObject Then shp.Copy newSheet.Paste With newSheet.Shapes(newSheet.Shapes.Count) .Top = shp.Top .Left = shp.Left End With End If Next End Sub
注意事项
- 若工作表同时存在表单控件和ActiveX控件,可将循环内的判断条件合并为
If shp.Type = msoFormControl Or shp.Type = msoOLEControlObject Then,即可同时复制两类控件 - 表单控件绑定的公共子过程复制后可直接触发运行;ActiveX控件的点击事件默认存放在原工作表的代码模块中,若要新表的ActiveX按钮正常工作,可将事件代码移至标准模块设置为公共过程,或手动将对应事件代码复制到新工作表的代码模块即可。
内容的提问来源于stack exchange,提问作者canislupus
相关产品推荐
相关产品推荐

