Vba / Macro粘贴到下一个可用行

时间:2018-07-17 20:07:33

标签: excel vba excel-vba

我正在尝试复制和粘贴不在同一列或同一行中的某些单元格,并将其粘贴到“特定列”中(每次都将是同一列)。完成每个条目后,我希望将下一组条目粘贴到下一个可用行上。 Paste_NextRow()的第一组代码是作为宏运行的,这是返回的代码。我选择的范围中包含公式,每个月都会有不同的值。我将它们粘贴到A行中带有标题的行中。LastRow()的第二组代码是我在网上找到的,它将返回空的最后一行。我不确定如何利用第二组代码粘贴到下一个可用行中。如果您需要其他上下文来帮助修改代码,请告诉我。谢谢。我已经编辑了文本以相应地显示代码。

Sub Paste_NextRow()  
'  
' Paste_NextRow Macro  
'

'

    Sheets("SUMMARY DATA SHEET").Select  
    Range("F3").Select  
    Selection.Copy  
    Sheets("Invoice Number").Select  
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  
    Sheets("SUMMARY DATA SHEET").Select  
    Range("F2").Select  
    Application.CutCopyMode = False  
    Selection.Copy  
    Sheets("Invoice Number").Select  
    Range("C2").Select  
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  
     Sheets("SUMMARY DATA SHEET").Select  
    Range("B4").Select  
    Application.CutCopyMode = False  
    Selection.Copy  
    Sheets("Invoice Number").Select  
    Range("B2").Select  
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  
    Sheets("SUMMARY DATA SHEET").Select  
    Range("F4").Select  
    Application.CutCopyMode = False  
    Selection.Copy  
    Sheets("Invoice Number").Select  
    Range("D2").Select  
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  
    Sheets("SUMMARY DATA SHEET").Select  
    Range("F5").Select  
    Application.CutCopyMode = False  
    Selection.Copy  
    Sheets("Invoice Number").Select  
    Range("E2").Select  
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  
    Range("A3").Select  
End Sub  

Sub LastRow()  
    NextRow = ThisWorkbook.Sheets("Invoice Number").Cells(Rows.Count, 2).End(xlUp).Row + 1
End Sub

1 个答案:

答案 0 :(得分:1)

这里是快速重写,将变量(称为lastRow)设置为invoice number标签中的最后一行。

Sub Paste_NextRow()  
'  
' Paste_NextRow Macro  
'

'
    'Get the last used row into a variable
    Dim lastRow as Long
    lastRow = ThisWorkbook.Sheets("Invoice Number").Cells(Rows.Count, 2).End(xlUp).Row + 1

    'Copy Summary Data Sheet F3
    Sheets("SUMMARY DATA SHEET").Range("F3").Copy 

    'And paste it into the last row (column F) of Invoice Number sheet
    Sheets("Invoice Number").Range("F" & LastRow).Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  

    'Use similar logic for the remaining cells
    Sheets("SUMMARY DATA SHEET").Range("F2").Copy  
    Sheets("Invoice Number").Range("C" & lastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  

    Sheets("SUMMARY DATA SHEET").Range("B4").Copy  
    Sheets("Invoice Number").Range("B" & lastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  

    Sheets("SUMMARY DATA SHEET").Range("F4").Copy  
    Sheets("Invoice Number").Range("D" & lastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False 

    Sheets("SUMMARY DATA SHEET").Range("F5").Copy  
    Sheets("Invoice Number").Range("E"  & lastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
        :=False, Transpose:=False  

End Sub 

您将看到这里没有发生.Select,因为选择工作表或单元格是人类要做的事情。在VBA中确实不需要这样做,而只需在其中确切地指定我们要复制的内容和粘贴的位置即可。

在清理此错误的同时,仅在工作簿周围复制并粘贴VALUES仍然有点麻烦。它使用剪贴板,并且每个复制/粘贴都有多个语句。

相反,我们可以将一个单元格的值设置为等于另一个单元格的值:

Sub Paste_NextRow()  
'  
' Paste_NextRow Macro  
'

'
    'Get the last used row into a variable
    Dim lastRow as Long
    lastRow = ThisWorkbook.Sheets("Invoice Number").Cells(Rows.Count, 2).End(xlUp).Row + 1

    Sheets("Invoice Number").Range("F" & LastRow).Value = Sheets("SUMMARY DATA SHEET").Range("F3").value
    Sheets("Invoice Number").Range("C" & lastRow).value = Sheets("SUMMARY DATA SHEET").Range("F2").value 
    Sheets("Invoice Number").Range("B" & lastRow).Value = Sheets("SUMMARY DATA SHEET").Range("B4").value
    Sheets("Invoice Number").Range("D" & lastRow).Value = Sheets("SUMMARY DATA SHEET").Range("F4").value 
    Sheets("Invoice Number").Range("E"  & lastRow).Value = Sheets("SUMMARY DATA SHEET").Range("F5").value

End Sub  

最后,一遍又一遍地输入这些工作表名称很麻烦。我们可以使用几个变量来保存我们关心的两个工作表。如果您想更改工作表名称,这很好,因为在代码中只有一个地方可以进行更改:

Sub Paste_NextRow()  
'  
' Paste_NextRow Macro  
'

'
    'Set some variables to hold our worksheets
    Dim wsCopy as Worksheet
    Dim wsPaste as Worksheet

    Set wsCopy = Sheets("SUMMARY DATA SHEET")
    Set wsPaste = Sheets("Invoice Number")

    'Get the last used row into a variable
    Dim lastRow as Long
    lastRow = ThisWorkbook.Sheets("Invoice Number").Cells(Rows.Count, 2).End(xlUp).Row + 1

    'Copy values over
    wsPaste.Range("F" & LastRow).Value = wsCopy.Range("F3").value
    wsPaste.Range("C" & lastRow).value = wsCopy.Range("F2").value 
    wsPaste.Range("B" & lastRow).Value = wsCopy.Range("B4").value
    wsPaste.Range("D" & lastRow).Value = wsCopy.Range("F4").value 
    wsPaste.Range("E" & lastRow).Value = wsCopy.Range("F5").value

End Sub