質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1149閲覧

VBA 同じ番号の情報をまとめる

morishinrin3

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/06/26 01:52

画像のように、同じ番号の場合に日付と商品を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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai_keitai

2020/06/26 04:26

そっか、Join関数ね、その手がありましたね。 これだと、ソースコードがスッキリしますね。
ttyp03

2020/06/26 04:31

日付の方にも使えるともっとスッキリするんですけどね。 いい書き方が思いつかなかったです。 Rangeの各セルから日を取り出して配列化、更に重複値を削除、というのを一発でできれば。。。
ttyp03

2020/06/26 05:19

職場のExcelは2013なので使えないです。。。
sazi

2020/06/26 05:24

あ、ええ、レガシーも大事ですよね。
kai_keitai

2020/06/26 05:51

スピル関数が使えれば、VBAは不要ですよね・・・
guest

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

kai_keitai

総合スコア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

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai_keitai

2020/06/26 04:13

確かに、ループは正しく動くと思います。 しかし、値を正しく比較していないので、正しい結果は出ないと思います。 また、質問者は、ユニークの値を出したいとあります。 これでは、同じ日付やコードがセルに代入されてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問