2017-09-16 9 views
0

LTSpiceシミュレーションからエクスポートされたデータを含むExcelファイルがあります。 280の異なるランがありますが、データは新しいランの開始時にランセルで2つのカラム(時間と電圧)としてエクスポートされます。各実行のデータポイントの数はさまざまです。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

を...あなたの入力リストの行ごとに

、あなたはどここの入力出力にそのタイプ(Run x/xxxヘッダまたはterminal, voltageペア)、行と列のペアを特定する必要があります行が属する。

下の図では、列ABがこのタスクを実行します。列Aは出力列ペアを識別し、B出力行を識別します。ここで、行0は出力のヘッダー行を示します。

出力のヘッダー行はarrayが昇順にソートされた値を繰り返した場合、次にMATCH(x,array,0)はxに等しいarray最初要素のインデックスを検索しているという事実を利用します。以下の理由により、他の行の式におけるSUMPRODUCT項の面倒な繰り返しが必要となる。現在の出力行と列のペア番号の列ABに一致するペアがない場合、SUMPRODUCTは0を返します。INDEX(array,SUMPRODUCT())という用語はINDEX(array,0)と評価され、最初の要素はarray(*)です。必要とされています。それぞれの要件を決定し、列BAの最大値 -

enter image description here

は、あなたは明らかrow 1と出力領域でのワークシートのcolumn Eで十分なヘルパー値を必要としています。冗長位置の数式は単に""と評価されるので、出力をオーバーサイズすると(ピクチャが完了したとき)問題はありません。

(*)実際、単一の列の場合、arrayの式=INDEX(array,0)arrayと評価されます。数式はセルの範囲全体にわたって配列式として使用されているのではなく、単にarrayから最初の値を選択します。

0

このコードを試してください。 VBAなし

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 
関連する問題