
vbaをネットで検索しながら作成しているのですが、うまくいかず困っています。
お助けいただけたら嬉しいです。
やりたいことは、①アクティブシートをコピーし、新しく追加したシートに貼り付ける。→○
②F列の納期が複数ある場合は、改行されている毎に分ける→○
③納期を分ける際に、下に行を追加する。その際、列をコピーし貼り付けて、分離された納期を記載する→×
④納期が複数ある場合、合計数量をロット単位に分ける。分けきれなかった場合は、残った数量をその品目の最後に記載。(右図 E列、15行目参照)→×
③、④が分からずご教示いただけると助かります。
----------------------------------------------------------------------------------
Sub 納期分割()
Dim a As Variant
Dim i As Long
Dim j As Long
ActiveSheet.Copy after:=ActiveSheet
ActiveSheet.Name = "New Sheet"
For j = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
With ActiveSheet
'改行区切りで分割
a = Split(.Cells(j, "F"), vbLf)
'配列の大きさの分だけループ
For i = 0 To UBound(a)
.Cells(j + i, "F") = a(i) 'セルへ入力
Next i
End With
Next j
End Sub

No.4ベストアンサー
- 回答日時:
No3です。
以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 納期分割()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim maxrow As Long
Dim row1 As Long
Dim row2 As Long
Dim srow2 As Long
Dim i As Long
Dim ndays As Variant '納期
Dim lot As Variant 'ロット
Dim goukei As Variant '合計数量
Set ws1 = ActiveSheet
maxrow = ws1.Cells(Rows.Count, 1).End(xlUp).Row
Worksheets.Add after:=ws1
Set ws2 = ActiveSheet
ws2.Name = "New Sheet"
'見出しコピー
ws2.Cells(1, 1).Resize(1, 6).Value = ws1.Cells(1, 1).Resize(1, 6).Value
row2 = 2
For row1 = 2 To maxrow
srow2 = row2
'コード~合計数量コピー
ws2.Cells(row2, 1).Resize(1, 4).Value = ws1.Cells(row1, 1).Resize(1, 4).Value
row2 = row2 + 1
ndays = Split(ws1.Cells(row1, "F").Value, vbLf)
'合計数量が空白なら次のコードへ
If ws1.Cells(row1, "D").Value = "" Then GoTo NEXT99
'納期が空白なら次のコードへ
If ws1.Cells(row1, "F").Value = "" Then GoTo NEXT99
For i = 1 To UBound(ndays)
ws2.Cells(row2, 1).Resize(1, 4).Value = ws1.Cells(row1, 1).Resize(1, 4).Value
row2 = row2 + 1
Next
'数量と納期の設定
lot = ws1.Cells(row1, "C").Value
goukei = ws1.Cells(row1, "D").Value
For i = 0 To UBound(ndays)
If i = UBound(ndays) Or lot > goukei Then
ws2.Cells(srow2 + i, "E").Value = goukei
goukei = 0
Else
ws2.Cells(srow2 + i, "E").Value = lot
goukei = goukei - lot
End If
ws2.Cells(srow2 + i, "F").Value = ndays(i)
Next
NEXT99:
Next
ws2.Range("F:F").NumberFormatLocal = "m""月""d""日"""
MsgBox ("完了")
End Sub
お返事ありがとうございます。
できました!
色々な方法がありますね。VBAって奥が深いなと感じさせられます。
「教えてgoo」で回答してくれる方々は、皆様すごいっ!!
ありがとうございました。
No.3
- 回答日時:
No2です。
>ご指摘の通りです。
>手入力で右図を作成したので、入力誤りしました。
ということは、下記の④のケースは存在しないということでしょうか。
8640÷2880=3 余り 0 のため下記のケースには該当しません。
④納期が複数ある場合、合計数量をロット単位に分ける。分けきれなかった場合は、残った数量をその品目の最後に記載。
お返事ありがとうございます。
④のケースは存在します。品名「かき」がそれに該当します。
右図をE16→2400、E17→2400、E18→3840
としたかったです。
詳しくは、補足しました。しかしながら、画像添付したので多少時間がかかると思います。
色々とありがとうございます。
No.1
- 回答日時:
こんばんは
③についてやり方は色々ありますが せっかく途中までトライしている
コードがあるので 掲示されているコードの処理方法を考えると
For j = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
下の行から処理をすると言う発想で処理しているので
>'配列の大きさの分だけループ
も下の値(配列の要素インデックスの多きものから)から処理しないと上手くいきません
また、複数対象行を分けるわけですから行を追加する必要がありますね
追加位置は下から上なので 処理対象行の1つ下に新規行を追加してその行に対して値を入れていく 処理手順になりますね(下に押し出していく)
参考例
Sub 納期分割()
Dim a As Variant
Dim i As Long
Dim j As Long
ActiveSheet.Copy after:=ActiveSheet
ActiveSheet.Name = "New Sheet"
With ActiveSheet
For j = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
'改行区切りで分割
a = Split(.Cells(j, "F"), vbLf)
'配列の大きさの分だけループ
For i = UBound(a) To 0 Step -1
If i > 0 Then
'下に行を追加
.Cells(j, "F").Offset(1, 0).EntireRow.Insert Shift:=xlShiftDown
.Range(.Cells(j + 1, "A"), .Cells(j + 1, "E")).Value = .Range(.Cells(j, "A"), .Cells(j, "E")).Value
.Cells(j + 1, "F").Value = a(i) 'セルへ入力
Else
.Cells(j, "F").Value = a(i) 'セルへ入力
End If
Next i
Next j
End With
End Sub
④についてですが
上の処理の中に加える事も出来ますが少し複雑になりますので
③処理の後に処理を加えればD列の値からC列の値を
A列やB列の値を条件に比較的簡単に出来そうです
(一意でない場合があるのなら③の処理中の方が確実かもしれません)
④についてはせっかくここまで作っているので私は回答を割愛します
③の処理で出来上がったシートを見て今一度考えてみてください
お返事ありがとうございます。
すごいっ! ③の処理うまくいきました。
行を追加するときは、下からという記憶があり下から処理をしていました。「配列の大きさの分だけループ」の方はコードに夢中になり、先の処理と整合性がとれていないことに気付きませんでした。何度か行を追加するプログラムを入れたのですが、うまくいきませんでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba 2つの条件が一致したら...
-
ExcelVBAでテキストルーレット...
-
Changeイベントでの複数セルの...
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
【VBA】複数行あるカンマ区切り...
-
SpecialCells(xlCellTypeConsta...
-
VBScriptでfindを使うには??
-
excel vbaで日付指定で入力
-
Excelで、あるセルの値に応じて...
-
データグリッドビューの一番最...
-
【VBA】2つのシートの値を比較...
-
IIF関数の使い方
-
列全体をコピーして別の列に貼...
-
マクロを使って比較した結果の...
-
フォルダを一括で作成したいの...
-
期限を超えた日付に警告のメッ...
-
VBAで散布図(グラフ)の作成
-
ExcelVBA コンボボックスの表示
-
Excel VBA 列の表示と非表示に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
IIF関数の使い方
-
Cellsのかっこの中はどっちが行...
-
【VBA】2つのシートの値を比較...
-
VBAのFind関数で結合セルを検索...
-
URLのリンク切れをマクロを使っ...
-
文字列の結合を空白行まで実行
-
VBA 何かしら文字が入っていたら
-
VBAを使って検索したセルをコピ...
-
【Excel VBA】 B列に特定の文字...
-
VBAで指定範囲内の空白セルを左...
-
Changeイベントでの複数セルの...
-
VBAで、離れた複数の列に対して...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
rowsとcolsの意味
-
DataGridViewに空白がある場合...
おすすめ情報
補足します。
元々添付していた図は、左図が元データ。右図がvba実行後に完成させたいデータとなります。
しかしながら、実行後データを手入力で作成したので、間違っていました。
お陰様で、①、②、③まで完成しました。添付データを再作成しました。
「値が一致した場合、数値を合算する」はネット検索したらいくつか出てくるのですが、「値が一致したら合計数量から引いていく。」というのは見つからず困っています。
やりたいことは、A列(コード)が一致したら、D列(合計数量)からC列(ロット)を引いていく。
ロット単位にならなかったときは、同一コードの最終行に記載する。
(例)右図E16→2400、右図E17→2400、右図E18→3840
よろしくお願いします。