2017-09-16 55 views
0

我有一个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 

我还没有找到一个简单的方法来做到这一点,所以任何帮助,将不胜感激。

感谢

回答

0

没有VBA ...

您的输入列表中的每一行,你需要在那里此输入,以确定在输出的类型(Run x/xxx页眉或terminal, voltage对)和行和列对行属于。

在下图中,列AB执行此任务。列A标识输出列对和B输出行,其中行0标识输出的标题行。

输出的标题行利用,如果一个array以升序进行排序,并重复值然后MATCH(x,array,0)找到第一元件的array等于x的索引的事实。由于以下原因,对于其他行的公式中SUMPRODUCT术语的繁琐重复是必需的。如果AB列中没有匹配对与当前输出行和列对号码匹配,那么SUMPRODUCT将递送0,并且不幸的是,INDEX(array,SUMPRODUCT())条款评估为INDEX(array,0),它提供了第一个元素array(*) - 这不是被通缉。

enter image description here

你显然需要row 1和输出区域的工作表column E足够的帮手值 - 列BA的最大值,分别决定的要求。过大的输出(如图所示)并不成问题,因为任何冗余位置中的公式都简单评估为""。 (*)实际上,对于单列array,公式=INDEX(array,0)自身评估为array。当用作单元格公式(而不是用作单元格范围内的数组公式)时,公式只需从array中选取第一个值。

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