
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列(名前の列)が空白の行を削除し、「区切り位置」ウィザードでセルを分割します。
空白の削除は、ソートすると簡単です。元データにカンマが含まれている場合は、未使用の別の文字を使ってください。

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 を下方にオートフィル

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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのVBAで集計をしたい
-
【関数】同じ関数なのに、エラ...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
Office2021のエクセルで米国株...
-
【画像あり】オートフィルター...
-
【マクロ】実行時エラー '424':...
-
特定のセルだけ結果がおかしい...
-
【マクロ】列を折りたたみ非表...
-
他のシートの検索
-
【マクロ】アクティブセルの時...
-
【条件付き書式】シートの中で...
-
【マクロ】【相談】Excelブック...
-
ページが変なふうに切れる
-
エクセル ドロップダウンリスト...
-
【マクロ】オートフィルターの...
-
【マクロ】元データと同じお客...
-
【マクロ】3行に上から下に並...
-
エクセルのdatedif関数を使って...
-
【マクロ】数式を入力したい。...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報