アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
Excelで下記のように横並びの表を作成しています。
A列〜C列には重複するデータも入ってます。
D列〜G列には全て異なるデータが入ってます。

A列 B列 C列 D列 E列 F列 G列
A-1 B-1 C-1 D-1 E-1 F-1 G-1
A-1 B-1 C-2 D-2 E-2 F-2 G-2
A-1 B-2 C-3 D-3 E-3 F-3 G-3
A-2 B-3 C-4 D-4 E-4 F-4 G-4
A-2 B-3 C-4 D-5 E-5 F-5 G-5

これを下記のように配置換えをして別の表を作りたいのですが、コピペの作業ではとても時間がかかってしまいます。
関数やマクロを使ってできる方法があれば教えていただけないでしょうか?
(A列に、元の表A列〜C列にあるデータを字下げのように表示させたい。)

A列  B列 C列 D列 E列 
A-1
 B-1
  C-1 D-1 E-1 F-1 G-1
  C-2 D-2 E-2 F-2 G-2
 B-2
  C-3 D-3 E-3 F-3 G-3
A-2
 B-3
  C-4 D-4 E-4 F-4 G-4
  C-4 D-5 E-5 F-5 G-5

A 回答 (5件)

>ご提案いただいたピボットテーブルで作業もしてみたのですが、


>お示しいただいたように旧C列の重複データが集約されてしまう
>ため、理想した形にはならず、他に手段がないかと困っていた
>ところです。

とのことですが、前回回答でお示しした、手順を少し変更するたけで、ご希望の形にすることは可能だと思います。
前回回答のピボットテーブル作成手順のうち、「コンパクト形式で表示」の手順を省きます。
その次の手順から「OFFSET関数を使用し不要な行を削除する作業まで」を完了します。
「コンパクト形式で表示」の作業を省略しているので、(B)の貼り付けはできません。
その代わりとして、C列とD列の間に空白の列を挿入します。これが添付画像①です。
添付画像でいえばD2に以下の数式を記述します。

=IF(A2<>"",A2,IF(B2<>""," "&B2,IF(C2<>"","  "&C2,"")))

これを下方向へオートフィル等でコピーします。この後、全体をコピーして値貼り付けしたものが添付画像➁です。
ほぼ、D列より右はご質問者のご希望の形になっていると思います。ここで、A列からC列を削除したものが添付画像③です。
最上段に見出し行が残っていますが、これを削除するなり他の見出しに変更すれば完成です。
「Excelで横並びのデータを配置換えした」の回答画像5
    • good
    • 0

ご質問者の説明だと、A列、B列、C列には重複したデータが存在するとのことです。


だとすると、目指すべき表の重複するデータのある列は新A列に見出しセルが存在し、字下げするため、そのセルのB列以降右側が空白になることを許容するというルールではだめなのでしょうか?
ご質問者の例示を見ると旧A列と旧B列は新A列に見出しセルが存在し、そのセルのB列以降右側が空白になることを許容しているようです。
ところが、旧C列には重複データがあるにもかかわらず、新A列の旧C列のデータの右側は空白にせずに、旧D列以降右側データを表示するような構造になっています。
この違いは何なのでしょうか?・・・(A)
添付画像をご覧ください。
添付画像①は、ご質問者がお示しになったデータに「階層1、階層2、階層3、・・・」という見出しをつけたものです。これをSheet1とします。
まず、これを基にピボットテーブルを作成します。別シートに作成するものとして、レポートのレイアウトを「コンパクト形式で表示」を選択し、小計、総計をそれぞれ表示しないとして、階層1~階層3までを行ボックスにドラッグ&ドロップして作成します。
すると、ご質問者のご希望の新A列の内容に極めて近いものが出来上がります。これをコピーして同位置に値貼り付けしておきます(添付画像④オレンジ枠)。・・・(B)
次に別方法のピボットテーブルを作成します。レポートのレイアウトを「アウトライン形式で表示」を選択し、小計、総計をそれぞれ表示しないとして、階層1~階層4までを行ボックスにドラッグ&ドロップして作成したものが、添付画像➁です。
そのうえで、E7に以下の数式を記述し、下方向、右方向にコピーします。すると添付画像➁のような表が出来上がります。
=IF(D7="","",VLOOKUP($D7,Sheet1!$D:$G,COLUMN(B1),FALSE))
しかし、このままでは、前述の(A)の違いがあるので、ご質問者のご希望のものになりません。
表全体をコピーして同じ位置に値貼り付けし、オートフィルターを付けて、C列が空白、D列が空白以外の行を抽出し、C7に以下の数式を記述し、下方向へコピーします。(添付画像③)
=OFFSET(C7,-1,0)
オートフィルターを解除して、表全体をコピーし、値貼り付けします。もう一度オートフィルターをつけて、C列が空白以外、D列が空白の行を抽出して削除します。
このC列に(B)を貼付けします。その後A列、B列は削除します。これで添付画像④のような、ご質問者のご希望の表が完成します。
「Excelで横並びのデータを配置換えした」の回答画像4
    • good
    • 0
