画像のように、同じ番号の場合に日付と商品を1行にまとめたいです。
以下のように1行下のセルと比較することを考えましたが
Dim i As Long For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row If i = i + 1 Then Else next i
どのように記述すればよいか全くわからなくなってしまいました。
良い比較方法と、行をまとめる記述をどなたかご教授下さい。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
私も書いてみました。
日付のところだけ特殊なのでちょっと面倒ですね。
VBA
1Sub test() 2 Dim r1, r2, cnt As Long 3 Dim pre 4 5 r1 = 2 6 r2 = 2 7 pre = "" 8 9 Do While Not IsEmpty(Cells(r1, 2)) 10 If pre <> Cells(r1, 2) Then 11 cnt = WorksheetFunction.CountIf(Columns(2), Cells(r1, 2)) 12 Cells(r2, 6) = Format(Cells(r1, 1), "'m/d") 13 Cells(r2, 7) = Cells(r1, 2) 14 Cells(r2, 8) = Cells(r1, 3) 15 If cnt <> 1 Then 16 For Each d In Cells(r1 + 1, 1).Resize(cnt - 1, 1) 17 If d <> Cells(d.Row - 1, 1) Then 18 Cells(r2, 6) = Cells(r2, 6) & "," & Day(d) 19 End If 20 Next 21 Cells(r2, 8) = Join(WorksheetFunction.Transpose(Cells(r1, 3).Resize(cnt, 1)), "+") 22 End If 23 pre = Cells(r1, 2) 24 r2 = r2 + 1 25 End If 26 r1 = r1 + 1 27 Loop 28End Sub
投稿2020/06/26 04:17
編集2020/06/26 04:23総合スコア17000
0
Excelのバージョンが最新であれば、関数を使って実現できます。
F列には、
Excel
1 =TEXTJOIN(", ",TRUE,TEXT(UNIQUE(FILTER(_Data1[日付],(_Data1[No]=G2))),"m/d"))
G列には、
Excel
1 =UNIQUE(_Data1[No])
H列には、
Excel
1 =TEXTJOIN(" + ",TRUE,TEXT(UNIQUE(FILTER(_Data1[商品],(_Data1[No]=G2))),"m/d"))
最新のバージョンが使えない場合は、VBA一択ですね。
配列を使って実現します。
昔からあるオーソドックスな手法です。
VBA
1Option Explicit 2 3Sub TranceSheet() 4 Dim RangeData 5 RangeData = Range("A1").CurrentRegion.Value 6 7 Dim x As Integer 8 Dim y As Integer 9 x = UBound(RangeData) 10 y = Int(Range("A1").CurrentRegion.Count / x) 11 12 Dim i As Integer 13 Dim j As Integer 14 Dim Date1 As String 15 Dim Date2 As Date 16 Dim No1 As Integer 17 Dim Code1 As String 18 Dim Code2 As String 19 20 For i = 2 To x 21 If i = 2 Then 22 No1 = RangeData(i, 2) 23 j = 2 24 End If 25 If i > 2 And RangeData(i, 2) <> No1 Then 26 Range("F" & j).Value = Date1 27 Range("G" & j).Value = No1 28 Range("H" & j).Value = Code1 29 Date1 = "" 30 Date2 = 1 31 No1 = RangeData(i, 2) 32 Code1 = "" 33 j = j + 1 34 End If 35 36 If RangeData(i, 1) <> Date2 Then 37 If Date1 <> "" Then 38 Date1 = Date1 & ", " & Format(RangeData(i, 1), "m/d") 39 Else 40 Date1 = Format(RangeData(i, 1), "m/d") 41 End If 42 Date2 = RangeData(i, 1) 43 End If 44 If RangeData(i, 3) <> Code2 Then 45 If Code1 <> "" Then 46 Code1 = Code1 & " + " & RangeData(i, 3) 47 Else 48 Code1 = RangeData(i, 3) 49 End If 50 Code2 = RangeData(i, 3) 51 End If 52 53 Next i 54 55 Range("F" & j).Value = Date1 56 Range("G" & j).Value = No1 57 Range("H" & j).Value = Code1 58 59End Sub
投稿2020/06/26 04:00
総合スコア344
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ExcelVBA
1Option Explicit 2 3Sub test() 4 Dim ixOld As Long 5 Dim ixNew As Long 6 7 For ixOld = 2 To Cells(Rows.Count, "B").End(xlUp).Row 8 For ixNew = 2 To Cells(Rows.Count, "G").End(xlUp).Row 9 If Cells(ixOld, "B").Value = Cells(ixNew, "G").Value Then Exit For 10 Next 11 12 If ixNew > Cells(Rows.Count, "G").End(xlUp).Row Then 13 Cells(ixNew, "F").Value = "'" & Cells(ixOld, "A").Text 14 Cells(ixNew, "G").Value = Cells(ixOld, "B").Value 15 Cells(ixNew, "H").Value = "'" & Cells(ixOld, "C").Value 16 Else 17 Cells(ixNew, "F").Value = Cells(ixNew, "F").Value & "," & Split(Cells(ixOld, "A").Text, "/")(1) 18 Cells(ixNew, "H").Value = Cells(ixNew, "H").Value & "+" & Cells(ixOld, "C").Value 19 End If 20 Next 21End Sub
For ixNew = 2 To Cells(Rows.Count, "G").End(xlUp).Row
If Cells(ixOld, "B").Value = Cells(ixNew, "G").Value Then Exit For
Next
というようにすると、
ループカウンターがNextを通るたびにループカウンターが+1されるので、
最後まで回るとちょうど新しく記入する行番号になります。
ループを途中で抜けると、見つかった行番号になるので、
このように検索していくのがコツになります。
あとは、ループが最後まで回ったかどうかで条件分岐し、記入方法を変えればOKかと
思います。
投稿2020/06/26 03:01
総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/26 04:26
2020/06/26 04:31
2020/06/26 05:13
2020/06/26 05:19
2020/06/26 05:24
2020/06/26 05:51