• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【excelマクロ】重複をチェックしてその行を削除・表を整頓するマクロ)

【Excelマクロ】重複をチェックして表を整頓する方法

このQ&Aのポイント
  • Excelマクロを使用して、資材の在庫表を整理する方法を教えてください。
  • 在庫表で品名に重複がある場合、同じ物を表すLotを確認し、行を削除して数量を加算する方法を知りたいです。
  • 特に2列目の品名の重複を確認するだけでなく、3列目のLotの重複も確認する必要があります。また、削除後の行に削除した数量を加算する方法もお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

どうも「ソート」という表現はふさわしくないようです。「サマリ」に訂正します。 ついでに、受入日の最終日の取得を追加しました。 '---------------------------- '重複データのサマリ '---------------------------- Sub SortData() Dim rowMax As Integer Dim row6Max As Integer Dim i, j, k As Integer Dim Hinmei As String Dim Hizuke As String Dim suu As Integer Dim flg As Boolean 'データ一致フラグ 'データ行数 rowMax = CountRow() Cells(1, 6) = Cells(1, 1) Cells(1, 7) = Cells(1, 2) Cells(1, 8) = Cells(1, 3) Cells(1, 9) = Cells(1, 4) '最初に品名+Lotのサマリを作成 11列目に書き出し k = 2 For j = 2 To rowMax Hinmei = Cells(j, 2) + Cells(j, 3) '品名+Lotを取得 flg = False '11列目の品名+Lotと比較 For i = 2 To rowMax If Hinmei = Cells(i, 11) Then flg = True '一致 Exit For End If Next i If flg = False Then '一致しない場合 Cells(k, 11) = Hinmei '11列目へ品名を格納 Cells(k, 6).NumberFormat = "MM/dd" '書式を設定 Cells(k, 6) = Cells(j, 1) Cells(k, 7) = Cells(j, 2) Cells(k, 8) = Cells(j, 3) k = k + 1 '11列目の行数 End If Next j row11Max = k - 1 '品名+Lotのサマリ件数 For k = 2 To row11Max Hinmei = Cells(k, 11) '11列目の品名+Lotを取得 Hizuke = Cells(k, 6) '6列目の日付を取得 suu = 0 For j = 2 To rowMax If Hinmei = Cells(j, 2) + Cells(j, 3) Then '品名+Lotと比較 suu = suu + Cells(j, 4) If Hizuke < Cells(j, 1) Then Hizuke = Cells(j, 1) '日付を取得 Cells(k, 6) = Hizuke '6列目へ日付を設定 End If End If Next j Cells(k, 9) = suu '数量を9列目へ格納 Next k End Sub '--------------------------------------------------- 「受入日」の所は、ちょっと難しいので、補足しましょう。 日付の比較は注意が必要です。 セルの書式が標準となっていると、数値として扱われるからです。 数値と日付を比較すると、正しく比較できないため、 NumberFormatで、書式を日付に変更しています。 下記の記述がとても大事です。 Cells(k, 6).NumberFormat = "MM/dd" '書式を設定 最後に、このプログラムは1度実行すると、2度目はそのままでは ただしく動作しません。 2度目以降は、6列目から11列目までをクリアしてください。 これは初期化の問題ですが、そこは省略させていただきました。

MC28SP
質問者

お礼

Tetralemma様、数回に亘って詳しいご説明ありがとうございました。 当方、マクロ初心者ですので印刷して解析しながら勉強しているところです。大変参考になりました。本当にありがとうございました。

その他の回答 (3)

回答No.3

先ほどの1は、よく観たら間違ってますね。 大変失礼しました。以下に正しいソースを再掲載します。 Function CountRow() Dim suu As Integer Dim i As Integer i = 1 'カウンタ 'データのある行数をカウントする Do i = i + 1 suu = Cells(i, 4) '4列目の数量を取得 Loop While suu > 0 'MsgBox "i=" & i 'データ件数 + 1(次の行) CountRow = i - 1 End Function 最後の値を返すところが抜けてました。

回答No.2

1.まずは、対象データの範囲を調べる機能、 2.次にソート機能が必要です。 3.それから、上から下へ重複を調べる機能、 4.重複したデータを、加算する機能、 5.加算した結果を、書き出す機能が必要ですね。 質問される場合は、このように、機能を分割して、その内、 1つか2つを質問された方が、回答していただけると思います。 とはいえ、お困りのようなので、ポイントだけ解説しましょう。 '----------------------------------------- '1.対象データの範囲を調べる '----------------------------------------- Function CountRow() Dim suu As Integer Dim i As Integer i = 1 'カウンタ 'データのある行数をカウントする Do i = i + 1 suu = Cells(i, 4) Loop While suu > 0 'MsgBox "i=" & i 'ただしiはデータのある次の行 End Function '----------------------------------------- '2.ソート '----------------------------------------- Sub SortData() Dim rowMax As Integer Dim row6Max As Integer Dim i, j, k As Integer Dim Hinmei As String Dim suu As Integer Dim flg As Boolean 'データ一致フラグ rowMax = CountRow() 'データ行数 '最初に品名+Lotのサマリを作成 6列目に書き出し k = 2 For j = 2 To rowMax Hinmei = Cells(j, 2) + Cells(j, 3) '品名+Lotを取得 flg = False '6列目の品名+Lotと比較 For i = 2 To rowMax If Hinmei = Cells(i, 6) Then flg = True '一致 Exit For End If Next i If flg = False Then '一致しない場合 Cells(k, 6) = Hinmei '6列目へ品名を格納 k = k + 1 '6列目の行数 End If Next j row6Max = k - 1 '品名のサマリ件数 For k = 2 To row6Max Hinmei = Cells(k, 6) '6列目の品名+Lotを取得 suu = 0 For j = 2 To rowMax If Hinmei = Cells(j, 2) + Cells(j, 3) Then '品名+Lotと比較 suu = suu + Cells(j, 4) End If Next j Cells(k, 7) = suu '7列目へ格納 Next k End Sub '--------------------------------------- これでソートも合計も出来ました。 とりあえずここまで出来ればあとはなんとかなると思いますが?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

お困りなのはわかりました。 で、どういった回答をお望みなのでしょうか? 考え方としてはあっていると思いますのでそのままプログラムとして書き出せばよいのではないでしょうか? より具体的な部分でどう書いてよいかわからないというのであれば、その旨補足していただければ アドバイスできるかもしれません。 プログラム(マクロ)を代わりに書いてくれという依頼であれば残念ながら ご期待には添えません。 > ご教授願います。 こういう場合は「教示」を使います。

関連するQ&A

専門家に質問してみよう