この回答へのお礼

すみません、わたしの説明不足なのですが旧C列にあるデータは重複したデータも表示させたいのです。
理由としてはD列〜G列には日付のデータが入っていて、旧C列のデータと紐づいているからです。
ご提案いただいたピボットテーブルで作業もしてみたのですが、お示しいただいたように旧C列の重複データが集約されてしまうため、理想した形にはならず、他に手段がないかと困っていたところです。

お礼日時:2021/05/14 10:25

こんばんは



・不可逆なので、テストデータでテストしてください。
・インデントは適当なので、調整願います。

Sub Sample_12357444()

Dim keys(0 To 1) As String
Dim sSht, dSht, sRng, dRng, i

Set dSht = ActiveSheet
Set dRng = dSht.Range("A1")
dSht.Copy dSht
Set sSht = ActiveSheet
dSht.Columns("A:G").ClearContents

sSht.Columns("A:G").Sort key1:=Range("A1"), order1:=xlAscending, _
 key2:=Range("B1"), order2:=xlAscending, _
 key3:=Range("C1"), order3:=xlAscending


For Each sRng In Range(sSht.Cells(1, 1), sSht.Cells(Rows.Count, 1).End(xlUp))
 For i = 0 To 1
  If sRng.Offset(, i).Value <> keys(i) Then
   dRng.Value = String(i * 2, Asc(" ")) & sRng.Offset(, i).Value
   keys(i) = sRng.Value
   Set dRng = dRng.Offset(1)
  End If
 Next i

 dRng.Value = String(4, Asc(" ")) & sRng.Offset(, 2).Value
 dRng.Offset(, 1).Resize(, 4).Value = sRng.Offset(, 3).Resize(, 4).Value
 Set dRng = dRng.Offset(1)
Next sRng

Application.DisplayAlerts = False
sSht.Delete
Application.DisplayAlerts = True
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2021/05/14 10:26

字下げしないとダメですか?


見た目だけなら、同列で2個目以上のデータは文字色を白にするとかではいけませんか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
データ名が長いので横並びにすると横に長くなってしまうため、字下げにして左に詰めて幅を短くしたいのです。

お礼日時:2021/05/13 18:43

10,000行ほどのデータでしたら、手作業でやった方がはるかに速いと思います。



質問の例では、
A列>B列>C列>D列>G列の優先順で並べ替え。
その後、表をコピーして「B列の項目」の上に行を2つ挿入すれば、それっぽくなりますよ。

あとは不要なセルのデータを削除。

続いて、B列からG列の1行目にセルを挿入して下にずらす。
その後、C列からG列の1行目にセルを挿入して下にずらす。

これで完成。
    • good
    • 0
この回答へのお礼

やはり手作業の方がいいですかね。
手順を説明いただき助かりました。
ありがとうございます。

お礼日時:2021/05/13 18:45

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