[[20080125163444]] 『ピボットテーブルに文字列を表示させたい』(YUMI) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ピボットテーブルに文字列を表示させたい』(YUMI)

  周りのExcel使用者からは「無理でしょ」と言われたのですが、
 どうしても納得できないので本当にダメかどうか教えて下さい。

 下記データ群から表を作成したいです。
  データ群(数字も含めてすべて文字列です)
 項目  名称  値
 項目1 名称1 0.01
 項目1 名称2 0.25
 項目1 名称3 0.30
 項目2 名称1 青
 項目2 名称2 赤
 項目2 名称3 緑
 項目3 名称1 19850
 項目3 名称2 18012
 項目3 名称3 14000
 項目4 名称1 無
 項目4 名称2 1.5
 項目4 名称3 13

 表
     名称1 名称2 名称3
 項目1  0.01  0.25  0.30  
 項目2  青   赤   緑
 項目3 19850  18012  14000
 項目4  無   1.5   13

  ピボットテーブルで枠の形は出来たのですが、中身が出ません。
 名称もしくは項目が1つだけならLOOKUPでどうにかなるのですが、
 ピボットテーブルではできないでしょうか。  

  今は、ピボットテーブルで枠だけ作り、1項目ずつLOOKUPで埋めています。
  マクロを使わないとダメでしょうか。
  教えて下さい。

[エクセルのバージョン] Excel2003

 [OSのバージョン] WindowsXP

 INDEX関数とMATCH関数の組み合わせがぴったりと思います。(ROUGE)

ROUGE様、ありがとうございます。

 INDEX関数とMATCH関数について勉強し、いろいろ試してみましたがこの関数はセルを
一つ一つ指定する形なので、項目群や名称群が増えたり減ったりした時には使えないことが
わかりました。
 提示した条件が足りなくて申し訳ございません。
 物件によって項目1に対して名称が10だったり、項目15に対して名称が8だったりします。
 そして、表が全部埋まるわけではなく、空白(該当なし)もあり得ます。

 私はデータベースの管理者で、上記のようなデータ群で困っていないのですが、

現場の人が一覧表の形にして確認をしているので、その手間を減らせないかと考えて
いる次第です。
現場の人には難しいExcelの関数を教えるのは無理なので、なるべく少ない操作で
一覧表の形にしたいのです。

 データ群は随時追加されていくので、出来れば空白の表だけ先に作成しておき、
データ群を更新すると表に追加されていくというのがベストですが、
その都度作成する形でも構いません。

 いい方法がありましたら教えて下さい。
(YUMI)


 元データが、Sheet1にこの様な状態で有る場合
 Sheet1	[A]	[B]	[C]
[1]	項目	名称	値
[2]	項目1	名称1	0.01
[3]	項目1	名称2	0.25
[4]	項目1	名称3	0.3
[5]	項目2	名称1	青
[6]	項目2	名称2	赤
[7]	項目2	名称3	緑
[8]	項目3	名称1	19850
[9]	項目3	名称2	18012
[10]	項目3	名称3	14000
[11]	項目4	名称1	無
[12]	項目4	名称2	1.5
[13]	項目4	名称3	13

 ●案1
 おそらく、現在の方法と変わらないのでしょうけど・・・。

 例えば、Sheet2にピボットテーブルで、見出しをつくり
 それぞれの個数を集計します。
Sheet2	[A]	[B]	[C]	[D]
[1]	データの個数 / 値	名称		
[2]	項目	名称1	名称2	名称3
[3]	項目1	1	1	1
[4]	項目2	1	1	1
[5]	項目3	1	1	1
[6]	項目4	1	1	1

 Sheet3に見出し部分をSheet2から、データ部分をSheet1から参照します。
Sheet3	[A]	[B]	[C]	[D]
[1]		名称1	名称2	名称3
[2]	項目1	0.01	0.25	0.3
[3]	項目2	青	赤	緑
[4]	項目3	19850	18012	14000
[5]	項目4	無	1.5	13
 A1に
=IF(Sheet2!A2="","",Sheet2!A2)
 として、A列と1行目の範囲にフィルドラッグ後、A1セルの式を削除。
 B3に
