dポイントプレゼントキャンペーン実施中!

Excelで2つの行を1つにするにはどうしたらよいでしょうか?

A ○
A   ○
B ○
B      ○

というデータを

A ○ ○
B ○    ○

という形にしたいです。

1行に○は1つで、同じ名前(AやB)であれば、位置も重複するものはありません。
しかし、全部で1万行近くあるため、関数等でまとめることができればと思います。

説明が下手で申し訳ありませんが、何か方法があれば教えてください。
よろしくお願いします。

質問者からの補足コメント

  • 1) 1行目は見出しになっています。
    2) 元のデータも残したいため、その認識で構いません。
    よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/07/07 21:30

A 回答 (7件)

ちょっと違った方法なので(マニュアル操作です)、興味があればお読みください。


「データ」タブの「総合」機能を使うものです。

集計元データが、Sheet1のA~Dにあるとします。
まず、空白のシート(Sheet2)のA1セルを選択した状態で、「データ」タブの「総合」を選択し、画像のように設定して、OKをクリックしてみて下さい。
すると、A列の値毎に○の数が集計されるので、1→〇に置き換えれば完成です。
「Excelで2つの行を1つにするには?」の回答画像7
    • good
    • 0
この回答へのお礼

元々の機能でできるとは思いませんでした。
わかりやすい回答ありがとうございます。

お礼日時:2017/07/18 10:45

Sheet1 において、


1.式 =A2&SUMPRODUCT(($B2:$F2="○")*(COLUMN($B2:$F2))) を
 ̄ ̄入力したセル H2 を下方にズズーッとオートフィル

Sheet2 において、
2.式 =IF(COUNTIF(Sheet1!$H:$H,$A2&COLUMN()),"〇","") を
 ̄ ̄入力したセル B2 を右方および下方にズズーッとオートフィル
「Excelで2つの行を1つにするには?」の回答画像6
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございます。

お礼日時:2017/07/18 10:27

No.4です。



たびたびごめんなさい。
関数での一例です。
↓の画像のように作業用の列を3列設けてみました。
K列はフィルハンドルで下へコピーするのも大変ですので、フィルハンドルをダブルクリックするだけで
フィル&コピーするためです。

K2セルに 2 と入力 → K2セルを選択
→ メニューの右側にあるフィルのアイコン(オートサム「Σ」の下にあるアイコン)をクリック
→ 連続データの作成 → 「列」を選択 → 停止値に10000とか11000とこれ以上データはない!というくらいまでの数値を入力 → OK
これで入力した行までの連番が入ります。

作業列1のI2セルに
=IF(COUNTIF(A$2:A2,A3)=1,ROW(),"")

作業列2のJ2セルに
=IF(COUNTIF(B2:G2,"○"),A2&INDEX(B$1:G$1,MATCH("○",B2:G2,0)),"")

という数式を入れ → I2・J2セルを範囲指定 → J2セルのフィルハンドルでダブルクリック!
これでK列は不要ですので、K列は削除しても構いません。

そしてSheet2のA2セルに
=IFERROR(INDEX(Sheet1!A:A,SMALL(Sheet1!I:I,ROW(A1))),"")

B2セルに
=IFERROR(IF(COUNTIF(Sheet1!$J:$J,$A2&B$1),"○",""),"")
という数式を入れB2セルのフィルハンドルで右へコピー!

最後にA2~2行目最終列を範囲指定 → 最終列のフィルハンドルで下へコピーすると
画像のような感じになります。

※ 作業列が目障りであれば遠く離れた列にするか
非表示にしてください。m(_ _)m
「Excelで2つの行を1つにするには?」の回答画像5
    • good
    • 0
この回答へのお礼

マクロと関数の両方で回答してくださりありがとうございます。
参考にさせていただきます。

お礼日時:2017/07/18 10:00

こんばんは!



すでに回答は出ていますので、参考程度で・・・
元データはSheet1にあり、Sheet2に表示するとします。
標準モジュールです。

Sub Sample1()
Dim i As Long, wS As Worksheet
Dim c As Range, r As Range
Set wS = Worksheets("Sheet2")
wS.Cells.Clear
With Worksheets("Sheet1")
.Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=wS.Range("A1"), unique:=True
.Rows(1).Copy wS.Range("A1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Set r = .Rows(i).Find(what:="○", LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then '//←念のため//
wS.Cells(c.Row, r.Column) = r
End If
Next i
wS.Columns.AutoFit
wS.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous
End With
MsgBox "完了"
End Sub

※ Sheet1の2行目以降を最終行までループさせていますので
それなりに時間を要すると思います。m(_ _)m
    • good
    • 0

No2です。


すみません。関数でのまとめでしたね。No2は、無視してください。
    • good
    • 0
この回答へのお礼

恥ずかしながらマクロというものを知りませんでした。
今回は利用しなかったのですが、別の作業で参考にさせていただきます。
ありがとうございました。

お礼日時:2017/07/14 12:56

以下のマクロを標準モジュールへ登録してください。


実行時の条件は、No1で確認した通りです。
Option Explicit
Public Sub 行まとめ()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxrow As Long
Dim maxcol As Long
Dim row1 As Long
Dim row2 As Long
Dim col As Long
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
sh1.Activate
'最大行、列取得
ActiveCell.SpecialCells(xlLastCell).Select
maxrow = Selection.Row
maxcol = Selection.Column
sh2.Cells.Clear
'見出しコピー
sh2.Range("A1:A" & maxcol).Value = sh1.Range("A1:A" & maxcol).Value
row2 = 2
'2行から最終行まで繰り返す
For row1 = 2 To maxrow
row2 = row1 \ 2 + 1 'Sheet2の行番号決定
'1列から最終列まで繰り返す
For col = 1 To maxcol
'空白でないならSheet2へ転送
If sh1.Cells(row1, col).Value <> "" Then
sh2.Cells(row2, col).Value = sh1.Cells(row1, col).Value
End If
Next
Next
MsgBox ("処理完了")
End Sub
    • good
    • 0

補足要求です。


1)1行目は見出しですか。それともデータ行ですか。
データ行なら、1行目からまとめます。
見出しなら、2行目からまとめます。
2)このデータのシート名は、Sheet1で、まとめるのは、Sheet2で良いですか。
この回答への補足あり
    • good
    • 0

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