2

次のような形式の Excel スプレッドシートがあります。

前

私がやろうとしているのは、次のようにフォーマットすることです。

後

だから、それは一種の転置だと思います(それを呼び出す方法がわかりません)。

私は最後の 1 時間半を VBA で実行しようとしましたが、成功しませんでした。

これはフォーマットのサンプルにすぎません。実際には約 50,000 個あるので、VBA などを使用して行う必要があります。

誰かがこれを行う方法で私を助けることができますか?

4

4 に答える 4

3

Excel 2007 では、必ずしも VBA は必要ありません。ピボット テーブル ウィザード (Alt+D、P) で [複数の連結範囲] を選択し、次に [ページ フィールドを作成します] を選択し、データを選択します。次に、[新しいワークシート] を選択し、完了します。ピボット テーブルの一番下の RH セルをダブルクリックします。ColumnA をフィルタリングして空白行を削除し、ColumnB をフィルタリングして「Type」を含む行を削除します。「Row」と「Column」の右側に列を挿入し、ルックアップ値を入力します。

于 2012-07-20T00:08:08.377 に答える
1

LOOKUP に完全に慣れておらず、扱いやすい数の範囲がある場合は、もう少し面倒な代替手段がありますが、そのような「転置」が再び必要になり、その方法を正確に忘れてしまった場合は、覚えやすいかもしれません!

  1. 範囲と同じ数のデータ スプレッドシートのコピーを複製します (「元の」[Sheet1 など] をバックアップとして保持します)。
  2. 列 B と列 C を各コピー (シート 1 ではなく) に挿入します。
  3. Sheet2 で、E1 と E2 を C3 と D3 にコピーします。
  4. Sheet3 で、F1 と F2 を C3 と D3 にコピーします。
  5. Sheet4 で、G1 と G2 を C3 と D3 にコピーします。
  6. 必要に応じて、3.~5.の工程を繰り返します。
  7. Sheet2 で列 F と G を削除します。
  8. Sheet3 で列 E と G を削除します。
  9. Sheet4 で列 E と F を削除します。
  10. 必要に応じて、7.~9.の工程を繰り返します。
  11. 列 C と D で、Sheets2 から 4 のそれぞれの範囲の数値と値に文字 (たとえば「z」) を追加します。
  12. シート 2 で C3 と D3 を選択し、右下隅をダブルクリックします。
  13. 他のすべてのシート (Sheet1 を除く) に対して 12. を繰り返します。
  14. Sheet2 から F 列と G 列を削除します。
  15. Sheet3 から E 列と G 列を削除します。
  16. Sheet4 から E 列と F 列を削除します。
  17. 必要に応じて、14.~16.の工程を繰り返します。
  18. r2z の Sheet3 の ColumnC をフィルター処理し、Sheet2 の下部にコピーを表示します。
  19. シート 4 の ColumnC を r3z でフィルター処理し、コピーをシート 2 の下部に表示します。
  20. 必要に応じて、プロセス 18. と 19. を繰り返します。
  21. Sheet2 で、「z」を何も置き換えません。
于 2012-07-23T15:05:41.960 に答える
0

コピペだけでspecialを選択してtransposeできないの?

実際に OP をもう一度見ると、2 番目のスクリーンプリントの最初の 2 列は単純な転置ではないため、これは単純な転置ではありません。

最終編集

わかりました-うまくいくようです...

 Option Base 1

Sub moveData()

    Dim NumIterations As Integer
    NumIterations = ThisWorkbook.Sheets("target").Cells(Rows.Count, 3).End(xlUp).Row - 2

    'get the raw data and add to an array
    Dim n As Long
    Dim m As Long
    Dim myArray() As Long
    ReDim myArray(1 To NumIterations, 1 To 3)
    For n = 1 To NumIterations
        For m = 1 To 3
            myArray(n, m) = ThisWorkbook.Sheets("target").Cells(n + 2, m + 2)
        Next m
    Next n

    Dim q As Long
    Dim r As Long
    Dim myStaticArray()
    ReDim myStaticArray(1 To NumIterations, 1 To 2)
    For q = 1 To NumIterations
        For r = 1 To 2
            myStaticArray(q, r) = ThisWorkbook.Sheets("target").Cells(q + 2, r)
        Next r
    Next q


     'spit the data back out
    Dim i As Long
    Dim j As Long
    Dim myRow As Long
    myRow = 0

    For i = 1 To NumIterations
        For j = 1 To 3

            myRow = myRow + 1

            ThisWorkbook.Sheets("answer").Cells(myRow, 1) = myStaticArray(i, 1)
            ThisWorkbook.Sheets("answer").Cells(myRow, 2) = myStaticArray(i, 2)

            If j = 1 Then
                ThisWorkbook.Sheets("answer").Cells(myRow, 3) = "r1"
                ThisWorkbook.Sheets("answer").Cells(myRow, 4) = "11-000 - 13-000"
            ElseIf j = 2 Then
                ThisWorkbook.Sheets("answer").Cells(myRow, 3) = "r2"
                ThisWorkbook.Sheets("answer").Cells(myRow, 4) = "15-000 - 30-000"
            ElseIf j = 3 Then
                ThisWorkbook.Sheets("answer").Cells(myRow, 3) = "r3"
                ThisWorkbook.Sheets("answer").Cells(myRow, 4) = "31-000"
            End If

            ThisWorkbook.Sheets("answer").Cells(myRow, 5) = myArray(i, j)

        Next j
    Next i

End Sub
于 2012-07-19T20:21:06.407 に答える
0

以下に示すように、PasteSpecial を使用してそれを行うことができます。

Sheet(1).UsedRange.Select
Selection.Copy
ActiveWorkbook.Sheets.Add   'Make some room for pasting the cells in the new format 
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
Application.CutCopyMode = False
于 2012-07-19T20:25:52.160 に答える