Vba 确定表是否跨越两页的最快方法是什么?

Vba 确定表是否跨越两页的最快方法是什么?,vba,ms-word,Vba,Ms Word,导致我学习VBA的最初问题如下: 在Word文档中,您有一个长达10000行(数百页)的表。该表在第一行上方有一个段落形式的标题。此标题的样式设置为链接到目录(Style=“Caption”)。表格必须在每页的最后一行断开,标题必须插入到新表格之前,但样式不同,不链接到目录(style=“Caption Cont”) 第一页将如下所示: 第二页将如下所示: 我的第一个解决方案是相对黑客的,一点也不优雅。我已经成功地将以下解决方案组合在一起,效果非常好。但是,由于使用了Range.Informat

导致我学习VBA的最初问题如下:

在Word文档中,您有一个长达10000行(数百页)的表。该表在第一行上方有一个段落形式的标题。此标题的样式设置为链接到目录(
Style=“Caption”
)。表格必须在每页的最后一行断开,标题必须插入到新表格之前,但样式不同,不链接到目录(
style=“Caption Cont”

第一页将如下所示:

第二页将如下所示:

我的第一个解决方案是相对黑客的,一点也不优雅。我已经成功地将以下解决方案组合在一起,效果非常好。但是,由于使用了
Range.Information
,因此确定表格跨页的行号的初始过程非常缓慢。我想知道是否有更快的方法来确定页面底部的行

将文档放入
wdNormalView
每页可以节省大约一秒钟的时间,即使使用
Application.screenUpdate=False

该程序要求光标位于表中的某个位置,这很好,我不希望删除该功能

它目前每分钟大约有120页,大部分时间用于确定要拆分的行(即
splitNum
)。我相信,使用不同的方法来确定
splitNum
会快得多

我无法为使用“重复标题行”向表中添加额外的行。 这将违反我所在行业的规定,不符合规定的文件可能会对公司和未来业务造成巨大打击

代码:

Sub-tblSplit()
双精度时间检查
Application.ScreenUpdating=False
Application.ActiveWindow.View=wdNormalView
时间检查=时间
关于错误转到错误
变暗交叉参考范围、delRange范围、tblR范围、newTbl范围
尺寸tblNumField作为范围,tblNum作为字符串
设置tblNumField=Selection.Tables(1).Range
tblNumField.MoveStart WD段落,-1
tblNum=tblNumField.Words(2)
设置crossRef=选择。表(1)。范围
设置thisTbl=Selection.Tables(1).Rows(1).Range
设置tblR=选择。表(1)。范围
插入样式为“Caption Cont”的标题交叉引用

crossRef.Move wdCharacter,-2
crossRef.InsertCrossReference引用类型:=“表”,引用种类:=_
wdOnlyCaptionText,ReferenceItem:=tblNum,InsertAsHyperlink:=True_
IncludePosition:=False,分隔符枚举数:=False,分隔符字符串:=“”
crossRef.Text=vbCr&“(续)“&vbTab
crossRef.MoveStart字符,1
crossRef.Style=“标题继续”
交叉参考折叠wdCollapseStart
crossRef.InsertCrossReference引用类型:=“表”,引用种类:=_
wdOnlyLabelAndNumber,ReferenceItem:=tblNum,InsertAsHyperlink:=True_
IncludePosition:=False,分隔符枚举数:=False,分隔符字符串:=“”
交叉参考第1段
删除重复标题

Set delRange=crossRef.Duplicate
交叉参考第1段
交叉引用副本
delRange.Text=vbNullString
查找表格跨越两页的行

Dim splitNum As Long,n As Long,i As Long,pageNum As Long
pageNum=tblR.Rows(1).Range.Information(wdActiveEndAdjustedPageNumber)
i=15
做
如果tblR.Rows(i).Next.Range.Information(wdActiveEndAdjustedPageNumber)pageNum,则
splitNum=i
退出Do
如果结束
i=i+1
循环直到i=100'任意上限,以防止无限循环
n=1
拆分和格式化

Do
多芬特
'拆分和格式化
tblR.表格(n).拆分(splitNum)
tblR.Tables(n).Rows.Last.Borders(wdBorderBottom).LineStyle=wdLineStyleSingle
“粘贴这些东西
设置newTbl=tblR.表格(n+1).范围
新条文第2段
新BL.粘贴
新条文第1段
“明显过剩
newTbl.parations.Last.Range.Text=vbNullString
”“接着呢
n=n+1
循环直到tblR.Tables(n).Rows.Count
用于调试的还原状态、报告时间、安全退出和错误处理程序设置

Application.ActiveWindow.View=wdPrintView
Application.ScreenUpdating=True
MsgBox“已完成页面:”&n&vbCr&_
时间(秒):&DateDiff(“s”,时间检查,时间)&vbCr&_
“每页秒数:”&CDbl(日期差(“s”,时间检查,时间))/CDbl(n)&vbCr&_
“每分钟页数:”&n/DateDiff(“s”,时间检查,时间)*60
出口接头
呃:
Application.ScreenUpdating=True
错误。升起错误号
停止
端接头

通过将表格标题的副本插入拆分表格第二部分顶部的行中,可以以更简单的方式完成此操作

  • 在第一页末尾拆分表,就像您已经做的那样。剩下的活动现在集中在表的第二部分
  • 对于表格的第二部分,请在表格顶部插入一行
  • 将新的单行设为重复表标题
  • 将表格标题的副本粘贴到表格第二部分顶部的行中

  • 这将达到您试图达到的效果。

    这可以通过在拆分表的第二部分顶部的行中插入表格标题的副本来实现

  • 在第一页末尾拆分表,就像您已经做的那样。剩下的活动现在集中在表的第二部分
  • 对于表格的第二部分,请在表格顶部插入一行
  • 将新的单行设为重复表标题
  • 将表格标题的副本粘贴到表格第二部分顶部的行中
  • 这将达到您试图达到的效果。

    H