3

次のような基本形式の大きなExcelテーブル(591列、2645行)があります。

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 |
|======+========+========+========+========+========+========+========|
| 0.01 |  0.35  |        |        |        |        | 0.1351 | 0.2398 | 
| 0.02 |        |  0.42  |        |        |        | 0.4314 | 0.4342 | 
| 0.03 |        |        |  0.99  |        |        | 0.3414 | 0.4321 |
| 0.04 |        |        |        |  0.12  |        | 0.4351 | 0.4256 |
| 0.05 |        |        |        |        |  0.66  | 0.7894 | 0.9874 |

これは基本的にデータストリームの記録であり、一部のフィールドはタイムステップごとに1回だけサンプリングされ、他のフィールドは個々のタイムステップごとにサンプリングされます。ループが終了すると、「レコード」全体が記録されます(つまり、「データ1」が再度書き込まれます)。

データ処理と分析を目的とした最終的なデータレコードは、次のようになります。

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 |
|======+========+========+========+========+========+========+========|
| 0.05 |  0.35  |  0.42  |  0.99  |  0.12  |  0.66  | 0.7894 | 0.9874 | 

タイムスタンプはテーブルにあるタイムスタンプと等しく、定期的なデータフィールドはその時点のデータ値と等しく、定期的なデータフィールドはこれらの各フィールドについて最後に報告された値と等しいことに注意してください。

その場合、単一ループのレコードは、基本的に、指定された時間枠内の任意のフィールドに対して記録された最終値で構成されます。これは1つのステップで簡単に実行できますが、データセットごとに処理するデータの行が2600以上あり、処理するデータセットが6つあります。

データファイル全体でこれを行うためのクリーン/シンプル/実用的な方法はありますか?私はこれをいくつもの方法でブルートフォースすることができましたが、車輪の再発明をする必要がないことを望んでいます。出力を新しいワークシートに書き込むことができれば、それは素晴らしいことです。

4

4 に答える 4

2

このような何かがあなたのために働くかもしれません

Sub tester()
    SummarizeRows ThisWorkbook.Sheets("Sheet1").Range("A1"), _
                  ThisWorkbook.Sheets("Sheet2").Range("A1")
End Sub


Sub SummarizeRows(rngIn As Range, rngOut As Range)

Const MASTER_COL As Long = 2 'summarize when new value here (except first row)

Dim vals(), data
Dim numRows As Long, numCols As Long
Dim r As Long, c As Long, r_out As Long
Dim c2 As Long, v

    r_out = 1
    'get all the input data
    data = rngIn.CurrentRegion.Value
    numRows = UBound(data, 1)
    numCols = UBound(data, 2)
    ReDim vals(1 To numCols)

    For r = 2 To numRows
        For c = 1 To numCols
            v = data(r, c)
            If Len(v) > 0 Then
                If c = MASTER_COL And r > 2 Then
                    'new value in "master" column...
                    r_out = r_out + 1
                    For c2 = 1 To numCols
                        data(r_out, c2) = vals(c2)
                        vals(c2) = ""
                    Next c2
                End If
                vals(c) = v
            End If
        Next
    Next r

    'write any last values
    r_out = r_out + 1
    For c2 = 1 To numCols
        data(r_out, c2) = vals(c2)
    Next c2

    rngOut.Resize(r_out, numCols).Value = data

End Sub
于 2012-04-19T20:49:27.163 に答える
2

SOへようこそ。

長さ5のサイクルに基づく小さな解決策があります。これはindirect関数を使用しており、必要に応じて拡張できるはずです。

まず、0.15までの時間を取得するために、例にいくつかの行を追加しました。これはa1からh16を占めます。次に、i17をj19に追加して、調べる行を指定しました。私はこれらを作りました:

 2  6
 7 11
12 16

これは、i17とj17が行2から6(またはデータのサイクル1)を表すことを意味します。j17 = i17 + 4、j18 = i17+1にすることをお勧めします。

OK、これが間接関数です。a17で=INDIRECT("A"&$J17)、これは、列A、行2を指定します(セルi17に2があるためです。$手段は絶対列を使用し、数式でIを使用し続けます)。

b17では=SUM(INDIRECT("b"&$I17&":b"&"$"&$J17))、これはb2からb6の合計を意味します。

c17では、=SUM(INDIRECT("c"&$I17&":c"&"$"&$J17))

d17、e17、およびf17のパターンを繰り返します。

g17では、g6にあるものを。でコピーしたいだけです=INDIRECT("g"&$J17)

h17では、h6にあるものを。でコピーし=INDIRECT("h"&$J17)ます。

次に、数式をa17:h17から3行下にコピーできます。

于 2012-04-19T20:45:03.800 に答える
1

これが私が使ってしまった解決策です...

まず、2番目のシート(シート2)を作成し、ヘッダー行をコピーして、最初の行の各レコードを最初のシート(シート1)の最初の行の最初のレコードと同じに設定しました。シート1の最初の行の値が空の場合は、ゼロに置き換えました。例えば:

=IF(Sheet1!A2="",0,Sheet1!A2)

次に、数式を使用して、値をシート1からシート2に条件付きでコピーするか、シート2の現在のセルより上の値を使用しました。たとえば、B3(2番目のレコード、最初のフィールド)では次のようになります。

=IF(Sheet1!B3="",B2,Sheet1!B3)

次に、これをシート1で使用可能なソース値を持つシート2のすべてのセルにコピーしました。結果は次のようになりました。

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 |
|======+========+========+========+========+========+========+========|
| 0.01 |  0.35  |  0     |  0     |  0     |  0     | 0.1351 | 0.2398 | 
| 0.02 |  0.35  |  0.42  |  0     |  0     |  0     | 0.4314 | 0.4342 | 
| 0.03 |  0.35  |  0.42  |  0.99  |  0     |  0     | 0.3414 | 0.4321 |
| 0.04 |  0.35  |  0.42  |  0.99  |  0.12  |  0     | 0.4351 | 0.4256 |
| 0.05 |  0.35  |  0.42  |  0.99  |  0.12  |  0.66  | 0.7894 | 0.9874 |

これにより、データを効果的に分析するための関連プロットを生成することができました。

于 2012-10-10T21:16:48.117 に答える
0

これをデータの下の行のセルに貼り付けます。Aは貼り付けている列です

=LOOKUP(2,1/(A1:A5<>""),A:A)
于 2012-04-19T19:28:29.423 に答える