【问题标题】:Need copy and paste daily macro that shifts right to next column after each paste需要复制和粘贴每日宏,每次粘贴后向右移动到下一列
【发布时间】:2016-08-04 20:11:12
【问题描述】:

大家好,我有一个小问题需要帮助。

我正在从工作表 1 的单元格区域 B1:B21 复制数据并粘贴到工作表 2 的单元格区域 C4:C25。

粘贴数据后,我想向右移动一列,

这是我目前的代码。

Private Sub CommandButton1_Click()

    Workbooks("COPY Service Tracker  August  2016.xlsm").Activate
    Sheets("Sheet2").Select
    ActiveSheet.Range("B1:B21").Select
    Selection.Copy
    Sheets("Queue Performance").Select
    ActiveSheet.Range("F4").Select


    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False

         Application.CutCopyMode = False


End Sub

所以代码已经让我将正确的数据粘贴到我想要的位置。 现在,当我明天再次运行此宏时,复制的数据与昨天的数据不同,因为它也每天更新。 我想将这些新数据粘贴到昨天的下一列中,同时保留昨天的数据。

数据被输入到列中,标题为日期,所以我正在保存新的每日数据或每一天。 谢谢

【问题讨论】:

  • 就代码的性能而言,您希望尽可能避免复制和粘贴。将单元格的值设置为其他单元格的值。例如Range("A1").Value = Range("B2").Value。在向右/向左/向上/向下移动方面,您需要查看Offset

标签: vba excel


【解决方案1】:

您应该将Range 对象的.End(xlToLeft) 方法与.Cells(4, .Columns.Count) 结合使用,以获取第4 行中实际的最后一个非空单元格

然后避免使用Select/SelectionActivate/ActiveXXX,它们都可能存在严重的速度问题,并且主要导致对您实际引用的工作簿/工作表的控制松散

所以你可以使用

Option Explicit

Private Sub CommandButton1_Click()
    Dim wb As Workbook

    Set wb = Workbooks("COPY Service Tracker  August  2016.xlsm")
    With wb.Worksheets("Queue Performance")
        .Cells(4, .Columns.Count).End(xlToLeft).Offset(, 1).Resize(, 21).value = wb.Worksheets("Sheet2").Range("B1:B21").value
    End With
End Sub

【讨论】:

  • @sullkid16:你试过这个吗?
  • @sullkid16: 很高兴你能向尝试帮助你的人提供反馈
【解决方案2】:

您可以使用.End(xlToRight) 查找最右侧的单元格,并使用.Offset(0,1) 引用下一列(该列将为空白)。例如:

Workbooks("COPY Service Tracker  August  2016.xlsm").Activate
Sheets("Sheet2").Select
ActiveSheet.Range("B1:B21").Select
Selection.Copy
Sheets("Queue Performance").Select

ActiveSheet.Range("A4").End(xlToRight).Offset(0,1).Select


Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False

Application.CutCopyMode = False

(假设从 A 列开始填满)

【讨论】:

  • 谢谢,我想这已经解决了,但需要先运行一些测试。
【解决方案3】:

正如@Tim 在 cmets 中提到的,强烈建议避免使用.Select.Copy.Paste。我还建议使用ThisWorkbook 而不是ActiveWorkbook,因为它有助于调试。通过设置范围,您可以使流程更快、更不容易出错:

Dim ws1, ws2 as Worksheet
Dim lCol as Long

Set ws1 = ThisWorkbook.Sheets("Queue Performance")
Set ws2 = Workbooks("COPY Service Tracker  August  2016.xlsm").Sheets("Sheet2")

lCol = ws1.Cells(1, Columns.Count).End(xlToLeft).Column + 1
lRow = ws2.Cells(Rows.Count, "B").End(xlup).Row

ws1.Range(ws1.Cells(1, lCol), ws1.Cells(lRow, lCol)).Value = _
ws2.Range("B1:B" & lRow).Value

lCol 是要填充到 ThisWorkbook.Sheets("Queue Performance") 工作表中的最后一列,lRow 是要从 Workbooks("COPY Service Tracker August 2016.xlsm").Sheets("Sheet2") 工作表中复制的最后一行。

【讨论】:

  • 我收到上述代码的编译错误。最后两行以红色突出显示
  • 我现在收到一个错误 1004 并且调试再次指向最后两行
  • 对不起,里面有一个额外的Range(,现在已经被删除了。
  • 好的,这些错误现在消失了,这是我问题的完整解决方案吗?宏似乎没有任何改变?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多