=IF(Sheet2!B3>0,INDEX(Sheet1!$C$1:$C$100,
SUMPRODUCT((Sheet1!$A$1:$A$100=$A2)*(Sheet1!$B$1:$B$100=B$1)*ROW($A$1:$A$100)),),"")
 として、必要範囲にフィルドラッグ。

 気をつける必要があるのは、関数ですのでそれぞれの範囲がデータ範囲内に納まっている事
 また、Sheet1で入力をし、Sheet2で更新をした場合にのみSheet3に目的の結果が表示される
 (Sheet3に結果を表示させる迄に手順が必要)と言う点があげられると思います。

 ●案2
 見出し行も関数でつくって仕舞う方法です。
 結果はSheet3と同じ表示になります。
 A2セルに
=IF(SUM(IF(Sheet1!$A$1:$A$100<>"",1/COUNTIF(Sheet1!$A$1:$A$17,Sheet1!$A$1:$A$100)))<ROW(A2),"",
INDEX(Sheet1!$A$1:$A$100,SMALL(IF(ISERROR(MATCH(Sheet1!$A$1:$A$100,Sheet1!$A$1:$A$100,0)),99^99,
IF(MATCH(Sheet1!$A$1:$A$100,Sheet1!$A$1:$A$100,0)=ROW($A$1:$A$100),ROW($A$1:$A$100),99^9)),ROW(A2)),1))
 をペーストして【Ctrl + Shift + Enter】で確定

 B1セルに
=IF(SUM(IF(Sheet1!$B$1:$B$100<>"",1/COUNTIF(Sheet1!$B$1:$B$100,Sheet1!$B$1:$B$100)))<COLUMN(B1),"",
INDEX(Sheet1!$B$1:$B$100,SMALL(IF(ISERROR(MATCH(Sheet1!$B$1:$B$100,Sheet1!$B$1:$B$100,0)),99^99,
IF(MATCH(Sheet1!$B$1:$B$100,Sheet1!$B$1:$B$100,0)=ROW($A$1:$A$100),ROW($A$1:$A$100),99^9)),COLUMN(B1)),1))
 をペーストして【Ctrl + Shift + Enter】で確定

 B2に
=IF(AND($A2<>"",B$1<>""),INDEX(Sheet1!$C$1:$C$100,
SUMPRODUCT((Sheet1!$A$1:$A$100=$A2)*(Sheet1!$B$1:$B$100=B$1)*ROW($A$1:$A$100)),),"")
 をペーストして Enter で確定

 それぞれ必要範囲にフィルドラッグしてください。

 こちらは、範囲が広いと計算に時間がかかります。

 ●案3
 マクロを使う方法です。
 Sheet5に書き出します。
 
Sub 配置換え()
Dim i As Long, xr As Long, xc As Long
Dim dicA As Object, dicB As Object, tbl, x

    Set dicA = CreateObject("scripting.dictionary")
    Set dicB = CreateObject("scripting.dictionary")

    With Sheets("Sheet1")
        tbl = .Cells(1, 1).Resize(.Cells(Rows.Count, 1).End(xlUp).Row, 3)
    End With

    ReDim x(1 To UBound(tbl, 1) + 1, 1 To UBound(tbl, 1) + 1)
    For i = 2 To UBound(tbl, 1)
        If Not dicA.exists(tbl(i, 1)) Then
            xr = xr + 1
            dicA(tbl(i, 1)) = xr + 1
            x(xr + 1, 1) = tbl(i, 1)
        End If
        If Not dicB.exists(tbl(i, 2)) Then
            xc = xc + 1
            dicB(tbl(i, 2)) = xc + 1
            x(1, xc + 1) = tbl(i, 2)
        End If
        x(dicA(tbl(i, 1)), dicB(tbl(i, 2))) = tbl(i, 3)
    Next i

    With Sheets("Sheet5")
        .Cells.ClearContents
        .Range("A1").Resize(xr + 1, xc + 1) = x
    End With

    Set dicA = Nothing
    Set dicB = Nothing
End Sub

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.