Excel将单列分割为多行,根据标题行
我有一个excel文件,其中包含从LTSpice模拟中导出的数据。有280个不同的运行,但是数据在新运行开始时以两列(时间和电压)与运行单元一起导出。每次运行中的数据点数量都不相同。看起来是这样的:Excel将单列分割为多行,根据标题行
Run 1/280
Time1 Voltage1
Time2 Voltage2
Run 2/280
Time1 Voltage1
Time2 Voltage2
Time3 Voltage3
Run 3/280
我想运行单元行和时间和电压列在他们下面。
Run 1/280 Run 2/280 Run 3/280
Time1 Voltage1 Time1 Voltage1
Time2 Voltage2 Time2 Voltage2
Time3 Voltage3
我还没有找到一个简单的方法来做到这一点,所以任何帮助,将不胜感激。
感谢
没有VBA ...
您的输入列表中的每一行,你需要在那里此输入,以确定在输出的类型(Run x/xxx
页眉或terminal, voltage
对)和行和列对行属于。
在下图中,列A
和B
执行此任务。列A
标识输出列对和B
输出行,其中行0标识输出的标题行。
输出的标题行利用,如果一个array
以升序进行排序,并重复值然后MATCH(x,array,0)
找到第一元件的array
等于x的索引的事实。由于以下原因,对于其他行的公式中SUMPRODUCT
术语的繁琐重复是必需的。如果A
和B
列中没有匹配对与当前输出行和列对号码匹配,那么SUMPRODUCT
将递送0,并且不幸的是,INDEX(array,SUMPRODUCT())
条款评估为INDEX(array,0)
,它提供了第一个元素array
(*) - 这不是被通缉。
你显然需要row 1
和输出区域的工作表column E
足够的帮手值 - 列B
和A
的最大值,分别决定的要求。过大的输出(如图所示)并不成问题,因为任何冗余位置中的公式都简单评估为""
。 (*)实际上,对于单列array
,公式=INDEX(array,0)
自身评估为array
。当用作单元格公式(而不是用作单元格范围内的数组公式)时,公式只需从array
中选取第一个值。
请试试这个代码。
Sub SplitToColumns()
' 16 Sep 2017
Dim WsS As Worksheet ' S = "Source"
Dim WsD As Worksheet ' D = "Destination"
Dim WsDName As String
Dim RunId As String ' first word in "Run 1/280"
Dim RowId As Variant ' value in WsS.Column(A)
Dim Rl As Long ' last row (WsS)
Dim Rs As Long, Rd As Long ' row numbers
Dim Cd As Long ' column (WsD)
WsDName = "RemoteMan" ' change to a valid tab name
Application.ScreenUpdating = False
On Error Resume Next
Set WsD = Worksheets(WsDName)
If Err Then
' create WsD if it doesn't exist:
Set WsD = Worksheets.Add(After:=Worksheets(Worksheets.Count))
WsD.Name = WsDName
Cd = -1
Else
' continue adding new data to the right of existing,
With WsD.UsedRange
Cd = .Columns.Count - 1
If Cd = 1 And .Rows.Count = 1 Then Cd = -1
End With
End If
Set WsS = Worksheets("Remote") ' change to a valid tab name
With WsS
' presume "Run" & Time in column A, Voltage in Column B
' presume: no blank rows
Rl = .Cells(Rows.Count, "A").End(xlUp).Row
RunId = .Cells(2, 1).Value ' row 2 must have the RunId
RunId = Left(RunId, InStr(RunId, " ") - 1)
For Rs = 2 To Rl ' assume data start in row 2 (A1 may not be blank!)
RowId = .Cells(Rs, "A").Value
If InStr(1, RowId, RunId, vbTextCompare) = 1 Then
Rd = 1 ' first row to use in WsD
Cd = Cd + 2 ' determine next columns
End If
WsD.Cells(Rd, Cd).Value = RowId
WsD.Cells(Rd, Cd + 1).Value = .Cells(Rs, "B").Value
Rd = Rd + 1 ' next row to use
Next Rs
End With
Application.ScreenUpdating = True
End Sub