Excel VBA复制工作表时绑定宏的按钮未复制问题求助
解决Excel宏复制工作表后丢失绑定宏按钮的问题
我来帮你搞定这个困扰!问题的根源就在你宏里的这段代码:
For Each sh In ActiveSheet.Shapes sh.Delete Next sh
原因分析
手动复制工作表时按钮能保留,是因为手动操作不会执行任何删除形状的逻辑;但你的宏里这段循环会删除当前工作表里所有的Shape对象——而绑定宏的按钮(不管是表单控件按钮还是ActiveX按钮)都属于Shape的范畴,所以被误删了。
修复方案
根据你的需求,我们可以修改这段循环,让它只删除你不需要的形状,保留按钮。这里提供两种实用思路:
方案1:排除所有按钮类型的形状
如果你的按钮是表单控件(比如“开发工具”里的表单按钮)或者ActiveX控件,直接排除这两类形状即可:
For Each sh In ActiveSheet.Shapes ' 排除表单控件按钮和ActiveX控件按钮 If sh.Type <> msoFormControl And sh.Type <> msoOLEControlObject Then sh.Delete End If Next sh
方案2:只删除特定形状(更精准)
如果你知道要删除的是哪些特定形状(比如临时图形、文本框),可以给这些形状统一命名前缀,然后只删除匹配的对象。比如假设要删除的形状都以Temp_开头:
For Each sh In ActiveSheet.Shapes If Left(sh.Name, 5) = "Temp_" Then sh.Delete End If Next sh
完整修改后的宏代码
把修改后的循环替换到原宏里,完整代码如下:
Sub CandD() Application.ScreenUpdating = False Application.DisplayAlerts = False Dim sh As Shape, strtSh As Worksheet Set strtSh = ActiveSheet Sheets("BM Condition").Copy After:=Sheets(Sheets.Count) ActiveSheet.Name = "BM Condition" & Sheets.Count - 1 Range("E14:E33,I14:I33,M14:M33").ClearContents ' 修改后的循环:保留按钮 For Each sh In ActiveSheet.Shapes If sh.Type <> msoFormControl And sh.Type <> msoOLEControlObject Then sh.Delete End If Next sh strtSh.Select Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
测试建议
记得先备份你的Excel文件,再运行修改后的宏,检查新复制的工作表里按钮是否保留,同时确认不需要的数据和形状是否被正确清理。
内容的提问来源于stack exchange,提问作者J Chase
相关产品推荐
相关产品推荐

