私は、このような時にはマクロを使うようにしています。
ピボットで属性そのものを出そう(数値的な意味合いでない文字列など)を表示しようとすると大変です。VBAでピボットの機能を改造する必要があります。
数式を使っても出せますが、算式が複雑になり、変更が大変になります。一番危ないのが算式の登録忘れです。削除忘れもあります。
下記マクロは標準モジュールに貼り付けてください。
※マクロの使い方は、ネットにたくさんあると思います。
※開発タブを表示してVisual Basicを選択し、挿入>標準モジュールとします。
「Sheet1」、「Sheet2」、「データの書き出し位置」、「答えの書き出し位置」A3、B3などは実際のBookに合わせてください。
質問の添付図にある「答え」の文字は入力しないでください。コードを貼り付けて、別名保存して実行してみてください。
当方、Excel2010です。
Public ws1 As Worksheet '// データのシート
Public ws2 As Worksheet '// 答えのシート
Public Const TopS = "A3" '// データの書き出し位置 ***
Public Const TopD = "B3" '// 答えの書き出し位置 ***
Sub 抽出01()
Dim num As Long '// 整理番号
Dim rgS As Range, rgD As Range '// 書き出しセル
Dim dMax As Long, Zokusei As String '// 最大値とその属性
Dim rw As Long, rw2 As Long '// 行カウンタ
Set ws1 = Worksheets("Sheet1"): Set rgS = ws1.Range(TopS) '// ***
Set ws2 = Worksheets("Sheet2"): Set rgD = ws2.Range(TopD) '// ***
'// 答えエリアをクリア(何も無いときに対応)
rgD.Value = "Dummy": rgD.Offset(1, 0).Value = "Dummy"
ws2.Activate: rgD.CurrentRegion.Select
Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Clear
'// データを調べる
With rgS
num = .Offset(rw, 0): dMax = 0
While .Offset(rw, 0) <> ""
If .Offset(rw, 0) = num Then
'// 最大値を探す
If .Offset(rw, 3) > dMax Then
Zokusei = .Offset(rw, 2)
dMax = .Offset(rw, 3)
End If
Else
'// 整理番号が変われば書き出し
rgD.Offset(rw2, 0) = num: rgD.Offset(rw2, 1) = Zokusei
rw2 = rw2 + 1
'// 新たな整理番号データ
num = .Offset(rw, 0): Zokusei = .Offset(rw, 2):
dMax = .Offset(rw, 3)
End If
rw = rw + 1
Wend
'// 最後の整理番号
rgD.Offset(rw2, 0) = num: rgD.Offset(rw2, 1) = Zokusei
End With
'// 罫線を引く
rgD.CurrentRegion.Borders.LineStyle = True
rgD.Select
End Sub
お礼
お忙しいところ、ご回答いただきありがとうございます。 急ぎの仕事だったので結局、手作業で行きました。 マクロは今の自分の能力ではなかなか難しく、数式が崩れたときに再現不可なので、もう少し、スキルを上げてから試してみようと思います。 ありがとうございます。