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 - 对于下一个循环随机跳过数据的主要内容,如果未能解决你的问题,请参考以下文章