VBA Excel to Word - 对于下一个循环随机跳过数据

Posted

技术标签:

【中文标题】VBA Excel to Word - 对于下一个循环随机跳过数据【英文标题】:VBA Excel to Word - For next loops skips data randomly 【发布时间】:2018-06-15 11:58:53 【问题描述】:

我一直在为一段代码苦苦挣扎,但似乎找不到正确的解决方案。

代码应该做什么:

我想根据“if”语句在 Excel 中复制多行: “如果 C 列为 1,则从 Excel 工作表中复制单元格 Ax:Dx 并将该数据粘贴到 word 文件中”

word文件在这部分之前的代码中正常生成。这没有任何问题。

示例:

代码是什么:

(Blad = sheet)

 k = Blad2.Range("A1", Blad2.Range("A1").End(xlDown)).Rows.Count
 Worksheets("Prijzen").Activate
    For i = 1 To k
        rij = worksheets("Prijzen").Range("C2").Offset(i - 1).Value
        If rij >= 1 Then
           Blad2.Range("A2:D2").Offset(i - 1).Copy
           .PasteExcelTable False, True, False

        End If
    Next

代码的实际作用

示例结果

示例结果 2

6 行中有“1”,因此通常代码应生成 6 个代码。 因此,无论哪种方式,代码只是跳过行或将同一行放置 2 次。 当我使用 F8 进行调试时,一切都正确。

我尝试了什么

添加延迟,通过互联网阅读,更改表格格式,但不幸的是不成功。

---编辑--- 我实施了 Scott 的建议并尝试对每一行进行调试。如果我在循环中调试,所有内容都会 100% 正确粘贴。当我删除该行以使一切自动运行时,它会再次开始跳行或制作双行。

我让它连续运行 3 次,我得到了以下结果

我尝试在复制语句周围添加一个 DoEvents 循环,但这仍然给出了相同的结果。

        Dim tmpstart
    For i = 1 To k

        Ccol = ws2.Range("C2").Offset(i - 1).Value
           If Ccol >= 1 Then

            tmpstart = Timer
            Do
                DoEvents
                ws2.Range("A2:D2").Offset(i - 1).Copy
            Loop While (tmpstart + 1) > Timer

            .PasteExcelTable False, True, False

           End If
    Next

非常感谢您的帮助。

非常感谢,

菲利普

【问题讨论】:

问得好问题:) 建议在 if 语句上方添加debug.print "loop: " & i & " rij = " & rij,看看循环是否正在跳过迭代。 debug.print 有没有运气? 您好 ShowLearner,感谢您的建议。我已经尝试过 debug.print 和 msgbox。这样做,循环运行良好。一定是Excel中复制和word中粘贴的连接有问题。系统没有足够的时间来 1) 复制、2) 粘贴或 3) 放置鼠标指示器。你还有其他建议吗?提前致谢。 所以...不使用调试打印跳过循环?? 输入太快:-)。不,如果我调试打印程序,则不会跳过循环。我还尝试在不使单词活动和可见的情况下运行程序,但不幸的是结果是一样的。看起来计算机只需要放慢速度并花时间完成循环。 【参考方案1】:

您正在引用两个不同的工作表。

Dim ws As Worksheet
Set ws = Worksheets("Prijzen") 'or Blad2 which ever is correct.
k = ws.Range("A1", ws.Range("A1").End(xlDown)).Rows.Count
For i = 1 To k
    rij = ws.Range("C2").Offset(i - 1).Value
    If rij >= 1 Then
        ws.Range("A2:D2").Offset(i - 1).Copy
        .PasteExcelTable False, True, False
    End If
Next

【讨论】:

嗨,斯科特,感谢您的建议。我提到的 2 个工作表实际上是相同的。我已将其更改为您的更正,但不幸的是,我仍然得到相同的结果。【参考方案2】:

