读取Word VBA的List.Range属性为何会修改文档并添加撤销项?
Word 2007 VBA读取List.Range触发意外文档修改问题
问题现象
在Word 2007版本中,仅通过VBA读取List.Range对象(或其属性)时,文档会被意外标记为修改状态,撤销栈中新增一项名为“Bullets and Numbering”的操作记录,而官方文档并未提及该读取操作会导致文档修改。
复现步骤
- 打开空白Word文档
- 创建一个列表(编号或项目符号均可),并至少输入一个列表项
- 点击快速访问工具栏中撤销按钮旁的向下箭头查看撤销栈,此时应有两项:“Bullet Default”和“Typing”,符合预期
- 按Alt-F11打开VBA IDE
- 为当前文档创建一个空代码模块
- 插入以下代码:
Public Sub Test() Dim x As Long x = ActiveDocument.Lists(1).Range.Start End Sub
- 按F5运行宏
- 返回Word窗口再次查看撤销栈,此时新增了一项名为“Bullets and Numbering”的撤销项
补充说明
无需访问List.Range的具体属性,仅读取List.Range对象本身(无论是创建引用还是复制对象)都会触发文档修改,并在撤销栈中添加“Bullets and Numbering”项:
'以下任意一个子程序都会导致文档修改 Public Sub Test_A() Dim x As Range Set x = ActiveDocument.Lists(1).Range End Sub Public Sub Test_B() Dim x As Range Set x = ActiveDocument.Lists(1).Range.Duplicate End Sub
疑问
- 为何仅读取Range对象的属性就会触发文档修改?
- 如何实现仅读取数据而不修改Word文档?
- 该现象是否会在其他Office版本中出现?
内容的提问来源于stack exchange,提问作者Regus Pregus
相关产品推荐
相关产品推荐

