Excel VBA – 如何将列和粘贴值复制到新列每次启动macros

我目前有一个电子表格,可以计算Z列中的差异。在本月底,我想将这些值复制并粘贴到同一电子表格中的另一列中,以跟踪每个月的差异。 我已经开发了一个macros,复制需要从列Z复制到列BK的内容。 现在我每次运行macros时都会复制列Z并将其粘贴到列BK中。 我真正想要发生的是,每次运行macros时,我都希望它复制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 

下面是您的代码重构,添加所需的偏移量,并解决其他一些问题:

  • 使用正确的数据types为ans
  • 不要使用Resume Next 。 那说的是我不在乎我有没有错误,就是不pipe。 谁知道接下来会发生什么
  • 不要使用ActivateSelect (除非你有特定的需要)。 改为使用“ Workbook ,“ Worksheet ”和“ Range对象。 请注意, 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