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

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

新規登録して質問してみよう
ただいま回答率
85.50%
マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

218閲覧

複数の条件毎に抽出データを変化させたい

miyako123

総合スコア11

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2018/08/03 07:10

以前、

[シートA] にあるデータを、<例1>のように
・並べ替え順に
・数量分だけ
[シートB]に抽出する場合のマクロについて、質問させていただきました。
参考:以前の質問

<例1>
[シートA]

(A列)並べ替え順(B列)品名(C列)数量
物品A2
3物品B3
物品C1
1物品D1
2物品E2


[シートB]

(A列)品名
物品D
物品E
物品E
物品B
物品B
物品B

ここからさらに発展させ、
<例2> にあるように、B列に「1」があるものは数量を分割せず、シートBの数量欄にはシートAの数量をそのまま抽出するように変更する必要が出てきました。

つまり、現状の抽出条件の優先順位としては、

①並べ替え順に貼り付ける
②分割列に1がある場合には品名を数量列にかかわらず1個だけシートBに抽出、シートAの数量列の値をそのまま抽出
③分割列に1がない場合には数量列の分だけ品名をシートBに抽出、数量列には1を記載

です。

<例2>
[シートA]

(A列)並べ替え順(B列)分割(C列)品名(D列)数量
物品A2
31物品B3
物品C1
1物品D1
2物品E2


[シートB]

(A列)品名(B列)数量
物品D1
物品E1
物品E1
物品B3

試したこと

以下のようなコードを作ってみましたが、分割列に1がある場合のみ認識されているのか、分割列が空欄のものは抽出してくれません。
条件式が誤っているのかとも思うのですが、ご意見をいただきたく投稿させて頂きました。

よろしくお願いします。

Const 設定区分列 As Integer = 1 Const 繰返数列 As Integer = 4 Const 書込開始行 As Integer = 3 Const 製番表 As String = "製番表作成準備" Dim 並べ替え順 As Integer Dim 並べ替え順最大値 As Integer 数量 = Cells(Rows.Count, 4).End(xlUp).Offset(1).Row 書込中行 = 書込開始行 並べ替え順最大値 = Application.WorksheetFunction.Max(Range("A:A")) For 並べ替え順 = 1 To 並べ替え順最大値 For i = 1 To 数量     If Cells(i, 設定区分列) = 並べ替え順 And Cells(2, 分割列) = 1 Then      Sheets(製番表).Cells(書込中行, 1) = "支給品" Sheets(製番表).Cells(書込中行, 2) = Cells(i, 3) Sheets(製番表).Cells(書込中行, 3) = Cells(i, 12) ElseIf Cells(i, 設定区分列) = 並べ替え順 And Cells(2, 分割列) = "" Then For j = 1 To Cells(i, 繰返数列) Sheets(製番表).Cells(書込中行, 1) = "支給品" Sheets(製番表).Cells(書込中行, 2) = Cells(i, 3) Sheets(製番表).Cells(書込中行, 3) = "1" 書込中行 = 書込中行 + 1 Next j End If Next i Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

ざっくりしか見てませんが、以下2点が気になりました。

分割列の参照先が2行目固定になってます。
分割列=1のときに書込中行のインクリメントが必要そうです。

VBA

1For 並べ替え順 = 1 To 並べ替え順最大値 2 3 For i = 1 To 数量 4 5'    If Cells(i, 設定区分列) = 並べ替え順 And Cells(2, 分割列) = 1 Then 6    If Cells(i, 設定区分列) = 並べ替え順 And Cells(i, 分割列) = 1 Then 7 8      Sheets(製番表).Cells(書込中行, 1) = "支給品" 9 Sheets(製番表).Cells(書込中行, 2) = Cells(i, 3) 10 Sheets(製番表).Cells(書込中行, 3) = Cells(i, 12) 11 書込中行 = 書込中行 + 1 '追加 12 13' ElseIf Cells(i, 設定区分列) = 並べ替え順 And Cells(2, 分割列) = "" Then 14 ElseIf Cells(i, 設定区分列) = 並べ替え順 And Cells(i, 分割列) = "" Then 15 16 For j = 1 To Cells(i, 繰返数列) 17 Sheets(製番表).Cells(書込中行, 1) = "支給品" 18 Sheets(製番表).Cells(書込中行, 2) = Cells(i, 3) 19 Sheets(製番表).Cells(書込中行, 3) = "1" 20 21 書込中行 = 書込中行 + 1 22 Next j 23 End If 24 Next i 25Next 26

投稿2018/08/03 07:36

ttyp03

総合スコア16996

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

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

miyako123

2018/08/06 01:37

コメントありがとうございました。 確認が遅れ申し訳ありませんでした。 ご指摘の「分割列の参照先」を「2」から「i」に変更したところ、新たな問題が発生しています。 「並べ替え順=1」and「分割=1」 の状態の品名・数量が無視され、そのほかは抽出される というものです。
ttyp03

2018/08/06 01:47

Cells(i, 12)のところの12って正しいですか? 4ではないですか? またその次の行に書込中行をインクリメントする処理を追加しましたが、確認していますでしょうか。
miyako123

2018/08/06 01:54

申し訳ありませんでした、インクリメント追加の処理を書き込む場所を間違えていました。 12は、ご指摘の通り4が正しいです。 実物が12のため、修正をもらして記載していました。 インクリメント処理の場所を直したところ、意図した処理が行われました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問