为什么我的 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")
否则,它会取 ActiveWorksheet
和 MyRange
分配给它。
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 也会有所帮助。
我创建了一个循环,其中数据从一个工作表复制并粘贴到另一个工作表中,但是我在使用粘贴功能时遇到问题 – 有时似乎随机粘贴了错误的数据。我当前的代码是:
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")
否则,它会取 ActiveWorksheet
和 MyRange
分配给它。
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 也会有所帮助。