VBA单词表副本丢失数据

时间:2017-12-08 06:58:09

标签: excel vba excel-vba ms-word

我继承了一些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复制大量大表时会出现问题,它会丢失一个表。但是,当我通过在调试器中强制停止或在循环中添加Application.Wait来减慢过程时,问题就会消失。

代码执行以下操作:

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

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

几乎就像在迭代表中一样,如果VBA仍然忙,后续表将返回空。

我尝试了以下内容:

  • 使用早期绑定更改为Word Automation
  • 摆脱ActiveSheet.Cells(...).Activate事物并使用Cells(y, x)代替
  • 使用计数器进行循环,并在循环结束时使用set tbl = doc.tables(tc)set tbl = Nothing
  • 多个DoEvents
  • 只是设置单元格的文本,没有别的,循环中的最小工作(这里我丢失了更少的数据)

行为没有变化。简直是奸诈。 ужас。

有没有Application.Waitsleep更好的方法呢?如何确定Excel在下一次迭代开始之前是否真的完成了?

1 个答案:

答案 0 :(得分:1)

请试一试:

变化:

For Each tbl In doc.Tables
    prev = -42

要:

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

有一个类似的问题:使用VBA,我用&gt;打开一个Word文档300页&gt; 200张桌子。当代码循环遍历文档时,它会从表中收集数据。我使用.Select行进行调试,所以我知道文档中的代码在哪里工作,但是当我在调试后稍后评论它时,代码会运行,但不会命中每个表。

我还尝试添加Wait循环,以确保在运行代码之前完全加载Document,但这没有帮助。

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

这并没有真正回答你的问题,但也许它会使你的代码正常工作。