Vba 获取我当前选择的标题编号

Vba 获取我当前选择的标题编号,vba,ms-word,Vba,Ms Word,我已经尝试了我能找到的一切,只为微软Word中的选择标题编号 我试过的 Selection.HomeKey wdline, wdExtend Selection.Expand wdline Selection.HomeKey wdParagraph, wdExtend ect. Simular stuff. 标题示例 4.2.3 This is a heading 我尝试的每件事都只是给我标题中的文本,而不是数字 我要它回来 4.2.3 我无法将文档编号转换为文本,因为它会弄乱间距

我已经尝试了我能找到的一切,只为微软Word中的选择标题编号

我试过的

Selection.HomeKey wdline, wdExtend
Selection.Expand wdline
Selection.HomeKey wdParagraph, wdExtend
ect. Simular stuff.
标题示例

4.2.3     This is a heading
我尝试的每件事都只是给我标题中的文本,而不是数字

我要它回来

4.2.3

我无法将文档编号转换为文本,因为它会弄乱间距。

我已通过使用解决了我的问题

Selection.Paragraphs(1).Range.ListFormat.ListString
这只给了我号码


为什么标题是段落???我只是不知道。

我最近不得不处理Word文档的解析,需要得到标题编号,发现每一行都会增加Word的段落

我制作了一个脚本,用于解析word文档并使用以下内容构建一个数组: -标题案文 -段落编号(按word的理解) -掘进深度 -重新构造的品目号

您可以使用parGetStr查询,将段落编号作为参数,宏将从给定的段落编号中返回标题编号(回答前面的问题

parErase将删除该表(如果在使用parGetStr时更改了单词标题并希望更新表,因为数组内容只生成一次,则需要进行此操作)

parDraw并不是真正需要的,除非您希望在新文档中显示表(例如为了调试目的)并依赖于您必须获得的其他脚本(也在我的github上)

您可以在此处找到最新的脚本版本:

“段落”脚本将很快进行扩展和修改。 下面是它的实际代码:

”段落
'获取标题并构建一个包含文本、行号、段落号和深度的表格
'版本:0.4
作者:SMFSW,2016
版权所有:麻省理工学院
'
'待办事项:能够处理修改跟踪(不计算已删除的标题)
'TODO:以另一种方式查找文档结尾(脚本可能无法处理某些凌乱的文档)
'TODO:找到处理下一个标题的方法查找有时不前进(这会导致脚本结束)
Par(x,0):段落刻度中的行(全线到点和回车/AKA段)
PAR(x,1):将字符串编号输出为字符串
PAR(x,2):航向深度
PAR(x,3):标题文本
私人标准杆(500,3)作为变型
作为整数的私有包
作为布尔的私有parInit
'删除全局变量和数组的内容
公共次级帕雷拉斯()
对于i=0到500
对于j=0到3
第(i,j)款=“”
下一个j
接下来我
parCpt=0
parInit=假
端接头
'返回范围r的段落编号
公共函数parGetNum(r为范围)为双精度
作为范围的Dim rParagraphs
双倍调暗CurPos
如果PARIITIT= false,则调用PARGUBE中的PARBUILD PAR选项卡
r、 挑选
CurPos=ActiveDocument.Bookmarks(“\startOfSel”).Start
设置rParagraphs=ActiveDocument.Range(开始:=0,结束:=CurPos)
parGetNum=rParagraphs.parations.Count'使用函数名作为返回值
端函数
'将范围r的段落编号返回为格式化字符串
公共函数parGetStr(r作为范围)作为字符串
双倍调暗CurPos
将tmp设置为字符串:tmp=“”
如果parInit=False,则调用parBuild
r、 挑选
CurPos=parGetNum(r)
对于j=0到parCpt
如果par(j,0)>=CurPos,则
如果j0那么
tmp=par(j-1,1)
其他的
tmp=0'如果在第一个标头之前,则返回0
如果结束
“找到时退出”的退出
如果结束
下一个j
parGetStr=tmp
端函数
在新文档中添加PAR表
公共分包商()
Dim TXT头作为变量
txtHeaders=数组(“行”_
“第章”_
“深度”_
“txt”)
savePerfContext动态文档
如果parInit=False,则调用parBuild
调用TabBug(4, 0,Par,TxHeDead)
restorePerfContext动态文档
端接头
私有子构建()
Dim maxDepth作为整数
将cpt设置为整数
变暗标志为布尔值:标志=真
Dim memStr作为字符串
'parInit设置为True,这样下次调用parGetXXX时将不会再次调用parBuild
parInit=真
'移动到第一个标题(以确定标题深度的文本条带)
Selection.GoTo What:=wdGoToHeading,Which:=wdGoToFirst
Selection.StartOf单位:=WD段落
Selection.MoveEnd单位:=WD段落
'查找如何在Word应用程序中调用标题
暗斑
splt=拆分(Selection.Range.Style.NameLocal,“”)
stripHeader=splt(0)
擦除splt“擦除临时变量splt
'移回文档的开头
Selection.HomeKey单位:=wdStory
'循环,直到到达文档末尾
parCpt=0
而flag=True
Selection.GoTo What:=wdGoToHeading,Which:=wdGoToNext
Selection.StartOf单位:=WD段落
Selection.MoveEnd单位:=WD段落
'获取行数据
strLine=Selection.Range.Text
'检查是否已到达文档末尾
如果memStr与strLine相似,则flag=False
memStr=strLine
par(parCpt,0)=parGetNum(Selection.Range)
par(parCpt,1)=“初始化”为空str以供以后循环
par(parCpt,2)=Val(替换(Selection.Range.Style.NameLocal,stripHeader,“”)
par(parCpt,3)=斯特林
'确定以后的标题的最大深度
如果par(parCpt,2)>maxDepth,则maxDepth=par(parCpt,0)
"处理垃圾线路",
如果是0,那么
“如果深度P-1 n-1等于n和n的线数,则正好在N之前。
如果par(parCpt-1,2)=par(parCpt,2)和par(parCpt-1,0)+1=par(parCpt,0),则
'复制到n-1&不增加包裹
par(parCpt-1,0)=par(parCpt,0)
par(parCpt-1,1)=par(parCpt,1)
par(parCpt-1,2)=par(parCpt,