【问题标题】:How to Copy Column and Paste Values to a New Column Every Time Macro Is Initiated每次启动宏时如何复制列并将值粘贴到新列
【发布时间】:2013-02-05 22:12:39
【问题描述】:

我有一个计算 Z 列差异的电子表格。在月底,我想将这些值复制并粘贴到同一电子表格的另一列中,以跟踪每月的差异。

我有一个宏要从 Z 列复制到 BK 列。

我希望每次运行宏时都从 Z 列复制值并使用以下时间表将其粘贴到新列中:

  • 第 1 个月 = 值应粘贴到 BK 列中
  • 第 2 个月 = 值应粘贴到 BL 列中
  • 第 3 个月 = 值应粘贴到 BM 列中
  • 第 4 个月 = 值应粘贴到 BN 列中
  • 第 5 个月 = 值应粘贴到 BO 列中
  • 第 6 个月 = 值应粘贴到 BP 列中
  • 第 7 个月 = 值应粘贴到 BQ 列中
  • 第 8 个月 = 值应粘贴到 BR 列中
  • 第 9 个月 = 值应粘贴到 BS 列中
  • 第 10 个月 = 值应粘贴到 BT 列中
  • 第 11 个月 = 值应粘贴到 BU 列中
  • 第 12 个月 = 值应粘贴到 BV 列中

第 12 次迭代后,我希望将 Z 列中的值复制到 BK 列(起点)。我相信这可以使用循环来完成?

我很难想出循环逻辑/编码。

Sub copyCurrentToPrevious()

    Dim ans As String

    On Error Resume Next

    Application.ScreenUpdating = False

    Sheets("Direct Materials").Activate

    ans = MsgBox("Are you sure you want to copy Previous Month Variance to YTD Variance Tracking?  This action can not be undone." & vbNewLine _
      & vbNewLine & "Select Yes to proceed with the copy/paste operation or Select No to cancel.", vbYesNo + vbExclamation, "Product Costing")

    If ans = vbNo Then Exit Sub

    Range("Z9:Z220").Copy
    Range("BK9").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z226:Z306").Copy
    Range("BK226").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z311:Z471").Copy
    Range("BK311").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z476:Z524").Copy
    Range("BK476").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Application.CutCopyMode = False

    Range("A1").Select

    MsgBox "Copy / paste operation is complete.  Select OK to continue.", vbOKOnly + vbInformation, "Product Costing"

    Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 你很好,只需将MONTHOFFSET 一起用于右列选择。祝你好运,我的努力 +1!
  • 谢谢彼得!问题......但这将如何工作?它是否需要通过一个循环,以便在每次运行宏时自动增加 1 列?
  • 不,只需阅读偏移量的工作原理 - 您需要的只是从第一列 BK 开始的班次(在您的情况下是月份数)。您需要将Range("BK9") 替换为Cells([number], [column BK + offset to the right])。所有详细信息都在 VBA 帮助中)

标签: excel vba offset


【解决方案1】:

这是您的代码重构,添加所需的偏移量,并解决了许多其他问题:

  • ans 使用正确的数据类型
  • 不要使用Resume Next。这就是说我不在乎我是否有错误,不管怎样,继续。谁知道接下来会发生什么
  • 不要使用ActivateSelect(除非您有特殊需要)。请改用WorkbookWorksheetRange 对象。请注意,Worksheets("Direct Materials") 隐含地说 Activeworkbook.Worksheets("Direct Materials")
  • 你实际上不需要Copy/Paste。请改用.Value 返回的Variant Array。这将更快,并且不易受到其他应用程序使用剪贴板的干扰。这也是一个好习惯,因为它在各种方面都很有用。

Sub copyCurrentToPrevious()
    Dim ans As VbMsgBoxResult
    Dim rng As Range

    On Error GoTo EH

    ans = MsgBox("Are you sure you want to copy Previous Month Variance to YTD Variance Tracking?  This action can not be undone." & vbNewLine _
        & vbNewLine & "Select Yes to proceed with the copy/paste operation or Select No to cancel.", vbYesNo + vbExclamation, "Product Costing")

    If ans = vbNo Then Exit Sub
    Application.ScreenUpdating = False

    With Worksheets("Direct Materials")
        Set rng = .Range("Z9:Z220")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z226:Z306")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z311:Z471")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z476:Z524")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value
    End With

    MsgBox "Copy / paste operation is complete.  Select OK to continue.", vbOKOnly + vbInformation, "Product Costing"

    Application.ScreenUpdating = True
Exit Sub
EH:
    MsgBox "Something went horribly wrong!"
End Sub

【讨论】:

  • 公平的 +1 以获得彻底和详细的解释(对我也很有用)
  • 谢谢@chris。因此,为了使其正常工作,我将不得不在 1 月份的某个时间运行宏以将数据放在 1 月份的列 (BK) 中?我刚刚对其进行了测试,并将代码放置在二月列中...假设我在一月底忘记运行宏,现在是二月,我怎样才能确保数据被复制到一月?到目前为止,我感谢您的所有帮助。我提到这一点是为了通过将值复制到错误的月份来帮助避免人为错误。有没有办法让用户确认数据放在哪一列?
  • 如所写,Sub 将根据今天的日期将数据放在列中。您可以设计其他规则,比如截至每月 10 日、上个月的地点 (Month(Now()-10)) 或使用MsgBoxInputBox 询问用户。
  • 谢谢@chrisneilsen。一切都摆平了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多