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。 谁知道接下来会发生什么 - 不要使用
Activate
或Select
(除非你有特定的需要)。 改为使用“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