如何从一张纸上的表格input数据到另一张纸上的日志中

所以我想弄清楚如何设置一个macros,这个macros将把我input到一个表单中的数据logging到另一个表单中的日志中。 它会logging下来,但我的大问题是,它需要去下一行,我不能完全弄清楚它的代码。 这是我的代码看起来像:

Sub Appt() ' ' Appt Macro ' ' Range("E4").Select Selection.Copy Sheets("Appointments").Select Range("G7").Select ActiveSheet.Paste Sheets("Data Entry").Select Range("E6").Select Application.CutCopyMode = False Selection.Copy Sheets("Appointments").Select Range("D7").Select ActiveSheet.Paste Sheets("Data Entry").Select Range("E8").Select Application.CutCopyMode = False Selection.Copy Sheets("Appointments").Select Range("E7").Select ActiveSheet.Paste Sheets("Data Entry").Select Range("E10").Select Application.CutCopyMode = False Selection.Copy Sheets("Appointments").Select Range("F7").Select ActiveSheet.Paste Sheets("Data Entry").Select Range("E12").Select Application.CutCopyMode = False Selection.Copy Sheets("Appointments").Select Range("H7").Select ActiveSheet.Paste Sheets("Data Entry").Select Range("E4").Select Application.CutCopyMode = False Selection.ClearContents Range("E6").Select Selection.ClearContents Range("E8").Select Selection.ClearContents Range("E10").Select Selection.ClearContents Range("E12").Select Selection.ClearContents End Sub 

要获取表格上的下一个空行(“约会”),您可以使用此公式来获取行号:

  tRw = Sheets("Appointments").Range("D" & Rows.count).End(xlUp).Offset(1).Row 

这假设在D列下面没有任何东西在粘贴。

很显然你使用了macros录像机,这是一个很好的学习方式。 但是如此使用.select会减慢速度并且不需要。

为了解决这个问题,需要将表单声明为variables,然后为每个副本粘贴一行。

 Sub APPT() Dim oWs As Worksheet Dim tWs As Worksheet Dim tRw As Long Set oWs = Sheets("Data Entry") Set tWs = Sheets("Appointments") tRw = tWs.Range("D" & Rows.count).End(xlUp).Offset(1).Row With oWs .Range("E4").copy tWs.Range("G" & tRw) .Range("E6").copy tWs.Range("D" & tRw) .Range("E8").copy tWs.Range("E" & tRw) .Range("E10").copy tWs.Range("F" & tRw) .Range("E12").copy tWs.Range("H" & tRw) .Range("E4").ClearContents .Range("E6").ClearContents .Range("E8").ClearContents .Range("E10").ClearContents .Range("E12").ClearContents End With End Sub 

对于其他find下一行的方法,请看这里的 Siddharth Rout的答案。

正如BruceWayne在评论中指出的那样, 这是为什么/如何避免使用.select一个很好的参考

最好避免用户的剪贴板并直接分配值:

 Sub Appt() Dim n&, v v = [transpose(offset('data entry'!e4,{0;2;4;6;8},))] With Sheets("appointments") n = .Range("d" & .Rows.Count).End(xlUp).Row .[g1].Offset(n) = v(1) .[d1].Offset(n) = v(2) .[e1].Offset(n) = v(3) .[f1].Offset(n) = v(4) .[h1].Offset(n) = v(5) End With Sheets("data entry").Range("e4,e6,e8,e10,e12").ClearContents End Sub