为什么我的 VBA 循环粘贴了不正确的值?

Why does my VBA loop paste incorrect values?

我创建了一个循环,其中数据从一个工作表复制并粘贴到另一个工作表中,但是我在使用粘贴功能时遇到问题 – 有时似乎随机粘贴了错误的数据。我当前的代码是:

    Sub ACCPR_LOOP()

Dim wsACC_PR As Worksheet
Set wsACC_PR = ThisWorkbook.Sheets("ACC PR")
Dim wsPR_CALC As Worksheet
Set wsPR_CALC = ThisWorkbook.Sheets("PR - CALC")
Dim MyRange As Range
Dim MyCell As Range
Set MyRange = Range("A2:A145")

Application.ScreenUpdating = False    
Columns("B:C").ClearContents

For Each MyCell In MyRange
    MyCell.Copy
    wsPR_CALC.Range("A1").PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    wsPR_CALC.Range("B226,B228").Copy
    MyCell.Offset(0, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True

Next MyCell

End Sub

代码在 Col A 中做的是一堆日期,它复制 A 中的日期,然后将其粘贴到另一个工作表中以更新下拉日期选择器并更改数据。然后将其中两个单元格复制并粘贴回原始工作表中,偏移量为 1 列。出于某种原因,有时会粘贴 A 中前一个日期的数据。例如,将 A17 中的日期复制并粘贴到日期选择器中,然后将正确的数据粘贴到 B17 中,但在下一步中,将与 A17 相关的数据粘贴到下一行的 B18 中。

如果重复行:

MyCell.Offset(0, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True

代码有效,但这似乎效率很低。知道我的代码中发生了什么以及如何修复它吗?

Set MyRange = Range("A2:A145")中你也应该声明相应的工作表。例如:

Set MyRange = Worksheets("MyNameIsWhat").Range("A2:A145")

否则,它会取 ActiveWorksheetMyRange 分配给它。


Columns("B:C").ClearContents也是如此。

应该是Worksheets("TsakaTsakaSlimShaddy").Columns("B:C").ClearConents

我总是尽量避免VBA中的copy/paste函数。它是处理器密集型和功能......神秘的。

试试这个:

For Each MyCell In MyRange
    wsPR_CALC.Range("A1").Value = MyCell.Value
    Application.Calculate
    MyCell.Offset(0, 1).Value = wsPR_CALC.Range("B226,B228").Value
Next MyCell

您会丢失数字格式,但还有其他方法可以做到这一点。 我还添加了一个 Application.Calculate 行,因为它看起来像是您在第二步中从公式中复制,并且最好确保该值得到更新。你也可以尝试 Application.CalculateFull 如果 plain .Calculate 没有削减它。

此外,为了呼应 Vit,如果您正在使用多个 sheet,尽可能多地声明您的 sheet 也会有所帮助。