脚本,它复制工作表的数据,并粘贴它,但粘贴

时间:2012-05-23 18:30:49

标签: excel-vba vba excel

这是我的剧本。

Sub Update_OOR()

    Dim wsTNO As Worksheet
    Dim wsTND As Worksheet
    Dim wsTNA As Worksheet
    Dim lastrow As Long, fstcell As Long

    Set wsTNO = Sheets("Tel-Nexx OOR")
    Set wsTND = Sheets("Tel-Nexx Data")
    Set wsTNA = Sheets("Tel-Nexx Archive")

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With

    With Intersect(wsTNO.UsedRange, wsTNO.Columns("S"))
        .AutoFilter 1, "<>Same"
        With Intersect(.Offset(2).EntireRow, .Parent.Range("B:P"))
            .Copy wsTNA.Cells(Rows.Count, "B").End(xlUp).Offset(1)
            .EntireRow.Delete
        End With
        .AutoFilter
    End With


'Blow away rows that are useless
    lastrow = wsTND.Range("A2").End(xlDown).Row
    wsTND.Range("O1:P1").Copy wsTND.Range("O2:P" & lastrow)
    wsTND.UsedRange.Copy Sheets.Add.Range("A1")

    With Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns("P"))
        ActiveSheet.Range("O:P").Calculate
        .AutoFilter 1, "<>Different"
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    With ActiveSheet
        lastrow = wsTND.Range("A2").End(xlDown).Row
        Intersect(.UsedRange, .Range("A2:M" & lastrow)).Copy wsTNO.Cells(Rows.Count, "B").End(xlUp).Offset(1)
        .Delete
    End With

    With wsTNO
        lastrow = wsTNO.Cells(Rows.Count, "B").End(xlUp).Row
        wsTNO.Range("T1:AD1").Copy
        wsTNO.Range("B3:N" & lastrow).PasteSpecial xlPasteFormats
        lastrow = wsTNO.Cells(Rows.Count, "R").End(xlUp).Row
        fstcell = wsTNO.Cells(Rows.Count, "N").End(xlUp).Row
        wsTNO.Range("AE1:AI1").Copy wsTNO.Range("O" & fstcell & ":S" & lastrow).Offset(1, 0)
    End With

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
    End With

End Sub

技术上完美无缺,直到这里:

With wsTNO
        lastrow = wsTNO.Cells(Rows.Count, "B").End(xlUp).Row
        wsTNO.Range("T1:AD1").Copy
        wsTNO.Range("B3:N" & lastrow).PasteSpecial xlPasteFormats
        lastrow = wsTNO.Cells(Rows.Count, "R").End(xlUp).Row
        fstcell = wsTNO.Cells(Rows.Count, "N").End(xlUp).Row
        wsTNO.Range("AE1:AI1").Copy wsTNO.Range("O" & fstcell & ":S" & lastrow).Offset(1, 0)
End With

现在从技术上讲,这部分中的所有内容都能正常工作,但是代码中的最后一行,它正确地克服了一切,然后它超越了一步。我想知道为什么。如果我摆脱了偏移,它会覆盖O到S中上面单元格中的内容。我需要知道第一个和最后一个单元格,因为数据只需要写入特定的单元格范围。

如果有一种更简单的方法可以做到这一点,如果有人可以告诉我,如果没有,那么有人可以告诉我如何解决这个问题吗?

感谢。

附件是工作簿。

http://dl.dropbox.com/u/3327208/Excel/First%26LastRows.xlsm

1 个答案:

答案 0 :(得分:1)

在你的第二段代码中添加+ 1到

 lastrow = wsTNO.Cells(Rows.Count, "R").End(xlUp).Row

所以你有

 lastrow = wsTNO.Cells(Rows.Count, "R").End(xlUp).Row + 1

前者为您提供第2行,这是您的标题行。你想要的是第3行,你的标题后面的行。

更新:显示未来如何测试

虽然 .Select 方法通常不受欢迎。它非常适合测试/调试。我跑了

wsTNO.Range("O" & fstcell & ":S" & lastrow).Select
在我设置lastrow和fstcell以找到设置的范围后,在即时窗口中

。因此我知道你不想复制你的标题。从那里你可以找出驱动该范围的原因并进行相应的调整。