macros匹配或如果然后复制到一个新的标签

我一直坚持着我正在构build的一个macros,我想知道是否有人可以帮助我。

macros:

它基本上做了什么,它将大量的原始数据放入主工作簿中的许多excel文件(标签)中,然后将从所有导入的标签中抽取的原始数据整合到新的标准仪表板标签中每月报告。 每个导入的文件都来自全球不同的办公桌,因此每个文件都有不同的格式和需要build立一个标准的字段。 一旦所有文件“标签”加载/拉到主“主”excel文件,它提取具体的信息,例如

这是从许多工作簿导入到“主”工作簿的选项卡之一: 在这里输入图像说明

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

'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 

等等

它是这样的,直到所有列的所有数据都被拉入标准仪表板

我的问题是下一个:

Country A的列的范围可以由于外部格式而改变,并且曾经是Derivative Class现在可以是Derivative Ticker ,并且数据将被拉到标准仪表板的错误列上。

我会感兴趣的是一个macros,而不是复制数据从一个手动固定的范围,例如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" 

我希望你能在这里给我一些启示,因为我从几个来源的数据中抽取了3万多行。

首先,您需要使用查找functionfind标题出现的列。 您可以使用这两个工作表自动查找列的位置。 像这样的函数将会是有用的,它search一个给定的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 

然后我也会将你的代码压缩成一个子函数,因为你每次都在做相同的动作(每次复制粘贴在同一张纸上)。 这将find您指定的标题在两个工作表中所在的列号,然后将该列从一个工作表复制到另一个工作表。 像这样的东西:

 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 

您可能会发现最简单的解决scheme是修改原始数据,使其符合标准布局。 为每个input做这个,并做一个macros录制。 然后,当您从同一来源重新导入数据时,可以重新使用录制的macros。

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

 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 

另一种方法是设置macros,它将自动识别标题关键字并解释它们。 这需要更多的工作。 除非您预计文件会不断变化,否则随时调整导入程序可能会更容易。