• 締切済み

エクセルでこんなことがしたいんですが・・・

こんにちには。 エクセルを日常使っているのですが、 昨日上司からエクセルでこういう風に作成して欲しいと依頼を 受けました。 データ元 店名 名前 阪急 吉田 大丸 山本 高島屋 田中 阪急 中岡 大丸 竹田 阪急 西川 を・・・・ 店名 名前 名前 名前 阪急 吉田 中岡 西川 大丸 山本 竹田 高島屋 田中 という風にです。 このような資料作成(加工)はしたことが無いので 困っています。 誰かお知恵を拝借したくお願いします。

みんなの回答

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

みなさま関数や並び替えなどでやる方法を紹介されているので、あえてマクロでやる方法で回答します。 Sheet1に整形前の表があり、Sheet2に整形後の表を転記するとします。 Alt+F11でVBAの画面を開き、左側のツリーからブック名を選択し、右クリックから「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。(マクロ中の"Sheet1","Sheet2"という箇所は、実際のシートに即して書き換えてください) Sub 並び替え()  Dim WS1 As Worksheet, WS2 As Worksheet  Dim i As Integer, CopyTo As Integer, Max As Integer  Dim R As Range    Set WS1 = Worksheets("Sheet1") '元のデータが入っているシート名  Set WS2 = Worksheets("Sheet2") '並び替えたデータを入れるシート名  WS2.Cells.ClearContents  WS2.Range("A1").Value = WS1.Range("A1").Value  For i = 2 To WS1.Cells(Rows.Count, 1).End(xlUp).Row   Set R = WS2.Columns("A").Find(What:=WS1.Cells(i, 1), LookAt:=xlWhole)   If R Is Nothing Then    Set R = WS2.Cells(Rows.Count, 1).End(xlUp).Offset(1)    R.Value = WS1.Cells(i, 1).Value   End If   CopyTo = WS2.Cells(R.Row, Columns.Count).End(xlToLeft).Column   R.Offset(0, CopyTo).Value = WS1.Cells(i, 2).Value   If CopyTo > Max Then Max = CopyTo  Next  WS2.Range("B1").Resize(1, Max).Value = WS1.Range("B1").Value End Sub その画面でF5キーを押すか、Alt+F11でExcelの画面に戻ってAlt+F8からマクロを実行してみてください。Sheet2に整形後の表が作成されます。

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.4

関数以外の方法と言うことで回答してみます。 データ数が少ないのであれば "店名" ごとに並べ替えて名前をコピーまたはセルを移動してはいかがでしょう。  ※多少多くても気力でやっつけられます。 自分が行なうのであれば、次の手順で行ないます。 1.店名のセルを選択して    データ → 並べ替え → データ範囲の先頭行をタイトル行 → 優先されるキーを店名 → OK 2.名前を店毎に選択してコピー。 3.該当する店名の行、名前の横の列に、    編集 → 形式を選択して貼り付け → 行列を入れ替える   で貼り付け。 (2~3を必要な回数繰り返す) 4.元の名前のある列を削除。 5.名前のある最左の列が選択された状態から、    編集 → ジャンプ → セル選択 → 空白セル → OK   で空白セルを選択 6.空白セルが選択された状態で、    編集 → 削除 → 行全体 → OK   で空白のセルがある列を削除 関数やマクロは必要ありません。 2~3に関しては記録マクロを手直しして使用してもいいかもしれません。 基本的にすべて編集操作だけで可能です。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.3

◆Sheet1    A     B 1  店名   名前 2  阪急   吉田 3  大丸   山本 4  高島屋  田中 5  阪急   中岡 6  大丸   竹田 7  阪急   西川 ◆Sheet2    A      B    C    D 1  店名   名前  名前  名前 2  阪急   吉田  中岡  西川 3  大丸   山本  竹田 4  高島屋  田中 ◆Sheet2のA2の式 A2=IF(ROW(A1)>COUNT(INDEX(1/(MATCH(Sheet1!$A$2:$A$10,Sheet1!$A$2:$A$10,)=ROW($1:$9)),)),"",INDEX(Sheet1!$A$1:$A$10,SMALL(INDEX(SUBSTITUTE((MATCH(Sheet1!$A$2:$A$10&"",Sheet1!$A$2:$A$10&"",)=ROW($1:$9))*(Sheet1!$A$2:$A$10<>""),0,10^5)*ROW($2:$10),0),ROW(A1)))) ★下にコピー ◆Sheet2のB2の式 B2=IF(OR(COUNTIF(Sheet1!$A$2:$A$10,$A2)<COLUMN(A1),Sheet2!A2=""),"",INDEX(Sheet1!$B$1:$B$10,SMALL(INDEX(SUBSTITUTE(N(Sheet1!$A$2:$A$10=$A2),0,10^5)*ROW($A$2:$A$10),),COLUMN(A1)))) ★右と下にコピー

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

元のシートがSheet1として、Sheet2のA2から下方向に店名を手で入力する。そしてB2の式は =IF(COUNTIF(Sheet1!$A$2:$A$100,$A2)>=COLUMN()-1,INDEX(Sheet1!$B$1:$B$100,LARGE(INDEX((Sheet1!$A$2:$A$100=$A2)*ROW(Sheet1!$A$2:$A$100),),COUNTIF(Sheet1!$A$2:$A$100,$A2)-COLUMN()+2)),"") B2を右方向、および下方向にコピーする。Sheet1のデータは100行まであると想定していますので、実際の行数がもっと多いなら置換で100を大きな数に変更してください。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

元がSheet1!A1:B100として 店名 名前 番号 阪急 吉田 =COUNTIF($A$2:$A2,$A2) 大丸 山本 高島屋 田中 阪急 中岡 大丸 竹田 阪急 西川 で番号の数式を下方にコピーする 店名 名前 名前 名前 名前 阪急 =IF(COUNTIF(Sheet1!$A$2:$A$100,$A2)>COLUMN()-2,INDEX(Sheet1!$B$2:$B$100,SUMPRODUCT((Sheet1!$A$2:$A$100=$A2)*(Sheet1!$C$2:$C$100=COLUMN()-1)*ROW(Sheet1!$C$2:$C$100))-1,1),"") 大丸 高島屋 で数式を下方と右方向に必要分コピーする

関連するQ&A