我有一个excel文件,其中包含从LTSpice模拟中导出的数据。有280种不同的运行,但是数据在新运行开始时以运行单元格的形式导出为两列(时间和电压)。每次运行中的数据点数量各不相同。看起来像这样:
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
我还没有找到一个简单的方法来做到这一点,所以任何帮助都会受到赞赏。
由于
答案 0 :(得分:0)
请尝试此代码。
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
答案 1 :(得分:0)
没有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
中选取第一个值。