如何解决Excel 2010用户窗体中两个重叠List Box显示顺序不稳定的问题
问题成因
这是Excel 2010 VBA用户窗体的已知固有bug,核心触发逻辑如下:
- 当两个同类型ActiveX控件存在重叠区域时,VBE设计视图的视觉叠放效果会优先读取控件创建时的初始顺序,但是控件的Z-Order(Z轴层级)属性在窗体初始化、退出运行状态的过程中会出现读写不一致的问题,手动设置的置于顶层/底层操作不会被持久化存储
- Excel 2010的窗体渲染引擎处理重叠的同类型控件时,会错误地将尺寸更小的控件默认提升层级,无视手动设置的叠放属性
- 系统非100% DPI缩放设置会放大该问题,此时控件的位置、层级属性的读写错误概率会显著提升
- 该bug仅存在于Office 2010及更早版本,Office 2013及后续版本已经修复了该异常
解决办法
方案1:运行时主动指定层级(优先推荐)
在用户窗体的Initialize事件中添加代码手动指定两个ListBox的叠放顺序,无论设计视图显示是否异常,运行时都会按照代码逻辑渲染:
Private Sub UserForm_Initialize() ' 示例中ListBox1为需要放在底层的大尺寸ListBox,ListBox2为需要放在顶层的小尺寸ListBox,请根据实际控件名修改 ListBox1.ZOrder fmZOrderBack ListBox2.ZOrder fmZOrderFront End Sub
方案2:调整控件创建顺序
无需添加代码的场景下,删除现有两个ListBox控件,按照从底层到顶层的顺序重新创建:先创建需要放在后方的大尺寸ListBox,后创建需要放在前方的小尺寸ListBox,Excel 2010会默认将创建顺序作为Z-Order的最终判定依据,不会再出现层级错乱问题。
方案3:适配DPI设置
如果当前系统DPI缩放比例不为100%,将缩放调整为100%后重启Excel,再重新设置控件叠放顺序,即可解决设计视图下控件自动移位的异常。
内容的提问来源于stack exchange,提问作者karma
相关产品推荐
相关产品推荐

