使用粘贴并插入行将数据从一张纸复制到另一张纸

时间:2019-04-19 09:01:47

标签: excel vba

因此,我是Excel VBA的新手,并且给了我一个项目,该项目需要将数据从工作表1复制到新工作簿。问题在于复制,粘贴和插入新行。 (有两个子例程,但是第二个子例程大致相同,这是必需的,请原谅),谢谢。

Sub CopyInfo()
    On Error GoTo Err_Execute

    wb1.Sheets("dataform").Range("L2:N2").Copy
    wb2.Sheets(shtname).Range("A2:C27").Rows("1:1").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("A2:C28").PasteSpecial (xlPasteValues)


    wb1.Sheets("dataform").Range("B2:B28").Copy
    wb2.Sheets(shtname).Range("D2").Insert Shift:=xlDown

    wb1.Sheets("dataform").Range("D2:D28").Copy
    wb2.Sheets(shtname).Range("F2").Insert Shift:=xlDown

    update

    wb1.Sheets("Setlist").Range("G2").Copy
    wb2.Sheets(shtname).Range("E2:E27").Rows("1:27").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("E2:E28").Paste1Special

   wb2.Sheets(shtname).Columns().AutoFit

Err_Execute:
    If Err.Number = 0 Then MsgBox "All have been copied!" Else _
    MsgBox Err.Description

End Sub


Sub update()

    wb1.Sheets("dataform").Range("D2:D28").Copy
    wb1.Sheets("dataform").Range("E2:E28").PasteSpecial
    wb1.Sheets("dataform").Range("F2:F28").PasteSpecial

    wb1.Sheets("dataform").Range("F2:F28").Copy
    wb2.Sheets(shtname).Range("G2").Insert Shift:=xlDown
End Sub

该程序需要从当前工作簿工作表1副本到另一个工作簿。第一个工作簿工作表1将具有新的行加载项,并且代码会自动对其进行更新。当前,如果当前工作簿工作表1添加新行,则必须手动更新代码。

2 个答案:

答案 0 :(得分:0)

好的,所以有几个步骤可以达到您想要的结果。

  1. 我假设您的第二个工作簿尚未打开,因此您需要先在VBA中打开它,然后才能复制您的范围。在SO和Google上有很多答案,向您展示了如何做到这一点。

  2. 由于要在原始工作表中添加行,因此需要一种在代码中包含行的方法。有几种选择方法。

    您可以创建一个表并使用Dim As ListObject进行声明,然后在VBA中进行设置。这样,当新行添加到表中时,它们将被自动包括在内。第二种方法是使用动态命名范围(请参见“公式”标签下的“名称管理器”),该范围包括添加新行时的行。

  3. 可能最重要的部分是通过声明变量和对象来简化代码。

当前,您不断写wb1.Sheets("dataform")。而是使用Dim DataForm as WorksheetSet Dataform = wb1.Sheets("dataform")。这样,当使用地址表时,您只需编写Dataform.Range("A1:A1")。参见以下示例。

    Dim Source As Workbook
    Set Source = ThisWorkbook
    Dim Dataform As Worksheet
    Set Dataform = Source.Sheets("Dataform")

    Dataform.Range("L2:N2").Copy 'See how you can just adress the sheet by name

现在,如果您还要将范围声明为表/命名范围,这将使代码更易于处理。由于您还在每次操作期间总是添加一行,因此一种更有效的方法是使用for each loop浏览所有已命名的范围/表,将它们复制,然后在目标表中插入新行,然后糊。

希望这是一些灵感

答案 1 :(得分:0)

Sub CopyInfo()
    On Error GoTo Err_Execute

    dataform.Range("L2:N2").Copy
    wb2.Sheets(shtname).Range("A2").Rows("1:27").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("A2:C28").PasteSpecial (xlPasteValues)

    dataform.Range("LocationName").Copy
    wb2.Sheets(shtname).Range("D2").Insert Shift:=xlDown

    dataform.Range("Reading").Copy
    wb2.Sheets(shtname).Range("F2").Insert Shift:=xlDown

    update

    wb1.Sheets("Setlist").Range("D2").Copy

    wb2.Sheets(shtname).Range("E2").Rows("1:27").Insert Shift:=xlDown

   wb2.Sheets(shtname).Columns().AutoFit

Err_Execute:
    If Err.Number = 0 Then MsgBox "All have been copied!" Else _
    MsgBox Err.Description

End Sub

Sub update()   

    dataform.Range("Reading").Copy
    dataform.Range("PreviousReading, Usage").PasteSpecial

    dataform.Range("Usage").Copy
    wb2.Sheets(shtname).Range("G2").Insert Shift:=xlDown
End Sub

(有更多代码,但我只添加其中一半,对于造成混乱的情况,我们感到抱歉。如果有有用的链接可以帮助您。非常感谢。)