【無料配信♪】Renta !全タテコミ作品第1話

顧客情報で、同じ顧客情報で商品名が複数登録されております。
例えばA~Eまでは顧客関連情報、Fに商品名
これをA~E迄サマリー、Fの商品名を違いがあったらG欄、H欄と列展開をしたいのですが、
事例はあくまでもさんぷるです。実際の項目位置は別です。

A   B  C  ・・F
顧客CD 顧客名 住所   商品名 
1234  東京太郎 東京都 ABC  
1234 東京太郎 東京都 DEF
1235 埼玉次郎 埼玉県 ABC
1235 埼玉次郎 埼玉県 XYZ
1236 千葉三郎 千葉県 ABC

展開(sheet2へ)
A   B  C  ・・F    G
顧客CD 顧客名 住所   商品名
1234  東京太郎 東京都 ABC  DEF
1235 埼玉次郎 埼玉県 ABC XYZ
1236 千葉三郎 千葉県 ABC

以上よろしくお願いいたします。

A 回答 (4件)

既に回答されている皆さんのように、関数を使った自動表示でもありませんし、最新的でもありません。

またVBAを使ったスマートな手法でもありませんが、ピボットテーブルを使った方法をお示しします。
①添付画像のような元データがあったものとしてピボットテーブルを作成。
②顧客CD、名顧客、住所を行エリアにプロット、商品名を列エリア、および値エリアにプロットすると添付画像のようなピボットテーブルができる。
③別シート(例えばsheet3)に関数を用いてピボットテーブルをコピー。ピボットテーブルがsheet2にあるとすると、sheet3のA4に「=sheet2!A4」と入力し、ピボットテーブルと同じ大きさになるよう、オートフィルを使ってコピー。
④コピーしたピボットテーブルの値部分(1や2が表示されている部分)の数式をD5であれば「=IF(sheet2!D5>0,COUNT(sheet2!$D5:D5),0)」に変更し、オートフィルを使って対象範囲にコピー。
⑤コピーしたピボットテーブルの右側に関数「=IF(ROWS(H5:H8)-COUNTBLANK(H5:H8)>0,"商品名"&COLUMN()-7,"")」を使って「商品名1」「商品名2」などの見出しをつける。ここで、H5:H8はピボットテーブルの行数、COLUMN()-7はピボットテーブルの列数に応じて修正する。
⑥見出しを付けた下のセルにH5を例にすれば「=IFERROR(INDEX($D$4:$G$4,1,MATCH(COLUMNS($D:D),$D5:$G5,0)),"")」という数式を記入($D$4:$G$4の部分は実際のピボットテーブルの商品名の数にあわせて調整)し、ピボットテーブルの高さ分下方向へコピー。さらにその列全体を右方向に列全てが空白となるまでコピー。
この方法は商品数が一定数を超えると、現実的ではありません。また、上記④で使用した、作業エリアは列ごと非表示にして、見映えをよくするなどの工夫が必要だと思います。
「顧客情報で纏めかたを教えて下さい」の回答画像4
    • good
    • 0

こんばんは!



手っ取り早く、VBAでの一例です。
元データはSheet1(1行目は項目行、データは2行目以降)にあり、Sheet2に表示するとします。
標準モジュールにしてください。

Sub Sample1()
 Dim myDic As Object
 Dim i As Long, j As Long, k As Long, lastRow As Long
 Dim mySTr As String, buf As String
 Dim wS As Worksheet
 Dim myKey, myitem, myR, myAry1, myAry2

  Set myDic = CreateObject("Scripting.Dictionary")
  Set wS = Worksheets("Sheet2")
   wS.Cells.ClearContents
    With Worksheets("Sheet1")
     .Rows(1).Copy wS.Range("A1")
      lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
       myR = Range(.Cells(2, "A"), .Cells(lastRow, "F"))
        For i = 1 To UBound(myR, 1)
         For j = 1 To 5 '//←A~E列まで//
          buf = buf & myR(i, j) & "_"
         Next j
          mySTr = Left(buf, Len(buf) - 1)
          If Not myDic.exists(mySTr) Then
           myDic.Add mySTr, myR(i, 6)
          Else
           myDic(mySTr) = myDic(mySTr) & "_" & myR(i, 6)
          End If
           buf = ""
        Next i
    End With
     myKey = myDic.keys
     myitem = myDic.items
      For i = 0 To UBound(myKey)
       myAry1 = Split(myKey(i), "_")
        For j = 0 To UBound(myAry1)
         wS.Cells(i + 2, j + 1) = myAry1(j)
        Next j
       myAry2 = Split(myitem(i), "_")
        For k = 0 To UBound(myAry2)
         wS.Cells(i + 2, k + 6) = myAry2(k)
        Next k
      Next i
     Set myDic = Nothing
     wS.Activate
     MsgBox "完了"
End Sub

※ A~E列の中の1項目だけ異なっていても別物とみなされますので
別の行に表示されます。m(_ _)m
    • good
    • 1
この回答へのお礼

tomo4さん。返信が遅くなり申し訳ございませ。
ご提示いただきましました、コードを試してみます。
ありがとうございました。

お礼日時:2020/09/20 04:46

バージョンがいくつか書かない人は以前からいましたが最近は何の質問


かすら書かない人が増えました。 Excelに決まってるでしょってことで
しょうか。バージョンは最新という前提でいいんでしょうか。

だとしたら UNIQUE・FILTER・TRANSPOSE関数を使えばできます。
    • good
    • 0
この回答へのお礼

d-q-t-pさん
返事が遅くなり申し訳ございません。
ご指摘のとおりです。
以後気をつけます。

お礼日時:2020/09/20 04:47

添附圖參照(Excel 2019)



最上段の Sheet1 は元となる顧客情報を示す。
其の下は全て Sheet2 で、上から下へ制作過程を示す。

Sheet1 に於いて、
1.H列を作業用として、式 =COUNTIF(A$2:A2,A2) を入力したセル H2 を下方に
 ̄ ̄オートフイル
2.範圍 A1:H100 を選擇⇒Alt+MC⇒“上端列”のみにチェック入れ⇒[OK](選擇列
 ̄ ̄範圍に名前附け)

Sheet2 に於いて、
3.次式を入力したセル A2 を右方に(F列迄)オートフィル
 ̄ ̄ =IFERROR(INDEX(INDIRECT(A$1),SMALL(IF(仮=1,ROW(仮)),ROW(A1))-1),"")
 ̄ ̄【御斷はり】上式は必ず配列數式として入力の事
4.次式に變更したセル D2 を右隣にオートフィル(末尾に「&""」を追加しただ
 ̄ ̄けェ~)
 ̄ ̄ =IFERROR(INDEX(INDIRECT(D$1),SMALL(IF(仮=1,ROW(仮)),ROW(D1))-1),"")&""
 ̄ ̄【御斷はり】上式も必ず配列數式として入力の事
5.次式に變更(「=1」を「=COLUMN(A1)に」)したセル D2 を右3列にオート
 ̄ ̄フイル
 ̄ ̄ =IFERROR(INDEX(INDIRECT(F$1),SMALL(IF(仮=COLUMN(A1),ROW(仮)),ROW(F1))-1),"")
 ̄ ̄【御斷はり】上式も必ず配列數式として入力の事
6.範圍 A2:I2 を下方にオートフイル
「顧客情報で纏めかたを教えて下さい」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング