Access2007です。
よろしくお願いします。
下記のようなレコードが複数あります。
予定日 コード 氏名 開始時間 終了時間
2013/03/01 1111 AAA 09:00 10:00
2013/03/01 1111 AAA 13:00 14:00
2013/03/01 1111 AAA 08:40 09:00
上記以外にも複数日、複数人います。時間は08:40から18:00までの間で存在します。
ほしい結果は、2013/03/01のAAAの空き時間です。
何時から何時まであいていて、その時間は何分です、というような答えが欲しいのです。
その際、12:00から13:00の時間は除きます。
基本VBAを使用して作成しています。
何らかのヒントでもいただければと思います。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
はい。
そのつもりで回答しました。結果や如何に?
※時間が重複している場合は考えてません
2013/03/01 1111 AAA 09:00 10:00
↓AAAさんが掛け持ちで何かやっている場合など
2013/03/01 1111 AAA 09:00 10:00
2013/03/01 1111 AAA 09:00 09:30
その他、未入力の場合など。
12~13時の処理ですが
前回回答では、8:40 ~18:00で考えてましたが
8:40 ~ 12:00 と 13:00 ~ 18:00 に分けて
Where 終了時間 >= #12:00#
Where 開始時間 <= #13:00#
の二つのレコードセットでそれぞれ処理すれば良さそうです。
ただ、昼食時間をまたがっている場合があると・・・没。
2013/03/01 1111 AAA 11:00 13:30
もっと洗練された考え方が有るような気がします。
ご回答ありがとうございます。
またご連絡が遅くなり申し訳ありません。
同時進行で他のものも作成しておりましたもので・・・。
おかげさまで空き時間が取得できましたので、まずは一つ解決しました。
昼食時間もアドバイスの感じで二つにわければよさそうです。
ただ、他にも条件がありますのでクリアしなければいけませんが、
ご教示いただいた内容でだいぶ感じがつかめましたので、
なんとかなりそうです。
本当に助かりました。ありがとうございました。
また何かありましたらよろしくお願いします。
No.3
- 回答日時:
変てこな考えかも(処理性能は考えてませんので・・・)
除外する・・・これは結構厄介なものと思います。
タイムスライスして、ある・ない・・・で結果を得ても良いのかも
フィールド「時刻」(日付/時刻型:主キー)のみのテーブル「T時刻」を作り、
0:00 ~ 23:59 までのデータを入れておきます。(60 * 24 = 1440 レコード)
この「T時刻」を基準に、対象者の予定日と開始時間、終了時間を結び付けて、
その結果、結びついていない時刻をグルグルとみて、空きの開始、終了を処理すれば・・・
元テーブル名を★★と仮定すると
SELECT Q1.時刻
FROM T時刻 AS Q1 LEFT JOIN
(SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2
ON (Q1.時刻 Between Q2.開始時間 AND Q2.終了時間)
WHERE
(Q2.氏名 Is Null) AND
((Q1.時刻 Between #8:40# AND #12:00#) OR (Q1.時刻 Between #13:00# AND #18:00#));
の様な感じで・・・・
得られる結果は、10:01 ~ 12:00 の 120レコードと 14:01 ~ 18:00 の240レコード
全体で 360レコードになるので、360分空いている事がわかります。
ただ、注意しないといけないのは、時刻の境目・・・・
例えば、上記の空きで 15:00 ~ 15:30 を予定に入れたら、
14:01 ~ 14:59、15:31 ~ 18:00 に分かれます。
ということは、レコード数=分 ではなくなる?
そこで、開始と終了の時刻が重ならないように、終了の方を1分前にします。
SELECT Q1.時刻
FROM T時刻 AS Q1 LEFT JOIN
(SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2
ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間))
WHERE
(Q2.氏名 Is Null) AND
((Q1.時刻 Between #8:40# AND #11:59#) OR (Q1.時刻 Between #13:00# AND #17:59#));
これで得られる結果は、10:00 ~ 11:59 の 120レコードと 14:00 ~ 17:59 の240レコード
上記の空きで 15:00 ~ 15:30 を予定に入れたら、
14:00 ~ 14:59、15:30 ~ 17:59 に分かれます。
(レコード数=分 でしょうか)
(Q1.時刻 Between #8:40# AND #11:59#) は、
(Q1.時刻 >= #8:40# AND Q1.時刻 < #12:00#) の方が考えやすい/指定しやすいかも・・・
上記を指定して Recordset を得て、グルグル回して、時刻差が 1 分でなかったら
開始の時刻はそのまま・・・
終了の方は1分加算・・・・
で、求まっていくと思います。
空きの時間帯が複数あっても、グルグル回る時の処理を考えれば良いと思います。
また、どんな時間帯で登録されていようが、求まったものを処理するだけです。
※
上記では 1分間隔で「T時刻」内を作成していましたが、入力が 10分単位とかなら、
登録しておく「時刻」も 10分間隔で良いと思います。
グルグル回る時には、時刻差が 10分でなかったら・・・・とか
※ 上記記述をクエリとして作成した場合
保存・閉じた後、再度SQLビューで覗くと
ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間))
部分は
ON Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間)
の様に ( ) が外れます。
編集等しなければ何も影響ありませんが、編集した後保存しようとするとエラーになります。
その時には、消えた ( ) を付け直してください。
(何故なのか・・・・わかりません)
※ 冒頭でも記述しましたが、処理性能は考えてませんので・・・
ご回答ありがとうございます。
タイムテーブルは考えてなかったですね~。
予定を入力するフォームは5分刻みなので、その間隔で作成しておく
ということですね。
ただご指摘の通り、処理能力がどうかというところですね。
空き時間を求めて予定を登録するのですが、実はそこに来るまでにも
少しぐるぐる回る処理をしていまして、使用者に遅いと思われないような
くらいならOKですが、ちょっとやってみないと、ですね。
いろいろとたくさん考えていただきましてありがとうございます。
次への経路も見えて助かりました。
ちょくちょく息詰まりますので、また何かありましたらよろしくお願いします。
No.1
- 回答日時:
途中までですが・・・
昼食時間を抜く処理が・・・
例示された場合だけです・・・。
Sub b()
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Const tS As Date = #8:40:00 AM#
Const tE As Date = #6:00:00 PM#
Dim tT As Date
Dim Ary() As Variant
Dim i As Integer
Set DB = CurrentDb
Set RS = DB.OpenRecordset("SELECT 予定日, [コード], 氏名, 開始時間, 終了時間 FROM New1 ORDER BY 開始時間", dbOpenSnapshot)
tT = tS
Do Until RS.EOF
If tT < RS!開始時間 Then
ReDim Preserve Ary(i)
Ary(i) = tT & " - " & RS!開始時間 _
& " 空き時間=" & CDate(tT - RS!開始時間)
i = i + 1
End If
tT = RS!終了時間
RS.MoveNext
Loop
If tT < tE Then
ReDim Preserve Ary(i)
Ary(i) = tT & " - " & tE _
& " 空き時間=" & CDate(tT - tE)
i = i + 1
End If
For i = 0 To UBound(Ary)
Debug.Print Ary(i)
Next
End Sub
nicotinism 様
ご回答ありがとうございます。
また返信がおそくなりましてすいません。
ご教示いただいた内容ですと、一番最初の開始時間と08:40の差、
次に終了時間と次の予定の開始時間の差、、、と続いて、そして最後の予定の終了時間と18:00の差を
求めればいい。
これに昼食時間を除く処理をかけばいい。
というふうに解釈しましたが、よろしいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- 物理学 時間を語るなら、(複数の時間の正体)を知る必要が有る。 1 2023/02/16 22:14
- その他(Microsoft Office) outlook vba 予定表 3 2022/11/20 14:51
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- Excel(エクセル) 指定した値以上の中で最小値を出したい 7 2022/10/24 21:12
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
差込印刷で顧客別に複数行のデ...
-
アクセスデータベースのUnicode...
-
ACCESSのレコード操作で1つ前...
-
ADOで現在のレコードの次のレコ...
-
ファイルメーカーで最大シリア...
-
ACCESSのフォームで次のレコー...
-
ACCESSで空白行を追加
-
ACCESSでオフセットを求める方法
-
ラベルをクリックしてレコード...
-
ファイルメーカーで一括入力す...
-
ファイルメーカー印刷時の改ページ
-
Accessのレポートの集計に条件...
-
日付の加算・減算ってできますか?
-
ファイルメーカーで関連レコー...
-
ホスト汎用機でのNDBアクセス方法
-
アクセスにて、更新の処理を..
-
ファイルメーカーの画像のリン...
-
Docmd.Findrecordで空白の検索方法
-
Accessフォーム上でレコードご...
-
アクセスで入力したデータの順...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
差込印刷で顧客別に複数行のデ...
-
ACCESSのフォームで次のレコー...
-
ADOで現在のレコードの次のレコ...
-
180g重量版レコードとは? 180...
-
Accessのレポートの集計に条件...
-
ACCESSのレコード操作で1つ前...
-
accessのマクロで「一時変数設定」
-
ファイルメーカーで最大シリア...
-
Accessで最終レコードの削除に...
-
アクセスデータベースのUnicode...
-
日付の加算・減算ってできますか?
-
PSQLで-- More --を表示しない方法
-
ACCESSでのランダムのレ...
-
LIKEとINを同時に使いたい
-
アクセスでのエクセルでいう行...
-
ACCESSでオフセットを求める方法
-
access レポートで罫線...
-
ファイルメーカーで一括入力す...
-
ファイルメーカープロでレコー...
-
レコードセレクタ、移動ボタン...
おすすめ情報