会社で資材の在庫表を作成しているのですが、大変困っております。
マクロ初心者で技術不足なのでどうかご教授願います。
「資材受け入れシート」として、下の表があります。
1 2 3 4
受入日 品名 Lot 数量
7/7 A BNR32 10
7/8 A BNR32 5
7/10 B SW200 2
7/7 B AE860 4
7/8 B SW200 12
7/9 C GD300 10
7/7 C GD300 1
7/7 C DC200 7
これを2列目「品名」をキーとして「Lot」を確認し、同じ(つまり同じ物)であればその行を削除して、数量を加算して1行にまとめるマクロを作りたいのです。ポイントは2列目「品名」の重複確認のみで行削除ではなく、3列目「Lot」も確認する必要があることと、削除してからその「品名」がある行に削除した「数量」分加算しなくてはいけないことだと考えております。
1 2 3 4
受入日 品名 Lot 数量
7/8 A BNR32 15
7/10 B SW200 14
7/7 B AE860 4
7/9 C GD300 11
7/7 C DC200 7
「受入日」の所はできれば最終日になれば良いかなと思っています。
会社で期限を決められているのですが、手こずってしまい前へ進みません。説明が分かりづらいかもしれませんが、どうか宜しくお願いいたします。
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列目までをクリアしてください。
これは初期化の問題ですが、そこは省略させていただきました。
Tetralemma様、数回に亘って詳しいご説明ありがとうございました。
当方、マクロ初心者ですので印刷して解析しながら勉強しているところです。大変参考になりました。本当にありがとうございました。
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
'---------------------------------------
これでソートも合計も出来ました。
とりあえずここまで出来ればあとはなんとかなると思いますが?
No.1
- 回答日時:
お困りなのはわかりました。
で、どういった回答をお望みなのでしょうか?
考え方としてはあっていると思いますのでそのままプログラムとして書き出せばよいのではないでしょうか?
より具体的な部分でどう書いてよいかわからないというのであれば、その旨補足していただければ
アドバイスできるかもしれません。
プログラム(マクロ)を代わりに書いてくれという依頼であれば残念ながら
ご期待には添えません。
> ご教授願います。
こういう場合は「教示」を使います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/25 11:42
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) vbaマクロについて 【1.csv】をもとに【商品.csv】に有るものを【有り.csv】として名前を 1 2023/05/18 07:58
- Visual Basic(VBA) vbaマクロについて 次のようなマクロを組みたいです。 自分は初心者なので全くわかりません。 詳しく 8 2023/05/18 18:38
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 【至急】 当方初心者です。 マクロについて知恵をお貸しください。 ★したい動作 ①リストE列2行目か 4 2022/09/29 18:56
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのCSV読み込みについて
-
エクセルのマクロ コンボボッ...
-
富士通(汎用機)のAIMについて
-
VB2005 で NetworkStream で取...
-
Excel VBA で日付を4ケタの数値...
-
C# DataTableに最後に追加した...
-
グリッドについて,エクセルの...
-
COBOL数値転記の仕様
-
【VB.NET】Excelの最終行までの...
-
「GET」と「POST」の違い
-
VBAコンボボックスの内容が反映...
-
エクセルのセル最終行取得
-
VB6のMsFlexGridコントロールに...
-
ExcelVBAで戻り値を返すには
-
VB.NET マルチスレッド処理につ...
-
ActiveReportのdetailをデータ...
-
「Nullの使い方が不正です」の...
-
VBAでメモ帳からの文字列を所定...
-
Excel VBAでフォルダ内の全テキ...
-
エクセルデータをVBで検索でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Nullの使い方が不正です」の...
-
【C#】textBoxの指定行のデータ...
-
【VB.NET】Excelの最終行までの...
-
VBAでアクセスDBからデータの取...
-
Excel VBAでフォルダ内の全テキ...
-
C# DataTableに最後に追加した...
-
XMLでデータとして画像を指定す...
-
VBAコンボボックスの内容が反映...
-
MSFlexGrid 行選択状態
-
COBOL数値転記の仕様
-
クリスタルレポートでレコード...
-
非同期のプロセス間通信(パイプ...
-
ActiveReportのdetailをデータ...
-
アクセスでウェブ上のデータを...
-
Excel VBAでグループ毎に集計す...
-
batでレジストリキーから読み取...
-
富士通(汎用機)のAIMについて
-
Web画面のTableから数字を取得...
-
Excel VBAで1週間毎にカテゴリ...
-
エクセルのCSV読み込みについて
おすすめ情報