• 締切済み

エクセルVBA-複数の条件に一致する値をそれぞれ表示させたいのですが・

エクセルVBA-複数の条件に一致する値をそれぞれ表示させたいのですが・・・ エクセルVBAの超初心者です。 当初はVLOOKUP関数で作ってみようと思いましたが、データ量が多すぎるのもあり マクロを使ってボタンで一発表示が出来ないものかと思いました。 色々調べてみましたが、時間範囲の表示がわからず行き詰ってしまったので、 どなたか教えてください。宜しくお願いします。 社員区分、勤務種別、勤務開始時間を判別して、条件に一致した値を表示できる 表を作成しようとしています。 例えば、「社員区分が★で勤務種別が夜勤1、勤務開始時間が21:00~23:00の間 で入力した場合は区分1」のように表示したいのです。 シートでいうと次のような感じです。  A1  B1    C1     D1  ★  夜勤1  22:05 ⇒ 区分1  ☆  夜勤2  22:10 ⇒ 区分2  ★  夜勤3  20:00 ⇒ 区分3 セルA1~C1までは手入力をし、その後ボタンを押すとD1のような 結果表示をするように作成したいのです。 社員区分は、★と☆の2通り、勤務種別は3通りです。 ここで面倒なのが、勤務開始時間の範囲です。 夜勤1の勤務開始時間は21:00~23:30の間 夜勤2の勤務開始時間は23:00~24:30の間 夜勤3の勤務開始時間は20:00~21:00の間 と、勤務開始時間が1分刻みに設定されていて、なおかつ夜勤1と夜勤2の 開始時間が23:00~23:30の間、かぶってしまっているのです。 VBAの記述で、時間の範囲表示はどのように記述したら良いのかわからず、 行き詰ってしまいました。。 分かりづらい質問になってしまい大変恐縮ですが、どうぞ良いアドバイスを お願いいたします。

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

時間だけの判定では、夜勤1と2は区別されないので質問の通り、です。 複数の項目で判定するにはANDでつなげますが、ケース漏れのないよう注意することです。 IF 社員区分=★ AND 勤務区分=夜勤1 AND 時間≧21:00 AND 時間≦23:30 THEN ENDIF IF 社員区分=☆ AND 勤務区分=夜勤2 AND 時間≧23:00 AND 時間≦24:30 THEN ENDIF 複数条件の記載には、SELECT文も使えます。参考に。 時間ですが、時間≦24:30と簡単に書きましたが実際はどういうデータ型かで判定の記載変わってきます。時間に関しては行き詰まるところです。どんな状態ですか。文字列ですか。 あと、 コード回答を理解しないでコピー貼付け等してそのまま使うのは、考えないで事を進めてしまうので、上達遅いです。面倒でもわかるまで説明をもらうことです。やっていることわかりますか。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

'分類 If datTarget >= datBorder01 Then strMessage = "夜勤3" If datTarget >= datBorder02 Then strMessage = "夜勤1" If datTarget >= datBorder03 Then strMessage = "夜勤1と夜勤2の共通時間" If datTarget >= datBorder04 Then strMessage = "夜勤2" If datTarget >= datBorder05 Then strMessage = "夜勤開始時間に該当しません" End If End If End If End If Else strMessage = "夜勤開始時間に該当しません" End If 'テスト出力(イミディエイトウィンドウ) Debug.Print strMessage End Sub

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

[Excel VBA] Option Explicit '時刻比較の為の基準日 Private Const DATE_BASE_YYYY As Integer = 2000 Private Const DATE_BASE_MM As Integer = 1 Private Const DATE_BASE_DD As Integer = 1 Sub DateTest() Dim xlWorksheet As Excel.Worksheet Dim datBorder01 As Date Dim datBorder02 As Date Dim datBorder03 As Date Dim datBorder04 As Date Dim datBorder05 As Date Dim datTarget As Date Dim strMessage As String '境界時刻の設定 datBorder01 = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD) _ + TimeSerial(20, 0, 0) datBorder02 = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD) _ + TimeSerial(21, 0, 0) datBorder03 = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD) _ + TimeSerial(23, 0, 0) datBorder04 = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD) _ + TimeSerial(23, 30, 0) datBorder05 = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD + 1) _ + TimeSerial(0, 30, 0) 'テスト出力(イミディエイトウィンドウ) Debug.Print "01: " & Format$(datBorder01, "yyyy/mm/dd hh:mm:ss") Debug.Print "02: " & Format$(datBorder02, "yyyy/mm/dd hh:mm:ss") Debug.Print "03: " & Format$(datBorder03, "yyyy/mm/dd hh:mm:ss") Debug.Print "04: " & Format$(datBorder04, "yyyy/mm/dd hh:mm:ss") Debug.Print "05: " & Format$(datBorder05, "yyyy/mm/dd hh:mm:ss") '該当時間の取得 Set xlWorksheet = ThisWorkbook.Worksheets("Sheet1") datTarget = DateSerial(DATE_BASE_YYYY, DATE_BASE_MM, DATE_BASE_DD) _ + xlWorksheet.Range("$A$1").Value 'テスト出力(イミディエイトウィンドウ) Debug.Print "Ex: " & Format$(datTarget, "yyyy/mm/dd hh:mm:ss")

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

まずC列のデータ型が、日付型(時間)なのか文字列型(文字列)なのか 数値型(2430を書式設定で“24:30”に見せているなど)確認してください。 セルの書式が『日付』か『時刻』になっていれば日付型だと思って 良いです。 文字列型の場合は、比較のために日付型に変換する処理が必要です。 日付型の場合は、そのまま比較できますが、本来、日付型は 年月日時分秒が一体となっており、内部では数値データとして 処理されています。 時刻を入力(Ctrl + : など)したセルの書式を『日付』にする と“1900/1/0”と表示されたり、『数値』にすると“0.39166667” とか表示される事を確認してください。 年月日を意識して無いと、日またぎの比較。。。例えば“23:00” と“1:00”を比較したときに“23:00”>“1:00”となってしまいます。

関連するQ&A