![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
E列で折り返している同一種類のデータを1行のデータに変換したいです。
関数かVBAで簡単にできないでしょうか?
よろしくおねがいします。
変更前
A列 B列 C列 D列 E列 F列 G列 H列 I列 J列 K列
山田 A01 A02 A03 A04
山田 A05 A06 A07 A08
山田 A09 A10
田中 B01 B02 B03 B04
田中 B05 B06 B07
伊藤 C01 C02 C03
↓
変更後
A列 B列 C列 D列 E列 F列 G列 H列 I列 J列 K列
山田 A01 A02 A03 A04 A05 A06 A07 A08 A09 A10
田中 B01 B02 B03 B04 B05 B06 B07 B08
伊藤 C01 C02 C03
No.4ベストアンサー
- 回答日時:
#1さんの方法は、連想配列方式は、すぐに思いつきましたが、別の方法を考えました。
本来、構造が簡単なら、全て配列の中で行うのですが、ややこしくなるので、その都度、1次元の配列変数にする方式にしました。
'********開始行と開始列の部分を設定してください。E列だったら、5になります。
'出力側も自動で選べます。ワークシートは、データがぶつからない限りは、同じシート内でも出力可能です。
'//
Sub ConbineSameName()
Dim LastRow As Long
Dim i As Long, j As Long
Dim Flg As Boolean
Dim r As Variant, a As Variant, ar As Variant
Dim x As Long, y As Long, k As Long
Dim TotalA As Variant
Dim sh2 As Worksheet
Set sh2 = Worksheets("Sheet2") '同じシートでも書き出し可能
Dim stR As Long, stC As Long
'************************
'開始行と開始列
stR = 1: stC = 5
'シート2の書き出し行, 列
j = 1: k = 1
'******************
If sh2.Cells(j, k).CurrentRegion.Cells.Count > 2 Then
If MsgBox(sh2.Name & "の目的の場所はすでに使われています。OKで実行", vbOKCancel) = vbCancel _
Then Exit Sub
sh2.Cells(j, k).CurrentRegion.ClearContents
End If
LastRow = Cells(Rows.Count, stC).End(xlUp).Row
For i = stR To LastRow
If Cells(i, stC).Value <> "" Then
If Cells(i, stC).Value = Cells(i + 1, stC).Value Then
Flg = True
Else
Flg = False
End If
If TotalA = "" Then
r = Range(Cells(i, stC), Cells(i, Columns.Count).End(xlToLeft)).Value
TotalA = Join(Application.Index(r, 0), ",")
Else
r = Range(Cells(i, stC + 1), Cells(i, Columns.Count).End(xlToLeft)).Value
TotalA = TotalA & "," & Join(Application.Index(r, 0), ",")
End If
If Flg = False Then
ar = Split(TotalA, ",")
sh2.Cells(j, k).Resize(, UBound(ar) + 1).Value = ar
Erase r: TotalA = "": Erase ar
j = j + 1
End If
End If
Next
sh2.Select
End Sub
No.3
- 回答日時:
こんなのはどうでしょう。
関数で添付画像のようなシートを作ります。
【F2セル】=IF(A2<>A3,A2,"")
【G2セル】=IF(A2=A1,G1&CONCATENATE(","&B2&","&C2&","&D2&","&E2),CONCATENATE(B2&","&C2&","&D2&","&E2))
F:G列を別シートに値で張り付けて、F列(名前の列)が空白の行を削除し、「区切り位置」ウィザードでセルを分割します。
空白の削除は、ソートすると簡単です。元データにカンマが含まれている場合は、未使用の別の文字を使ってください。
![「excelで複数行にまたがるデータを1行」の回答画像3](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/2/542293914_5b00c0e46a20a/M.png)
No.2
- 回答日時:
添付図参照
Sheet1 において、
1.次の各セルにそれぞれ右側の式を入力
 ̄ ̄ G1: =COUNTIF($A$1:$A1,A1)
 ̄ ̄ H1: =IF(G1=1,COUNTIF($A$1:$A$6,A1),"")
 ̄ ̄ I1: =IF(H1="","",COUNTA(OFFSET(B1,,,H1,COLUMNS(B1:E1))))
 ̄ ̄ J1: =IF(OR($H1="",COLUMN(A1)>$I1),"",OFFSET($B$1,ROW(A1)-1+(COLUMN(A1)-1)/4,MOD(COLUMN(A1)-1,4)))
 ̄ ̄【お断り】上の I1、J1の式は必ず配列数式として入力のこと
2.セル J1 を右方に(此処では R列まで)ズズーッとオートフィル
3.範囲 G1:R1 を下方に(此処では 6行目まで)ズズーッとオートフィル
Sheet2 において、
4.次の配列数式を入力したセル Z1 を下方に(此処では 3行目まで)オート
 ̄ ̄フィル
 ̄ ̄ =INDEX(Sheet1!I$1:I$6,SMALL(IF(Sheet1!$G$1:$G$6=1,ROW(Sheet1!$G$1:$G$6),""),ROW(A1)))
5.次の各セルにそれぞれ右側の配列数式を入力
 ̄ ̄ A1: =INDEX(Sheet1!$A$1:$A$6,SMALL(IF(Sheet1!$G$1:$G$6=1,ROW(Sheet1!$G$1:$G$6),""),ROW(A1)))
 ̄ ̄ B1: =IF(COLUMN(A1)>$Z1,"",INDEX(Sheet1!J$1:J$6,SMALL(IF(Sheet1!$G$1:$G$6=1,ROW($F$1:$F$6),""),ROW(B1))))
6.セル B1 を右方に(此処では J列まで)ズズーッとオートフィル
7.範囲 A1:J1 を下方にオートフィル
![「excelで複数行にまたがるデータを1行」の回答画像2](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/4/298588_5b00aa8206bba/M.jpg)
No.1
- 回答日時:
こんばんは!
VBAでの一例です。
元データはSheet1にあり、Sheet2に表示するとします。
尚、Sheet1は1行目からデータがあるという前提です。
標準モジュールにしてください。
Sub Sample1()
Dim myDic As Object
Dim i As Long, j As Long
Dim lastRow As Long, lastCol As Long
Dim myStr As String, wS As Worksheet
Dim myKey, myItem, myR, myAry
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
wS.Cells.ClearContents
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .UsedRange.Columns.Count
myR = Range(.Cells(1, "A"), .Cells(lastRow, lastCol))
For i = 1 To UBound(myR, 1)
For j = 2 To lastCol
If myR(i, j) <> "" Then
myStr = myStr & myR(i, j) & "_"
End If
Next j
If Not myDic.exists(myR(i, 1)) Then
myDic.Add myR(i, 1), Left(myStr, Len(myStr) - 1)
Else
myDic(myR(i, 1)) = myDic(myR(i, 1)) & "_" & Left(myStr, Len(myStr) - 1)
End If
myStr = ""
Next i
End With
myKey = myDic.keys
myItem = myDic.items
For i = 0 To UBound(myKey)
myAry = Split(myItem(i), "_")
wS.Cells(i + 1, "A") = myKey(i)
For j = 0 To UBound(myAry)
wS.Cells(i + 1, j + 2) = myAry(j)
Next j
Next i
Set myDic = Nothing
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
ありがとうございました。
質問の希望通り動きました。
今回開始列をA列として質問しましたがA列~D列は他のデータが入っており開始列がE列からの場合だと、どうなるのでしょうか?
お手数ですがよろしくおねがいします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- Excel(エクセル) エクセルの参照について教えてください 1 2022/12/08 16:06
- Excel(エクセル) Power Query でのデータの一括修正について 2 2022/05/10 02:00
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
- Visual Basic(VBA) リストポックス検索 1 2022/06/19 21:32
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Excel(エクセル) Excelの社員名簿 6 2023/07/10 16:35
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
エクセルで複数行に散らばった同一人物の情報を一行にまとめたい
Excel(エクセル)
-
EXCEL 複数行のデータを1行にまとめる方法
Excel(エクセル)
-
excelで複数行を一行に並び変える方法
Excel(エクセル)
-
-
4
エクセルで複数列を1列にまとめるマクロ
Excel(エクセル)
-
5
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
6
重複するIDのデータを1行にまとめるvbaのコード
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel関数-文字列で自動作成さ...
-
エクセルの関数について教えて...
-
Excelデータをコピペして、ペー...
-
職場の人から聞かれており、こ...
-
ユーザー定義関数をアドイン登...
-
Excelで50個のセルに同じ文字を...
-
スプレッドシート、Excelでの数...
-
Microsoft Officeの中古は信用...
-
エクセルで不等号記号(≠)が上に...
-
スプレッドシートで使う数式を...
-
エクセルでの特別な文字を上に...
-
エクセル日付 文字列の関数がエ...
-
A列とB列を参照してC列に連番を...
-
エクセルVBA、別ブックへ転記す...
-
各ページの1番上の表示について
-
エクセルでセルに標準で入力さ...
-
EXCELの質問です 119から足した...
-
pdfの表をexcelにはりつけて計...
-
Excelのif関数で文字が見えなく...
-
【マクロ】アクティブセルにブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA、別ブックへ転記す...
-
エクセルでの作業計算方法について
-
時間によってファイル名が変わ...
-
【関数】適切な文字数の数字を...
-
Excelについて教えてください
-
エクセル初心者です 関数の入れ...
-
【マクロ】ファイル名の変更に...
-
UNIQUE関数が使えないバージョ...
-
エクセルの計算
-
【関数】先頭だけにある、半角...
-
Excelで、決まった行を繰り返し...
-
Excelでセルの値が同じか...
-
LOOKUP関数を使えばいいのでし...
-
Excel
-
はがきについて。
-
エクセルの条件付き書式につい...
-
エクセルのデーターが2か月前の...
-
エクセル②
-
エクセルで「-0.0」と表示さ...
-
Microsoft1Officeの互換ソフト...
おすすめ情報