如何解决VBA命令按钮打印后无法恢复尺寸及iShp重复调用报错问题?
解决VBA命令按钮收缩打印后无法恢复尺寸及对象引用报错问题
看起来你已经完成了核心功能的大半,问题主要出在重复获取Shape对象以及未提前保存按钮原始属性这两点上。我来帮你调整代码,彻底解决这两个问题:
修改后的完整代码
Sub PrintButton_Click() ' 声明变量,一次性获取按钮对象并保存原始属性 Dim printBtn As Shape Dim origWidth As Double, origHeight As Double Dim origTop As Double, origLeft As Double ' 用Application.Caller直接获取当前点击的按钮,避免硬编码名称 Set printBtn = Me.Shapes(Application.Caller) ' 提前保存按钮的所有原始属性(尺寸+位置,防止收缩时位置偏移) origWidth = printBtn.Width origHeight = printBtn.Height origTop = printBtn.Top origLeft = printBtn.Left ' 执行收缩(设为极小尺寸实现隐藏效果) printBtn.Width = 1 printBtn.Height = 1 ' 弹出打印对话框,捕获用户操作结果 Dim isPrinted As Boolean isPrinted = Application.Dialogs(xlDialogPrint).Show ' 恢复按钮的原始属性(不管用户是打印完成还是取消对话框,都恢复) printBtn.Top = origTop printBtn.Left = origLeft printBtn.Width = origWidth printBtn.Height = origHeight End Sub
关键修复点说明
避免重复获取Shape对象
你之前两次调用iShp可能导致引用冲突或对象查找失败。这里我们只初始化一次printBtn对象,全程复用这个引用,彻底解决对象调用报错的问题。提前保存原始属性
按钮收缩后,再读取它的尺寸已经不是原始值了,所以必须在收缩前就把宽度、高度、位置这些属性存在变量里,恢复时直接用这些变量值,保证尺寸准确还原。灵活获取按钮对象
使用Application.Caller代替硬编码按钮名称(比如Me.Shapes("CommandButton1")),不管按钮叫什么名字,代码都能正常工作,也减少了拼写错误的可能。处理打印对话框的返回值
变量isPrinted会返回True(用户点击了打印)或False(用户取消了对话框)。如果你的需求是只有打印完成才恢复按钮,可以把恢复代码改成下面这样:If isPrinted Then printBtn.Top = origTop printBtn.Left = origLeft printBtn.Width = origWidth printBtn.Height = origHeight End If
额外优化提示
如果按钮收缩后还是能看到极小的一块,可以临时隐藏按钮,恢复时再显示(注意:隐藏后按钮不会出现在打印内容里,按需选择):
' 收缩时隐藏按钮 printBtn.Visible = False ' 恢复时显示按钮 printBtn.Visible = True
内容的提问来源于stack exchange,提问作者beewerks
相关产品推荐
相关产品推荐

