我必须根据输入的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
提前致谢。
答案 0 :(得分:0)
您可以使用Excel中的公式将上表转换为下表。
我们从定义所有输入范围开始,没有前2列,标题行作为名为input
的范围。这是通过选择所有范围并在“名称框”中键入“输入”来完成的:
在工作簿中根据需要创建下表,然后定义全部以及名为col_index
的范围:
STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE
NameLegacy ProjectNumber External Coremap OwnerSite Content
OwnerName Periodic Relevance ValidTo
Language
Keywords
此表基本上将原始列排序到新位置。您可以向表中添加值,行或列,只要您在名称范围col_index
下保留所有,它就会保持不变。
然后创建另一个表头:
ID Version IBANAME STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE
现在将以下公式粘贴到第1-4列的第一行中:
=IF(C2=sheet1!$C$1,A1+1,A1)
=VLOOKUP(A2,sheet1!$A$1:$B$4,2)
=TRANSPOSE(sheet1!C1:N1)
粘贴为array formula! (在粘贴到公式框后按ctrl + shift + enter)=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))
接下来,将列ID
和Version
向下拖动12行,到下一个ID(第14行),然后将单元格A2
中的值更改为1
, C14
到=C2
中的值,并继续拖动列ID
,Version
和IBANAME
,直到达到数据末尾。最后,将单元格D2
向左拖动到行的末尾,然后向下拖动以填充所有表格。
这是值:
就是这样;)
答案 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