次のようなデータがあります。
BOB | 4
BOB | 3
BOB | 7
MARY | 1
JOE | 2
JOE | 1
MIKE | 6
次のようなデータになりたいです。
BOB | 4 | 3 | 7
MARY | 1 | |
JOE | 2 | 1 |
MIKE | 6 | |
問題は、名前が表示される可変回数をどのように説明するかということです。
次のようなデータがあります。
BOB | 4
BOB | 3
BOB | 7
MARY | 1
JOE | 2
JOE | 1
MIKE | 6
次のようなデータになりたいです。
BOB | 4 | 3 | 7
MARY | 1 | |
JOE | 2 | 1 |
MIKE | 6 | |
問題は、名前が表示される可変回数をどのように説明するかということです。
次のコードを思いつきました。すっきりできそうな感じです。
これは、シート上で選択されたデータのブロックに対して機能します (事前に並べ替えられていると仮定します)。同じエリアの同じシートに出力します。
Sub WrapDuplicates()
Dim data(), i As Long, startCell As Range, rwCnt As Long, col As Long
data = Selection //pull selected data into an array
Set startCell = Selection.Cells(1, 1) //Get reference to write results to
Selection.ClearContents //remove original data
startCell = data(1, 1) //Output first name
startCell.Offset(0, 1) = data(1, 2) //Output first value
rwCnt = 0
col = 2
For i = 2 To UBound(data) //Loop through array and check if name is same or not and output accordingly
If data(i, 1) = data(i - 1, 1) Then
startCell.Offset(rwCnt, col) = data(i, 2)
col = col + 1
Else
rwCnt = rwCnt + 1
col = 2
startCell.Offset(rwCnt, 0) = data(i, 1)
startCell.Offset(rwCnt, 1) = data(i, 2)
End If
Next i
End Sub
投稿のexcel-vbaタグに基づいたコードでこれを行いたいと思います。
また、データが名前でソートされているか、コードが実行される前に名前でソートしても問題ないと仮定しています。
ソースはシート 1、ターゲットはシート 2 にあります。コードは Excel VBA にあります。サンプル データを使用してテストし、このサブルーチンを Excel コード ビハインドの ThisWorkbook セクションにドロップして、再生を押しました。
ターゲット ヘッダーは毎回書き換えられるため、パフォーマンスの観点からは理想的ではありませんが、それ以外の問題はないと思います。問題になる場合は、ターゲット列のインデックス = 2 をチェックする if ステートメントでラップできます。
Sub ColumnsToRows()
Dim rowHeading
Dim previousRowHeading
Dim sourceRowIndex
Dim targetRowIndex
Dim targetColumnIndex
sourceRowIndex = 1
targetRowIndex = 1
targetColumnIndex = 2
rowHeading = Sheet1.Cells(sourceRowIndex, 1)
previousRowHeading = rowHeading
While Not rowHeading = ""
If Not previousRowHeading = rowHeading Then
targetRowIndex = targetRowIndex + 1
targetColumnIndex = 2
End If
Sheet2.Cells(targetRowIndex, 1) = rowHeading
Sheet2.Cells(targetRowIndex, targetColumnIndex) = Sheet1.Cells(sourceRowIndex, 2)
previousRowHeading = rowHeading
sourceRowIndex = sourceRowIndex + 1
targetColumnIndex = targetColumnIndex + 1
rowHeading = Sheet1.Cells(sourceRowIndex, 1)
Wend
End Sub
私は開発者であり、Excel の第一人者ではありません。これを自動的に行う Excel 関数、ピボット テーブル、またはその他の Excel マジックが存在する場合があります。