Word VBA遍历文本框时MsgBox前选中状态无法显示如何解决
Word VBA 文本框选中渲染问题修复方案
仅需将代码中的Application.ScreenRefresh替换为DoEvents即可实现预期效果。
原理说明
Word 内 VBA 代码的执行优先级高于界面渲染任务,ScreenRefresh仅会触发一次重绘请求,但不会等待重绘操作实际完成。后续弹出的 MsgBox 会直接阻塞界面线程,导致文本框的选中高亮效果来不及渲染就被暂停。DoEvents会主动将控制权临时交还给操作系统,等待所有待处理的界面消息(包括形状选中的高亮渲染任务)全部处理完成后,再继续执行后续的 MsgBox 调用,就能在弹窗弹出前正常显示当前选中的文本框。
修复后完整代码
Sub AskAboutTextBoxes() Dim objShape As Shape Dim iAnswer As Integer Dim i as Integer Application.ScreenUpdating = True For i = ActiveDocument.Shapes.Count To 1 Step -1 If ActiveDocument.Shapes(i).Type = msoTextBox Then ActiveDocument.Shapes(i).Select ' 替换原Application.ScreenRefresh为DoEvents DoEvents iAnswer = MsgBox("Delete this box?", vbYesNoCancel, "Located Text Box") If iAnswer = vbYes Then ActiveDocument.Shapes(i).Delete ElseIf iAnswer = vbCancel Then Exit For End If End If Next End Sub
兼容方案(可选)
如果你使用的Word版本较旧,单独使用DoEvents仍存在渲染不及时的问题,可以额外补充一行极短延迟代码:
DoEvents ' 延迟1毫秒等待渲染完成 Application.Wait Now + TimeValue("00:00:01") / 1000
内容的提问来源于stack exchange,提问作者racketteer
相关产品推荐
相关产品推荐

