VBA词表副本丢失数据

我已经inheritance了一些VBA代码,将Word文档中表格的内容复制到Excel中。 该代码本身来自Excel插件,它使用后期绑定调用Word以避免在旧版本的Excel中使用时引用错误。 插件本身在Office 2016中维护,同时也在Office 2016,2013和2010中使用。

该计划的核心是以下几点:

tc = 1 ' table counter For Each tbl In doc.Tables prev = -42 ' previous row Application.Wait DateAdd("s", 2, Now) ' Note this line For Each cel In tbl.Range.Cells cont = CellContents(cel.Range) ' dim cont() as string txt = cont(0) xx = cel.ColumnIndex yy = cel.RowIndex If yy <> prev Then xtra = 1 ' extra x cell counter prev = yy ' reset for new row End If xtra = xtra - 1 For Each v In cont ' dim v as variant txt = CStr(v) ActiveSheet.Cells(xlrow + yy, xtra + xx).Activate ActiveCell = txt ActiveCell.Font.Bold = cel.Range.Bold colr = cel.Range.Font.Color ActiveCell.Font.Color = colr colr = cel.Shading.BackgroundPatternColor If colr <> -16777216 Then ActiveCell.Interior.Color = colr Select Case cel.Range.ParagraphFormat.Alignment Case 2 ' wdAlignParagraphRight ActiveCell.HorizontalAlignment = xlRight Case 1 ' wdAlignParagraphCenter ActiveCell.HorizontalAlignment = xlCenter Case 0, 3 ' wdAlignParagraphLeft, wdAlignParagraphJustify ActiveCell.HorizontalAlignment = xlLeft Case Else End Select xtra = xtra + 1 Next v Next cel xlrow = xlrow + tbl.rows.Count + 1 Application.StatusBar = "Table " & tc & " in " & nm DoEvents tc = tc + 1 Next tbl 

不,从Word复制粘贴到Excel将不会执行任何操作,不会处理文本从单元格复制到单元格,也不处理单元格中断,也不处理内容控制。

我看到一个问题,当这个过程是从Word复制大量的大表,它会错过一个表。 但是,当我放慢进程时,无论是通过在debugging器中强制停止还是在循环中添加Application.Wait ,问题都会消失。

代码执行以下操作:

  • 对于文档,循环遍历文档中的所有表格
  • 然后,对于表格,循环该表格中的所有单元格,并将其复制到Excel中,以保留背景和前景色

典型的文档可能有10到20个表格,每个表格有50个或更多的单元格。

就好像迭代表时,如果VBA仍然忙,后续的表返回空。

我已经尝试了以下内容:

  • 使用早期绑定更改为Word自动化
  • 摆脱ActiveSheet.Cells(...).Activate东西,并使用Cells(y, x)来代替
  • 为循环使用计数器和set tbl = doc.tables(tc)set tbl = Nothing在循环的末尾
  • 多个DoEvents
  • 只是设置单元格的文本,没有别的,在循环中最小的工作(在这里,我失去了更less的数据)

行为没有改变。 简直是背信弃义。 ужас。

有没有更好的方式来做到这一点,没有Application.Waitsleep ? 如何在下一次迭代开始之前确定Excel真的完成了?

请试试这个:

更改:

 For Each tbl In doc.Tables prev = -42 

至:

 For Each tbl In doc.Tables tbl.Select ' < add this prev = -42 

有一个类似的问题:使用VBA,我打开一个Word文档> 300页和> 200表。 代码循环遍历文档时,它从表中收集数据。 我使用.Select行来进行debugging,所以我知道代码在哪里工作,但是当我在debugging后发表评论的时候,代码会运行,但是不会打到每个表。

我也尝试添加一个等待循环,以确保在运行我的代码之前完全加载文档,但是这没有帮助。

您也可以在代码顶部附近添加一行Application.ScreenUpdating = False ,以避免屏幕闪烁。select原因。

这并不能真正回答你的问题,但也许它会让你的代码工作。