我创建了一个循环,其中数据从工作表中复制并粘贴到另一个中,但是我遇到了粘贴功能的问题 - 有时会错误地粘贴数据,看似随机。我目前的代码是:
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
代码有效,但这看起来效率很低。任何想法我的代码中发生了什么以及我如何解决它?
答案 0 :(得分:1)
在Set MyRange = Range("A2:A145")
中,您也应该声明相应的工作表。 E.g:
Set MyRange = Worksheets("MyNameIsWhat").Range("A2:A145")
否则,将ActiveWorksheet
和[{1}}分配给它。
同样适用于MyRange
。
应为Columns("B:C").ClearContents
答案 1 :(得分:0)
我总是尽量避免在VBA中复制/粘贴功能。这是处理器密集型和功能......非常好。
请改为尝试:
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
行,因为它看起来像是在第二步中从公式复制,并且确保值得到更新是很好的。如果普通.Calculate没有删除它,你也可以尝试Application.CalculateFull
。
另外,为了回应Vit,如果你正在使用多张纸,尽可能经常地宣布你的纸张也会有所帮助。