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

时间:2016-07-21 21:12:07

标签: excel excel-vba vba

我必须根据输入的xls文件头创建输出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

基于此输入XLS文件,我需要输出XLS文件,如下所示。每行输入文件将有12行输出文件,相应的值将从输入文件填入输出文件。

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     

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

在工作簿中根据需要创建下表,然后定义全部以及名为col_index的范围:

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

col_index range

此表基本上将原始列排序到新位置。您可以向表中添加值,行或列,只要您在名称范围col_index下保留所有,它就会保持不变。

然后创建另一个表头:

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. 在IBANAME下选择前12行后,按F2,然后将=TRANSPOSE(sheet1!C1:N1)粘贴为array formula! (在粘贴到公式框后按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))
  5. 接下来,将列IDVersion向下拖动12行,到下一个ID(第14行),然后将单元格A2中的值更改为1C14=C2中的值,并继续拖动列IDVersionIBANAME,直到达到数据末尾。最后,将单元格D2向左拖动到行的末尾,然后向下拖动以填充所有表格。

    这是它与公式的看法: Vectorizing table - formulas

    这是值:

    Vectorizing table - values

    就是这样;)

答案 1 :(得分:0)

使用VBA执行此操作有几个步骤。主要目的是确定您实际要做的事情。

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

此函数将标题的名称作为字符串,并使用Select / Case查找目标表所需列的相应匹配项。这是您自定义的特定布局。随意适应或改变它。

在目标上找到正确的栏目的功能

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

使用其他一些功能查找Last Row&最后一栏

最后一行功能

Function lastRow(sheet As String) As Long

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

End 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

来源表示例 Source Sheet

目标表示例 Target Sheet