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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

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

Q&A

0回答

931閲覧

VBAマクロに関しての質問。難しいかもしれません、、、

asuka1998

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

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

0グッド

2クリップ

投稿2018/07/17 16:49

前提・実現したいこと

マクロで修正したい箇所がありご質問させていただきます。
ちょっと内容が難しかったり、説明が下手な部分があると思われますがよろしくお願いします。
説明ではわからない部分があると思うので、
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2018/07/17 21:17

↑現状はVBAマクロについての質問であることは分かりますが、それはタグで充分です。
ttyp03

2018/07/18 00:20

質問が長くて理解に苦しむ。質問があちこちに分散していて要点がわからない。結局のところ「やり方がわからないから教えてくれ」なのか「コードのどこを直さないといけないかの見当はついているが実装の仕方がわからない」のか。前者だとすると丸投げ判定になるので推奨されません。後者であるならもう少しピンポイントで情報を載せてください。
KoichiSugiyama

2018/07/18 00:43 編集

他の方からもご指摘がありますように、まず質問内容を整理されてはどうでしょう。その上で1)何が聞きたいのか(考え方、実装手段、単にこのやり方でいいのかアドバイスを求めている等)2)自分でどこまでやったか(実装したけどうまく動かない、実装方法自体検討つかない等)3)どう動くのが正解なのか(どう動かしたいか)、くらいにまとめて文頭に追記したほうがアドバイスが集まりやすいと思います。現状、最初から仕様を細かく説明されても、アドバイスする側は仕事を請けるわけではありませんので、逆に興味が冷めてしまって続きを読んでくれない可能性があります。
YomogiKOBO

2018/07/18 01:47

"注文読込 sheet"の状態と"過去注文履歴 sheet"の状態が不一致なのはなぜでしょうか。。読み込んだものをそのまま履歴にはしないのですね。処理しずらいったらありゃしない。
horiegom

2018/07/18 03:51

改行や表を上手く使って、見やすく分かりやすくしてください。情報量が多すぎます。
unz.hori

2018/07/19 02:48

細かい処理の内容より、問題を明確に簡潔に書いてください。やたら情報量が多く読むのに気力が必要となります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問