首页 > 解决方案 > Excel 宏 - 重复宏代码但应用于不同的列

问题描述

我对 VBA 很陌生,想寻求一些建议。

我正在运行一个宏来将表编译成逐行事务列表。

但是,我不想为不同的月份列复制此代码 11 次。

如何执行循环,以便在所有 12 个月内自动执行任务?

下面的代码和表格转换按照附图。

谢谢!

'For Apr'20 - 'Copy name and category to clipboard
    
    Sheets("Sheet2").Range("A3:C15").Copy
    
'Select last row of reference cell

    lastRow = Sheets("Consolidated Cost Sheet_Working").Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & lastRow).Select

'Paste clipboard as values

    ActiveCell.PasteSpecial xlPasteValues
    
'Copy period and drag down

    Sheets("Sheet2").Range("D2").Copy
    lastRow = Sheets("Consolidated Cost Sheet_Working").Cells(Rows.Count, "D").End(xlUp).Row + 1
    Range("D" & lastRow).Select
    ActiveCell.PasteSpecial xlPasteValues
    
    Sheets("Consolidated Cost Sheet_Working").Range("C3").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(0, 1).Select
    Range(Selection, Selection.End(xlUp)).Select
    Application.CutCopyMode = False
    Selection.FillDown
    
'Copy Financial Info to Sheet

    Sheets("Sheet2").Range("D3:D15").Copy
    lastRow = Sheets("Consolidated Cost Sheet_Working").Cells(Rows.Count, "E").End(xlUp).Row + 1
    Range("E" & lastRow).Select
    ActiveCell.PasteSpecial xlPasteValuesAndNumberFormats

转换表概念 在此处输入图像描述

标签: excelvba

解决方案


看起来您录制了一个宏,现在您想要概括该功能。我们很多人就是这样开始的。您录制的宏看起来像这样

Sub Macro1()

    ' Lots of code

End Sub

实现目标的最快方法是更改​​原始宏以将列作为参数传递。

Sub Macro1(Byval col as String)

    ' Lots of code

End Sub

然后用列 col 替换宏中“D”列的每个实例。例如:

    Sheets("Sheet2").Range(col & "2").Copy
    lastRow = Sheets("Consolidated Cost Sheet_Working").Cells(Rows.Count, col).End(xlUp).Row + 1
    Range(col & lastRow).Select
    ActiveCell.PasteSpecial xlPasteValues

然后你可以从另一个 sub 重复调用宏,每次传入不同的列。

Sub OtherSub()

    Macro1 "D"
    Macro1 "E"
    Macro1 "F"
    Macro1 "G"

End Sub

可以通过多种方式改进此代码(我特别建议您阅读一些如何避免选择的示例),但这应该可以帮助您入门。


推荐阅读