[[20180825165854]] 『曜日と担当店舗によって変わる時間外の抽出』(ありさ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『曜日と担当店舗によって変わる時間外の抽出』(ありさ)

お世話になっております

あまり、関数やVBAも詳しくなくご協力頂けますでしょうか

複数のシートをまとめたVBAからのまとめデータとなります

店舗によって営業時間が異なるのと、土日・祝でも異なります
OPEN前の時間と営業時間後の場合のデータのみを抽出が希望となります

東京なら 月〜金 11時OPEN〜18時close
     土   10時OPEN〜20時close 
     日・祝 10時OPEN〜19時close

神奈川や埼玉なら  月〜金 10時OPEN〜18時close
          土   11時OPEN〜19時close 
          日・祝 12時OPEN〜20時close

群馬なら  月〜土 10時OPEN〜18時close 
          日・祝 12時OPEN〜20時close

となりシートは下記のように表示されております

   A        B      C        D
1店舗    日       開始  終了
2東京    8/2      9:00   10:00 
3東京    8/15     20:30  22:30
4埼玉    8/15     14:50  17:20
5東京   8/17   20:30  21:28
6神奈川   8/12      9:00   11:00
7埼玉    8/13     15:00  18:00
8神奈川   8/15     18:50  20:20

上記のような表があり
営業時間外の場合の列のみ抽出する方法を教えて頂けますでしょうか

↓↓↓抽出をこのようにしたいです↓↓↓

   A        B      C        D
1店舗    日       開始  終了
2東京    8/2      9:00   10:00 
3東京    8/15     20:30  22:30
4東京   8/17   20:30  21:28
5神奈川   8/12      9:00   11:00
6神奈川   8/15     18:50  20:20

※営業時間は、現状のところ3パターンです
店舗によって異なるのと、曜日によっても異なるので悩んでしまいまして

ご指導よろしくお願いします

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >店舗によって異なるのと、曜日によっても異なるので悩んでしまいまして 

 その部分は、ケース分けをすればいいので、こちらで何とか出来ます。

 しかし、「抽出」の仕様自体がハッキリしないので、
 「東京の日曜日の1パターンしかない」としたら、
 コードはどんなものになるのか・・そのコードをアップ頂けると明解で有難いのですが。

(半平太) 2018/08/25(土) 20:33


半平太様

説明不足で申し訳ありません(>_<)
関数も調べつつ行っているので、コードがどのようにすればいいのかな状態です
申し訳ありません

抽出としては、東京の日曜は10時〜19時以外の時間のみとなるので
10時前の時間が記載されていたら時間外
また、19時以降の時間が記載されていたら時間外と判断し、判断されたもののみの列が抽出されるのが希望となります。

店舗の曜日に合わせて、さらに営業時間ではないものを抜き出したいのですが

いろいろ検索して
IFとTIMEを使いつつ行おうとは思ったのですが、これがあっているのかも微妙なので
より良い方法があれば教えて頂けると助かります<(_ _*)>

(ありさ) 2018/08/25(土) 21:41


 <Sheet1>シートのテストデータ
  行  ___A___  ______B______  __C__  __D__
   1  店舗     日             開始   終了 
   2  東京     2018/8/2(木)    9:00  10:00
   3  東京     2018/8/15(水)  10:30  18:00
   4  埼玉     2018/8/15(水)  14:50  17:20
   5  東京     2018/8/17(金)  20:30  21:28
   6  神奈川   2018/8/12(日)   9:00  11:00
   7  埼玉     2018/8/13(月)  15:00  18:00
   8  神奈川   2018/8/15(水)  18:50  20:20

 <パターン>シートを作成して、以下のデータを入力して置く。 H列には祝日を入力してください。
  行  ___A___  ___B___  __C__  ___D___  __E__  __F__  __G__  _____H_____
   1  店舗     日祝(2)         月金(4)         土(6)         祝日リスト 
   2  東京     10:00    19:00  11:00    18:00  10:00  20:00  2018/8/15  ←テスト用
   3  神奈川   12:00    20:00  10:00    18:00  11:00  19:00             
   4  埼玉     12:00    20:00  10:00    18:00  11:00  19:00             
   5  群馬     12:00    20:00  10:00    18:00  10:00  18:00             

 <抽出>シート テスト結果図
  行  ___A___  ______B______  __C__  __D__
   1  店舗     日             開始   終了 
   2  東京     2018/8/2(木)    9:00  10:00
   3  東京     2018/8/17(金)  20:30  21:28
   4  神奈川   2018/8/12(日)   9:00  11:00
   5  神奈川   2018/8/15(水)  18:50  20:20

 ’標準モジュールに貼り付けるマクロ
 Private Enum ColOrder
     店舗 = 1
     日付
     開始
     終了
 End Enum

 Sub overTime()
     Const Ws1N As String = "Sheet1" '←実態のシート名に合わせる
     Const WsExN As String = "抽出"  '←実態のシート名に合わせる
     Const WsPtnN As String = "パターン"  '←新規シート名

     Dim rngPtn As Range
     Dim paternRow, ShopDSE, Result()
     Dim RW As Long, CL As Long, posCol As Long, RWtoWrit As Long
     Dim isOvTime As Boolean
     Dim ptnS, ptnE, WorkS, WorkE

     Rem パターンRangeを取得
     Set rngPtn = Worksheets(WsPtnN).Range("A2").CurrentRegion

     Application.ScreenUpdating = False
     Worksheets(WsExN).UsedRange.ClearContents '更地化

     With Worksheets(Ws1N)
         With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp).Offset(, 3))
             .Copy Worksheets(WsExN).Range("A1")   '丸ごとコピー
             ShopDSE = .Value2
             ReDim Result(1 To UBound(ShopDSE) - 1, 1 To UBound(ShopDSE, 2))
         End With
     End With

     RWtoWrit = 0

     For RW = 2 To UBound(ShopDSE)
         isOvTime = False '初期化

         paternRow = Application.Match(ShopDSE(RW, 店舗), rngPtn.Columns(1), 0)

         If Not IsNumeric(paternRow) Then
             MsgBox "店舗名「" & ShopDSE(RW, 店舗) & "」はパターンに無いです。処理中止"
             Exit Sub
         Else
             If Application.CountIf(rngPtn.Columns("H"), ShopDSE(RW, 日付)) Then '祝日
                 posCol = 2                     '日祝(2)
             Else
                 Select Case Weekday(ShopDSE(RW, 日付))
                     Case 1: posCol = 2         '日祝(2)
                     Case 2 To 6: posCol = 4    '平日(4)
                     Case 7: posCol = 6         '土曜(6)
                 End Select
             End If
         End If

         With rngPtn(paternRow, posCol)
             ptnS = .Value2
             ptnE = .Offset(, 1).Value2
         End With

         WorkS = ShopDSE(RW, 開始)
         WorkE = ShopDSE(RW, 終了)
         WorkE = WorkE + IIf(WorkE < WorkS, 1, 0) '深夜越え考慮

         If WorkS < ptnS Or _
            ptnE <= WorkS Or _
            WorkE <= ptnS Or _
            ptnE < WorkE Then

             isOvTime = True
         End If

         If isOvTime Then
             RWtoWrit = RWtoWrit + 1

             For CL = 1 To 4
                 Result(RWtoWrit, CL) = ShopDSE(RW, CL)
             Next CL
         End If
     Next RW

     Rem 結果打ち出し
     Worksheets(WsExN).Range("A2").Resize(UBound(Result), UBound(Result, 2)).Value = Result
     Application.ScreenUpdating = True
 End Sub

(半平太) 2018/08/26(日) 10:43


半平太様

うわぁー!!本当にありがとうございます(>_<)

試してみたのですが、下記のコード

Select Case Weekday(ShopDSE(RW, 日付))

型が一致しませんと表示されてしまいます

黄色部分を見ると、
ShopDSEはSheet1の日付である2018/8/2(木)となっています

本当申し訳ありませんが再度教えて頂けますでしょうか
よろしくお願いします(>_<)

(ありさ) 2018/08/26(日) 16:17


 >ShopDSEはSheet1の日付である2018/8/2(木)

 そこは、日付データ(シリアル値)ですよね?

 ※私のサンプルは、表示形式で曜日も表示させてはいますけれども・・
  私のサンプル通り「文字型で手入力」したのでしょうか?

(半平太) 2018/08/26(日) 17:08


半平太様

値を設定しなおしたら無事にエラーなく表示されました。
ご指摘ありがとうございます

これで作業が本当に楽になります(>_<)泣

本当に拙い説明の中、何度もありがとうございました

(ありさ) 2018/08/26(日) 17:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.