前提・実現したいこと
マクロで修正したい箇所がありご質問させていただきます。
ちょっと内容が難しかったり、説明が下手な部分があると思われますがよろしくお願いします。
説明ではわからない部分があると思うので、
Excelsheetの処理結果を例で記載します。
"注文読込sheet"のA列の"AM 注文開始"から"AM 注文終了"が記載されている間のセルで
商品: 番号: メッセージ:を探し、あれば"注文詳細sheet"のA列に商品:をB列に番号:以降の値を
表示します。"過去注文履歴sheet"のA列には、商品: 番号: メッセージ:の1セットの値を結合して
入力され、B列には商品:、C列には番号:、D列にはメッセージ:の値が入力され追加されていく仕組みになっており
履歴として残るようになっています。
"注文詳細sheet"のC列には、今回処理を行った際の、商品: 番号: メッセージ:の組み合わせの
値が"過去注文履歴sheet"のA列に履歴として元々あればその行番号を表示するようになっています。
以上が処理の流れになります。自分の説明よりわかる人はマクロを見ていただいた方が
処理の流れがわかるかもしれません。
今回ご質問したい内容を以下に記載。
新規に"マスタsheet"を作成し、そのA列にあらかじめ 特定のメッセージ:以降の値を入力しておきます。
処理で取得した商品: 番号: メッセージ: 以降の値で、商品: 番号: の値と"マスタsheet"のA列にある値が
部分一致していて、"過去注文履歴sheet"のA列を見てメッセージの特定の部分以外が一致していればその
行番号を返す仕組みに修正したいです。下に例を書きます。
例
マスタ sheet
A1 ハンバーグ10注文時間は秒でした。
A2 パフェ30注文時間は分くらいです。
過去注文履歴 sheet
A1 ハンバーグ10注文時間は30秒でした。
B1 ハンバーグ
C1 10
D1 注文時間は30秒でした。
A2 パフェ30注文時間は1分くらい。
B2 パフェ
C2 30
D2 注文時間は1分くらい。
↑
※A1等はどこのセルかわかるために書いてます。
A1B1と縦に書いてるのは横に書いた場合わかりずらいかなと
思い縦に書きました。B1セルにハンバーグと入ってるイメージです。
注文読込 sheet
A1 AM 注文開始
A2 商品:ハンバーグ
A3 番号:10
A4 メッセージ:注文時間は60秒でした。
A5
A6 商品:ラーメン
A7 番号:20
A8 メッセージ:注文時間は40秒でした。
A9
A6 商品:パフェ
A7 番号:30
A8 メッセージ:注文時間は2分くらい。
A9 AM 注文終了
今のマクロの処理では、
今回注文読込sheetから読み込んだ商品: 番号: メッセージ:
の値を結合して、過去注文履歴sheetのA列と比較した時に
新規注文としてすべて過去注文履歴sheetに追加されてしまいます。
注文読込sheetの最初の商品番号メッセージの組み合わせである
"ハンバーグ10注文時間は60秒でした"は、過去注文履歴sheetを
見ると秒数ちがい以外は同一の値のものがあります。これを
新規追加ではなく過去にあったものとして処理したいです。
商品:ハンバーグ 番号:10 メッセージ:注文時間は60秒でした。
マスタsheetのA列を見に行き、今回注文読込sheetから取得した
"ハンバーグ10注文時間は60秒でした。"とマスタsheetA列の
"ハンバーグ10注文時間は*秒でした。"の秒数の部分以外が一致
しているので、過去注文履歴sheetのA1の値と同一の注文ないようとして
注文詳細sheetのC列に1行目と表示されるようにしたいです。
修正後の処理結果
過去注文履歴 sheet
A1 ハンバーグ10注文時間は30秒でした。
B1 ハンバーグ
C1 10
D1 注文時間は30秒でした。
A2 パフェ30注文時間は1分くらい。
B2 パフェ
C2 30
D2 注文時間は1分くらい。
A3 ラーメン20注文時間は40秒でした。
B3 ラーメン
C3 20
D3 注文時間は40秒でした。
↑
新規追加されるのはラーメンの値だけ。
それ以外の値は過去にあったものとして判断。
注文詳細sheet
A1 ハンバーグ
B1 10
C1 1
A2 ラーメン
B2 20
C2 ×
A3 パフェ
B3 30
C3 2
↑
新規追加のものは行番号が×として表示される処理になっています。
パフェの値もマスタsheetに秒数以外同一のものがあり、
過去注文履歴sheetのA2セルに○分以外同一の値が元々
入っているので、同一の値と判断し、2行目の2と
注文詳細sheetに値を返す。
下に私が組んだマクロを記載します。
Sub log() Dim R As Range, W As Range Dim s(1 To 3) Set WS = Worksheets("注文詳細") Set R = Worksheets("注文読込").Range("A1") Set W = Worksheets("注文詳細").Range("C1") Set w2 = Worksheets("注文詳細").Range("B5:B100") WS.Range("5:100").Clear Do Until R Like "*AM 注文開始*" Set R = R.Offset(1, 0) Loop Do Until R Like "*AM 注文終了*" Set R = R.Offset(1, 0) If R Like "商品:*" Then s(1) = Mid(R, 4) If R Like "番号:*" Then s(2) = Mid(R, 4) If R Like "メッセージ:*" Then s(3) = Mid(R, 7) If s(3) <> "" Then On Error Resume Next W = WorksheetFunction.Match(s(1) & s(2) & s(3), Worksheets("過去注文履歴").Range("A:A"), 0) On Error GoTo 0 If W = "" Then W = "×" Worksheets("過去注文履歴").Range("A" & Rows.Count).End(xlUp).Offset(1) = s(1) & s(2) & s(3) Worksheets("過去注文履歴").Range("B" & Rows.Count).End(xlUp).Offset(1) = s(1) Worksheets("過去注文履歴").Range("C" & Rows.Count).End(xlUp).Offset(1) = s(2) Worksheets("過去注文履歴").Range("D" & Rows.Count).End(xlUp).Offset(1) = s(3) End If Worksheets("注文詳細").Range("A" & Rows.Count).End(xlUp).Offset(1) = s(1) Worksheets("注文詳細").Range("B" & Rows.Count).End(xlUp).Offset(1) = s(2) Set W = W.Offset(1, 0) s(1) = "" s(2) = "" s(3) = "" End If Loop End Sub よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー