根据列标题创build新的Excel行并填充数据

我必须创build基于inputxls文件头的输出XLS文件。 我正在给予低于确切的要求。 希望清楚。 如果没有,请让我知道。

Iput XLS --> ID Version NameLegacy ProjectNumber OwnerName Language Keywords OwnerSite External Content Relevance Periodic Coremap ValidTo 1 1 Mohan 1000 x ENG ABCD AB No ok no 5 2017-10-14 2018-10-14 2 2 Shayam 1001 y ENG EFGH BC No ok yes 2 2017-10-14 2018-10-14 3 1 Sourabh 1002 z ENG IJKL CD Yes no no 4 2017-10-14 2018-10-14 

基于这个inputXLS文件,我需要输出XLS文件如下。 input文件的每一行将有12行输出文件,各自的值将被填入input文件的输出文件中。

 ID Version IBANAME STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE 1 1 NameLegacy Mohan 1 1 ProjectNumber 1000 1 1 OwnerName x 1 1 Language ENG 1 1 Keywords ABCD 1 1 OwnerSite AB 1 1 External No 1 1 Content ok 1 1 Relevance no 1 1 Periodic 5 1 1 Coremap 2017-10-14 1 1 ValidTo 2018-10-14 2 2 NameLegacy Shayam 2 2 ProjectNumber 1001 2 2 OwnerName y 2 2 Language ENG 2 2 Keywords EFGH 2 2 OwnerSite BC 2 2 External No 2 2 Content ok 2 2 Relevance yes 2 2 Periodic 2 2 2 Coremap 2017-10-14 2 2 ValidTo 2018-10-14 3 1 NameLegacy Sourabh 3 1 ProjectNumber 1002 3 1 OwnerName z 3 1 Language ENG 3 1 Keywords IJKL 3 1 OwnerSite CD 3 1 External Yes 3 1 Content no 3 1 Relevance no 3 1 Periodic 4 3 1 Coremap 2017-10-14 3 1 ValidTo 2018-10-14 

提前致谢。

有几个步骤来使用VBA来完成此操作。 主要目的是确定你实际上正在做什么。

您似乎正试图对logging进行分类,以确定信息的格式,并将其放在仅指定为该格式的列中。 为此,我创build了一个非常简单的自定义函数..

这个函数将头部的名称作为一个string,并使用Select / Case来查找目标工作表需要的列的适当匹配。 这是自定义您的具体布局。 随意适应或改变它。

function在目标上find正确的列

 Function ColFinder(header As String) As Long 'Target Column Format = Column # '"STRINGVALUE" = 4 '"INTEGERVALUE" = 5 '"FLOATVALUE" = 6 '"FLOATVALUEWITHUNITS"= 7 '"BOOLVALUE" = 8 '"TIMEVALUE" = 9 '"URLVALUE" = 10 '"REFERENCEVALUE" = 11 ' **** SET VALUES FOR CASES TO MATCH DESIRED FORMAT ABOVE **** 'Default to Column 4 StringValue if unknown Select Case header Case "NameLegacy" ColFinder = 4 Case "ProjectNumber" ColFinder = 5 Case "OwnerName" ColFinder = 4 Case "Language" ColFinder = 4 Case "Keywords" ColFinder = 4 Case "OwnerSite" ColFinder = 10 Case "External" ColFinder = 8 Case "Content" ColFinder = 11 Case "Relevance" ColFinder = 8 Case "Periodic" ColFinder = 5 Case "Coremap" ColFinder = 9 Case "ValidTo" ColFinder = 9 End Select End Function 

使用一些其他函数来查找最后一行和最后一列

最后一行function

 Function lastRow(sheet As String) As Long lastRow = Sheets(sheet).Cells(Rows.Count, "A").End(xlUp).Row 'Using Cells() End Function 

最后一列function

 Function lastCol(sheet As String) As Long lastCol = Sheets(sheet).Cells(1, Columns.Count).End(xlToLeft).Column End Function 

使用这三个函数,您可以在源表单中逐行运行一个简单的循环,然后查看数据来自哪个列,然后将其放在适当的目标上。

此示例在同一工作簿中使用两个工作表。 要更改,只需扩展地址以包含其他工作簿或工作表。 这只是展示这个概念的最简单的方法。

代码循环通过网页

 Sub ColsToRows() Dim tRow As Long, sCol As Long, sRow As Long Dim source As String, target As String Dim tString As String source = "Sheet1" target = "Sheet2" 'Set target Row starting point tRow = 2 'Loop through Source Rows with Data, starting after Header Row For sRow = 2 To lastRow(source) 'Loop through each header in Source Row For sCol = 3 To lastCol(source) 'Set Basic Columns on Target Sheets(target).Cells(tRow, 1) = Sheets(source).Cells(sRow, 1) Sheets(target).Cells(tRow, 2) = Sheets(source).Cells(sRow, 2) 'Get Header Name as Temp String to find which format it requires tString = Sheets(source).Cells(1, sCol) 'Label Column 3 of Target Sheets(target).Cells(tRow, 3) = Sheets(source).Cells(1, sCol) 'Find Appropriate Column using custom Formula [ColFinder(header As String) As Long] Sheets(target).Cells(tRow, ColFinder(tString)) = Sheets(source).Cells(sRow, sCol) 'Advance to next Target Row tRow = tRow + 1 Next sCol Next sRow End Sub 

源代码示例 源表单

目标工作表示例 目标表

您可以使用Excel中的公式将上表转换为下表。

我们从定义所有input范围开始,没有前2列和标题行作为名为input的范围。 这是通过select所有的范围,并在“名称框”中input“input”来完成的: 定义输入范围

在工作簿中col_index创build下表,然后将其全部定义并指定一个名为col_index的范围:

 STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE NameLegacy ProjectNumber External Coremap OwnerSite Content OwnerName Periodic Relevance ValidTo Language Keywords 

col_index范围

这个表格基本上把原始的列分类到新的地方。 您可以将值,行或列添加到表中,只要将其全部保留在名称范围col_index下,它就会保持不变。

然后创build另一个表头:

 ID Version IBANAME STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE 

现在将以下公式粘贴到每列1-4中的第一行:

  1. ID: =IF(C2=sheet1!$C$1,A1+1,A1)
  2. 版本: =VLOOKUP(A2,sheet1!$A$1:$B$4,2)
  3. 在selectIBANAME下的前12行后,按F2,粘贴: =TRANSPOSE(sheet1!C1:N1)作为数组公式 ! (粘贴到公式框后按Ctrl + Shift + Enter)
  4. STRINGVALUE: =IF(ISERROR(MATCH($C16,OFFSET(col_index,0,MATCH(D$15,OFFSET(col_index,0,0,1,11),0)-1,5,1),0)-1),"",OFFSET(input,TRUNC((ROW()-ROW($D$16))/COLUMNS(input)),MOD(ROW()-ROW($D$16),COLUMNS(input)),1,1))

接下来,将列IDVersion 12行向下拖动到下一个ID(行14),然后将单元格A2的值更改为1 ,并将C14的值更改为=C2 ,并继续拖动列IDVersionIBANAME直到数据到达结束。 最后,将单元格D2左移到行的末尾,然后向下拖动以填充所有表格。

这与公式看起来如何: 向量化表 - 公式

这是与价值观:

向量化表格 - 值

而已 ;)