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

时间:2018-01-05 16:27:13

标签: excel vba excel-vba word-vba

我一直在努力处理一段代码而我似乎无法找到正确的解决方案。

代码应该做什么:

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

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

实施例: enter image description here

代码是什么:

(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

代码实际执行的内容

示例结果

Example result

示例结果2

ex3

6行中有“1”,所以通常代码应生成6个代码。 因此,无论如何,代码只是跳过行或放置相同行的2倍。 当我使用F8进行调试时,everthing正确无误。

我尝试了什么

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

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

我让它连续运行3次,我得到了以下内容 Example multiple outcomes

我尝试在copy语句周围添加一个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

真的很感激一些帮助。

非常感谢,

菲利普

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

一些注意事项,AV软件似乎不喜欢这个下载,奥兰多是一个MS MVP,但该工具确实很棘手。您可能(可能会)需要禁用AV来下载它。

当然......还有其他方法可以测试这是否会产生影响......

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

HTH

答案 2 :(得分:0)

在尝试修复它之后数小时,似乎从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文件中。当所有内容都粘贴到1张(这似乎工作得很好)时,我会复制所有内容并将其粘贴到Word文件中。

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