Excel基于标题行将单列拆分为多列

时间:2017-09-16 01:35:06

标签: excel split multiple-columns

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

我还没有找到一个简单的方法来做到这一点,所以任何帮助都会受到赞赏。

由于

2 个答案:

答案 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项的繁琐重复是必要的。如果列AB中没有与当前输出行和列对数匹配的对,则SUMPRODUCT传递0,不幸的是,INDEX(array,SUMPRODUCT())项的计算结果为INDEX(array,0)传递array(*)的第一个元素 - 这不是想要的。

enter image description here

您显然需要在输出区域的工作表的row 1column E中有足够的帮助值 - 列BA的最大值分别确定要求。超出输出(如图所示)不是问题,因为任何冗余位置的公式只评估为""

(*)实际上,对于单个列array,公式=INDEX(array,0)的计算结果为array。当用作单元格公式(而不是用作一系列单元格中的数组公式)时,公式只需从array中选取第一个值。