2017-09-16 119 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