次のような形式の Excel スプレッドシートがあります。
私がやろうとしているのは、次のようにフォーマットすることです。
だから、それは一種の転置だと思います(それを呼び出す方法がわかりません)。
私は最後の 1 時間半を VBA で実行しようとしましたが、成功しませんでした。
これはフォーマットのサンプルにすぎません。実際には約 50,000 個あるので、VBA などを使用して行う必要があります。
誰かがこれを行う方法で私を助けることができますか?
次のような形式の Excel スプレッドシートがあります。
私がやろうとしているのは、次のようにフォーマットすることです。
だから、それは一種の転置だと思います(それを呼び出す方法がわかりません)。
私は最後の 1 時間半を VBA で実行しようとしましたが、成功しませんでした。
これはフォーマットのサンプルにすぎません。実際には約 50,000 個あるので、VBA などを使用して行う必要があります。
誰かがこれを行う方法で私を助けることができますか?
Excel 2007 では、必ずしも VBA は必要ありません。ピボット テーブル ウィザード (Alt+D、P) で [複数の連結範囲] を選択し、次に [ページ フィールドを作成します] を選択し、データを選択します。次に、[新しいワークシート] を選択し、完了します。ピボット テーブルの一番下の RH セルをダブルクリックします。ColumnA をフィルタリングして空白行を削除し、ColumnB をフィルタリングして「Type」を含む行を削除します。「Row」と「Column」の右側に列を挿入し、ルックアップ値を入力します。
LOOKUP に完全に慣れておらず、扱いやすい数の範囲がある場合は、もう少し面倒な代替手段がありますが、そのような「転置」が再び必要になり、その方法を正確に忘れてしまった場合は、覚えやすいかもしれません!
コピペだけで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
以下に示すように、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