Word 2010 VBA中Public变量与Variables项值不一致的原因咨询
问题原因解析:VBA变量与Word文档Variables集合的区别
这事儿我太清楚了!你遇到的数值不一致问题,核心是把VBA模块级公共变量和Word文档内置的Variables集合搞混了——这俩完全是独立的存储实体,根本不是一回事儿。
先搞懂两个「LastBodyPage」的本质区别
- 模块级公共变量
Public LastBodyPage:这是你在VBA代码里声明的变量,它存放在VBA运行时的内存中,只在当前VBA会话(也就是你打开文档、运行代码的这段时间)有效。关闭文档再重新打开,这个变量的值就会丢失,除非你特意把它写入文档存储。 - Word文档的
Variables.item("LastBodyPage"):这是Word文档本身自带的Variables集合里的条目,它是直接存储在文档文件里的。就算你关闭文档再重新打开,这个值依然会保留,属于文档的持久化存储数据。
为什么两个消息框数值不一样?
你的tryit过程只给VBA模块里的LastBodyPage赋值了,完全没碰文档Variables集合里的那个条目!所以:
- 第一个
MsgBox Variables.item("LastBodyPage").Value弹出的是文档里之前存储的旧值(53)——这个值可能是你之前某次测试、或者其他代码写入的; - 第二个
MsgBox LastBodyPage弹出的是你刚在tryit里计算出来的新值(50),也就是当前光标所在书签的页面号。
如何让两者数值一致?
如果你的需求是把计算出的页面号持久化保存到文档里,需要在tryit过程中添加一行代码,把模块变量的值写入文档Variables集合:
Public LastBodyPage Sub tryit() Selection.GoTo What:=wdGoToBookmark, Name:="AppendixStart" LastBodyPage = Selection.Information(wdActiveEndPageNumber) ' 新增:把值写入文档Variables集合 Variables("LastBodyPage").Value = LastBodyPage End Sub Sub vardel() MsgBox Variables.item("LastBodyPage").Value ' 现在会和模块变量值一致 MsgBox LastBodyPage End Sub
或者你也可以直接跳过模块变量,直接把计算结果写入文档Variables:
Sub tryit() Selection.GoTo What:=wdGoToBookmark, Name:="AppendixStart" Variables("LastBodyPage").Value = Selection.Information(wdActiveEndPageNumber) End Sub Sub vardel() MsgBox Variables.item("LastBodyPage").Value ' 如果需要也可以把文档变量的值读回模块变量 Dim LastBodyPage As Integer LastBodyPage = Variables("LastBodyPage").Value MsgBox LastBodyPage End Sub
内容的提问来源于stack exchange,提问作者Mark Snyder
相关产品推荐
相关产品推荐

