【问题标题】:Copying data from one sheet to another sheet using paste and insert rows使用粘贴和插入行将数据从一张纸复制到另一张纸
【发布时间】:2019-09-09 13:44:40
【问题描述】:

所以我是 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 添加新行,我必须手动更新代码。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

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

    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 遍历所有命名范围/表,复制它们,将新行插入目标工作表,然后粘贴。

    希望这是一些灵感

    【讨论】:

    • 感谢@Nick 的帮助,我理解使用“for each loop”的概念,但在“dataform.range("L2:N2").copy”下添加每个循环函数时遇到问题。我将把我已经完成的代码放在下面。
    【解决方案2】:
    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
    

    (还有更多代码,但我只添加了一半,抱歉造成混淆。如果有有用的链接可以提供帮助。非常感谢。)

    【讨论】:

    • 首先,请使用我提供给您的信息来调整您的代码。所以,给你所有的工作表起清晰的名字,这样你就可以使代码更具可读性。确保检查如何将数据复制到另一个工作簿(即在复制之前打开并激活它)。然后使用名称管理器或直接在 VBA 中给出要复制一些合理名称的范围。然后您可以使用Names Objectfor each loop 遍历每个命名范围,在新工作簿中插入新行,然后从第一行复制。
    猜你喜欢
    • 2020-06-12
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多