具有匹配的宏或如果然后复制到新选项卡

时间:2014-04-22 12:01:25

标签: excel excel-vba vba

我一直坚持使用我正在构建的宏,我想知道是否有人可以帮助我。

宏:

它基本上做了什么,它将主要工作簿插入到包含大量原始数据的多个excel文件(选项卡)中,然后整合从导入到新标准仪表板的所有选项卡中提取的原始数据用于月度报告的标签。导入的每个文件都来自世界各地的不同桌面,因此每个文件都有不同的格式,需要建立标准文件。一旦所有文件“标签”被加载/拉到主“主”excel文件上,它就会提取特定信息,例如。

这是从许多工作簿导入“Main”工作簿的选项卡之一: enter image description here

这是从导入的选项卡中提取数据并将其复制到新选项卡

的宏
'Exporting Raw Data from Imported Tab "Country A
'Derivative Class column “D8” = Security Type on Standard Dashboard column “I2” 
Sheets("Operations").Select
Range("D8").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Worksheets("Country A").Cells(Rows.Count, "I").End(xlUp).Offset(1, 0).PasteSpecia 
Paste:=xlPasteValues

'Derivative Ticker column “E8” = Security Alias on Standard Dashboard column “F2”
Sheets("Operations").Select
Range("E8").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Worksheets("Country A ").Cells(Rows.Count, "F").End(xlUp).Offset(1, 0).PasteSpecial 
Paste:=xlPasteValues

'Fund column “F8”= Portfolio Group on Standard Dashboard column “A2”
Sheets("Operations").Select
Range("F8").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Worksheets("Country A").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial 
Paste:=xlPasteValues

ETC

在所有列的所有数据都被提取到标准仪表板

之前,它会这样

我的问题是下一个:

Country A上的列范围可能因外部格式而发生变化,曾经Derivative Class现在可能会Derivative Ticker,因此数据会被拉到错误的列中标准仪表板。

我会对一个宏感兴趣,而不是从手动固定范围复制数据,例如D8,在这种情况下{Range("D8").Select, Selection.copy …}以列的标题复制列中的数据,例如Derivative ClassDerivative TickerFundPrice等等。

类似的东西:

If "Derivative Class" found 
then 
    copy "Range(Selection, Selection.End(xlDown)).Select" 
    to  "Worksheets("Country A").Cells(Rows.Count, "I").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues"

我希望你能在这里向我展示一些亮点,因为我从多个来源获取了超过30k的行数。

2 个答案:

答案 0 :(得分:0)

首先,您需要使用“查找”功能找到标题出现的列。您可以将这两个工作表用于自动查找列位置。像这样的函数可以用于搜索给定sheetname的行以及要查看的行并返回列号的值:

Function FindColumn(ShtName As String, SearchValue As String, SearchRow As Integer) As Integer

    Dim FoundRng As Range, Sht As Worksheet

    Set Sht = ThisWorkbook.Sheets(ShtName)

    Set FoundRng = Sht.Rows(SearchRow).Find(What:=SearchValue, _
                                            After:=Sht.Cells(SearchRow, 1), _
                                            LookIn:=xlValues, _
                                            LookAt:=xlWhole, _
                                            SearchOrder:=xlByColumns, _
                                            SearchDirection:=xlNext, _
                                            MatchCase:=True)

    FindColumn = FoundRng.Column

End Function

然后我还会将你的代码压缩成一个子函数,因为你每次都在做同样的动作(每次复制然后粘贴在同一张纸之间)。这将找到指定标题位于两个工作表中的列号,然后将列从一个工作表复制到另一个工作表。像这样:

Sub CopyData(SearchValue As String)

    Dim InputColumn As Integer, OutputColumn As Integer

    InputColumn = FindColumn("Operations", SearchValue, 7)
    OutputColumn = FindColumn("Country A", SearchValue, 1)

    With ThisWorkbook.Sheets("Operations")
        .Range(.Cells(8, InputColumn), .Cells(8, InputColumn).End(xlDown)).Copy
    End With

    With ThisWorkbook.Sheets("Country A")
        .Cells(.Rows.Count, OutputColumn).End(xlUp).Offset(1, 0).PasteSpecial _
         Paste:=xlPasteValues
    End With

End Sub

然后使用这两个函数,您可以像这样运行主程序:

Sub MainRoutine()

    CopyData "Derivative"
    CopyData "Derivative Ticker"
    CopyData "Maturity"
    ...

End Sub

答案 1 :(得分:-1)

您可能会发现最简单的解决方案是修改原始数据,使其符合标准布局。为每个输入执行此操作,并进行宏录制。然后,当您从同一来源重新导入数据时,您可以重新使用录制的宏。

如果要对每个数据导入使用相同的宏,则可以编写代码以特定方式处理特定源。例如,可以在C,D和F列中找到来自A国的所有相关数据。而来自B国的所有数据都可以在A,C和E列中找到。

if data_source = "Country A" then
    'copy data from col. C8, D8 and F8
elseif data_source = "Country B" then
    'copy data from col. A8, C8, and E8
end if

另一种方法是设置宏,它将自动识别标题关键字并解释它们。这需要更多的工作。除非您希望文件不断更改,否则可能更容易调整导入过程。