首页 > 解决方案 > VBA 宏在表格末尾插入一行,然后将先前复制的行的值粘贴到新行的特定范围内

问题描述

我正在寻找有关 VBA 宏的帮助。这是我当前的代码。**** 在哪里我需要一些代码在活动工作表的表格末尾插入一行,然后将上面代码中复制的值粘贴到(“E1:R8”)范围内(E?:R?") 新创建的行。

Sub Workbook()
    Dim wb As Workbook
    Set wb = Workbooks.Add

    ThisWorkbook.Sheets("RFP Form").Copy Before:=wb.Sheets(1)
    ThisWorkbook.Sheets("DataHelperSheet").Copy After:=wb.Sheets(1)
    Application.DisplayAlerts = False

    wb.SaveAs "Z:\Temp\test3.xlsx"

    Application.DisplayAlerts = True

    ActiveWorkbook.SaveAs FileName:="Z:\Temp\" & Range("I1").Value

    Worksheets("DataHelperSheet").Activate
    Range("E1:R8").Select
    Selection.Copy

    Workbooks("Proposal Quote Master List(LB).xlsm").Activate
    Worksheets("Master List").Activate
    '***

    Range("E1:R298").PasteSpecial Paste:=xlPasteValues
End Sub

标签: excelvba

解决方案


  1. 不要将您的 sub 命名Workbook为保留字,因为 VBA 将其用于工作簿对象(请参阅参考资料Dim wb As Workbook),这对于人类和 VBA 来说可能会非常混乱。

  2. 不要混用ThisWorkbookandActiveWorkbook和避免使用Activate, ActiveWorkbookand .SelectThisWorkbook是编写代码的工作簿(它永远不会改变。ActiveWorkbook是具有焦点的工作簿(位于顶部)并且可以通过单击鼠标轻松更改(因此它不是一个非常可靠的参考)。而是总是尝试使用像您对wb.SaveAs.

  3. 确保所有对象都指定了工作Range簿和工作表。如果您编写Range("I1").ValueVBA 并不确定您指的是哪个工作簿或工作表。它猜你的意思是活跃的。但这同样不是很可靠,因为这可以通过单击鼠标来改变。确保你通过使用类似的东西准确地告诉 VBA你的意思,wb.Workbooks("Sheet1").Range("I1").Value这样 VBA 就没有开始猜测的空间了。

  4. 停止使用.Select。代替

     Worksheets("DataHelperSheet").Activate
     Range("E1:R8").Select
     Selection.Copy
    

    写吧

     wb.Worksheets("DataHelperSheet").Range("E1:R8").Copy
    

    wb如果使用多个工作簿,请再次指定工作簿。

  5. 例如,要在 E 列中查找最后使用的单元格,请使用

     wsMasterList.Cells(wsMasterList.Rows.Count, "E").End(xlUp)
    

    并使用.Offset(RowOffset:=1)向下移动一行到下一个要粘贴的空单元格。

所以你最终会得到类似的东西:

Option Explicit

Public Sub CreateWorkbook()
    Dim wb As Workbook
    Set wb = Workbooks.Add

    ThisWorkbook.Sheets("RFP Form").Copy Before:=wb.Sheets(1)
    ThisWorkbook.Sheets("DataHelperSheet").Copy After:=wb.Sheets(1)
    
    Application.DisplayAlerts = False
    wb.SaveAs "Z:\Temp\test3.xlsx"
    Application.DisplayAlerts = True

    wb.SaveAs Filename:="Z:\Temp\" & wb.Workbooks("SPECIFY YOUR SHEET").Range("I1").Value '‹~~ specify sheet name

    wb.Worksheets("DataHelperSheet").Range("E1:R8").Copy
    
    Dim wsMasterList As Worksheet
    Set wsMasterList = Workbooks("Proposal Quote Master List(LB).xlsm").Worksheets("Master List")

    wsMasterList.Cells(wsMasterList.Rows.Count, "E").End(xlUp).Offset(RowOffset:=1).PasteSpecial Paste:=xlPasteValues
End Sub

推荐阅读