在确认您的代码在For ... Next 循环中使用Debug.Print 语句运行后,我认为我们可以肯定地说代码没有任何问题。我很犹豫,建议你试试这个工具:http://cpap.com.br/orlando/VBADecompilerMore.asp

我有过类似的经历,并通过使用 VBA 反编译器获得了很多成功。

一些注意事项,AV 软件似乎不喜欢这个下载,Orlando 是 MS MVP,但该工具会做一些棘手的事情。您可能(可能会)需要禁用您的 AV 才能下载它。


当然……还有其他方法可以测试这是否会有所作为……

创建一个新的 FRESH 文档并重新键入(或通过纯文本编辑器复制)代码 - 这使您可以在一个不应该有损坏的文档中进行测试...

HTH

【讨论】:

再次感谢。网站上不再提供反编译器。我搜索了另一个下载链接但没有成功。我注意到别的东西:如果我执行 debug.print 并运行程序(不是分步调试),故障仍然存在。我还创建了一个新文档并重新输入了循环,但同样如此。我认为在剪贴板中复制和粘贴信息存在错误。我试过这样的事情:Sheet1.Range("A1:A200").Copy Destination:=wordapp.selection 但这段代码并不完全正确。这一切真的很令人沮丧:-) 我要试试别的。使用用户表单,我将尝试制作我需要的确切表格。之后,将页面从 Excel 复制到 Word 中 1 次。手指交叉!【参考方案3】:

经过数小时试图修复它,似乎从 Excel 复制到剪贴板,并从 Word 中的剪贴板粘贴,给出的结果过于不确定和随机。行被重复发布,有些行不会显示。

我的解决方法:

i = 1
    Ccol = 1
    ws2.Activate

    'count rows in sheet, copy & paste title on a location "Budget" in Word.
    k = ws2.Range("A1", Blad3.Range("A1").End(xlDown)).Rows.Count
        .Goto what:=-1, Name:="Budget"
        ws2.Range("A1:D1").Offset(i - 1).Copy
        .BoldRun
        .PasteExcelTable False, True, False
        .BoldRun

    For i = 1 To k
        If ws2.Range("C2").Offset(i - 1) >= 1 Then

            'Copy - Paste to different Excel sheet without using the clipboard
            ws2.Range("A2:D2").Offset(i - 1).Copy Destination:=ws6.Range("A1:D1").Offset(Ccol - 1)
            'Ccol is used to paste the copied data on rows 1, 2, ...
            Ccol = Ccol + 1

        End If
    Next
    ' making sure columns/rows width/heigth is ok
    ws6.Activate
    ws6.Columns("A:D").AutoFit
    ws6.Rows(1).AutoFit

    'counting the amount of lines in the sheet and copying the complete table
    k2 = ws6.Range("A1", ws6.Range("A1").End(xlDown)).Rows.Count
    ws6.Range("A1", Range("D1").Offset(k2 - 1)).Copy

    'Program pauze before pasting
        tmpStart = Timer
        Do
        DoEvents
        Loop While (tmpStart + 1) > Timer
    .PasteExcelTable False, True, False

所以基本上,我只是在 C 列中用“1”复制每一行,并将单元格粘贴到同一个 Excel 文件中。当所有内容都粘贴到一张纸上(这似乎工作得很好)时,我复制所有内容并将其粘贴到 Word 文件中。

虽然最初的解决方案对我来说似乎更合乎逻辑,但我终于可以继续工作了。

【讨论】:

以上是关于VBA Excel to Word - 对于下一个循环随机跳过数据的主要内容,如果未能解决你的问题,请参考以下文章

如何用EXCEL的VBA控制WORD文档?

用vba编程将excel中的数据批量填写到word里面

在EXCEL中用VBA操作WORD表格:怎样选择一个表格中除第一行以外的任意连续行(比如第2到4行)?

如何在Excel VBA 中读写word文档 步骤

防止 Word VBA 中的 Excel 提示

VBA Word 从 Excel 中查找和替换 /&-