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

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

ただいまの
回答率

90.34%

  • VBA

    1906questions

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

  • マクロ

    238questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 321

asuka1998

score 0

 前提・実現したいこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • horiegom

    2018/07/18 12:51

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

    キャンセル

  • unz.hori

    2018/07/19 11:48

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

    キャンセル

  • 退会済みユーザー

    2018/07/20 16:22

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

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

同じタグがついた質問を見る

  • VBA

    1906questions

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

  • マクロ

    238questions

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