Excel 365 VBA点击事件无法修改frmVorlage窗体宽高问题
Excel 365 VBA用户窗体点击事件无法修改宽高属性解决方案
问题复现条件
- 运行环境:Excel 365 VBA编辑器
- 目标窗体:名称为
frmVorlage的用户窗体,属性窗口初始设置为宽度455.25、高度1023.75 - 交互逻辑:点击窗体上名为
lblTtlMaximize的标签时,将窗体调整为1920*1080尺寸并定位到屏幕左上角 - 异常现象:
- 原有点击事件中
Top、Left位置属性赋值可正常生效 - 给
Height、Width赋值后,通过Debug.Print读取属性值已经更新为目标值,但窗体实际显示尺寸无变化 - 相同宽高赋值代码写在窗体
Initialize初始化事件中可正常生效 - 替换为
Me.Width、Me.Height写法依然无法解决尺寸不更新的问题
- 原有点击事件中
原有异常代码:
Private Sub lblTtlMaximize_Click() frmVorlage.Height = 1080 frmVorlage.Width = 1920 frmVorlage.Top = 0 frmVorlage.Left = 0 End Sub
故障原因
这是Excel 365版本VBA非模态窗体的已知渲染bug:当窗体设置为ShowModal = False(非模态显示)且完成首次渲染后,直接修改Width、Height属性只会更新内存中的属性值,不会触发窗体的重绘逻辑,因此视觉上尺寸不会发生变化;位置属性Top、Left不受该bug影响。初始化事件中赋值生效是因为此时窗体还未完成首次渲染,属性修改会直接纳入首次渲染的参数。
修复方案
二选一即可,优先推荐方案1,兼容性最好:
方案1:Hide+赋值+Repaint+Show(无兼容问题)
通过临时隐藏窗体解除渲染锁,赋值后强制重绘再显示,所有Excel 365版本都可正常生效:
Private Sub lblTtlMaximize_Click() With frmVorlage .Hide ' 临时隐藏解除渲染锁定 .Width = 1920 .Height = 1080 .Top = 0 .Left = 0 .Repaint ' 强制重绘窗体 .Show ' 重新显示 End With End Sub
如果担心隐藏再显示带来的闪烁,可以把窗体的Visible属性设为False代替Hide,效果一致,闪烁感更弱。
方案2:属性刷新触发重绘(无闪烁)
不想隐藏窗体的话,可以通过修改边框属性强制触发系统重绘逻辑,全程窗体保持显示无闪烁:
Private Sub lblTtlMaximize_Click() With frmVorlage ' 先赋值宽高 .Width = 1920 .Height = 1080 ' 切换边框属性触发强制重绘 .BorderStyle = fmBorderStyleNone .BorderStyle = fmBorderStyleSingle ' 最后赋值位置 .Top = 0 .Left = 0 End With End Sub
内容的提问来源于stack exchange,提问作者FriendlyFoxFromSpace
相关产品推荐
相关产品推荐

