プロが教える店舗&オフィスのセキュリティ対策術

添付画像のような時間の表があるとき
8:40~17:05までの時間の中で
抜けている時間を取得したいです。


9:30~10:00までが抜けいる
ユーザーフォームのテキストバボックス1に9:30
テキストボックス2に10:00 といった感じです。

同じように13:30~14:45までが抜けている
テキストボックス3に13:30 テキストボックス4に14:45

同じように16:30~17:00までが抜けている
テキストボックス5に16:30 テキストボックス6に17:00

ただし、11:25~12:20は抜けていても取得の必要はありません(必ず抜ける部分)

もしこのような動作が可能であればご教示をお願いいたします。

「エクセルVBA 時間抜けの取得」の質問画像

A 回答 (2件)

こんにちは



>もしこのような動作が可能であればご教示をお願いいたします
もちろん可能でしょう。

以下に、例として考え方を2つ挙げておきます。
(他にもいろいろあるとは思いますけれど…)

◇方法1 ごく簡単な方法として作業列を利用する方法
(あまりやる人はいないかも知れませんけれど、考える必要がないので簡単です)

単位時間(例えば1分)を1セルとして、作業列の各セルを8:40~17:05に対応させておきます。
(1分単位なら、505行分のセル)
ご提示の時間帯に相当するセルを、順にマーキングしてゆきます。
(マーキングは、「〇」などを記入しても良いし、色塗りとかでも良い)
全部の時間帯をマーキングしたら、空白セルで残っている時間帯が求める時間帯になっています。
(11:25~12:20を除くのなら、あらかじめそこにもマーキングしておけば良いです)


◇方法2 普通に時間帯を計算する方法
連続する時間帯を表すのに(開始時刻、終了時刻)の二つの時刻で表すものとします。
全体の時間帯(仮にAとする)から除きたい時間帯群B(=ご提示の表の時間帯群)を順に除いて行って、残った時間帯が求める時間帯になると考えられます。

時間帯Aとb(=時間帯群のうちの一つの時間帯)を比較した場合に起こり得る関係は以下の4種類です。
 ①Aとbには重複部分はない
 ②Aにbが完全に含まれる
 ③Aがbに完全に含まれる
 ④Aとbは一部分で重複する

それぞれの場合に、以下の処理を行うものとします。
 ①’なにもしない
 ②'Aからbを除いた2つの時間帯a1、a2にAを分ける
 ③'Aは(全部除かれるので)消滅する
 ④'Aを重複部分を除いた時間帯に再定義する

これをBの数だけループすれば、結果として求める時間帯が得られることがわかると思います。
②'の処理を考慮すると、あらかじめAの時間帯は可変の配列として考えておいた方が便利で、昼の時間を除くのなら、(8:40~11:25)、(12:20~17:05)の2つの時間帯からスタートすれば良いことになります。
(一つの時間帯で初めて、最後に、11:25~12:20を除いても同じ結果になるでしょう)

文章で書くと長いですけれど、基本的には上記の①~④を判定して、①'~④'の処理を記述できれば、後はそれをループさせれば良いだけになります。
Aの時間帯も複数で、Bの時間帯群も複数なので、それぞれを順に2重のループで処理すれば良いことになるでしょう。(数が変わる可能性のあるAのループを内側にしておいた方がよさそうに思います)
    • good
    • 2
この回答へのお礼

頂いたアドバイスをもとにコードを組んでみます。
大変参考になりました。
ありがとうございました。

お礼日時:2021/09/07 15:51

ごめんよ。


と、先に謝っておきます。

まずはどうやって、時間が連続していない事を確認するかという
 アルゴリズム 
を考えるようにしましょう。

VBAってプログラムなんです。
Visual Basic for Application という Vidual Basic 系 のプログラム言語なんですね。
そんなわけで、まずは問題を解くための手順を考える必要があります。

質問者さんが手作業でその処理を行うときの手順を1ステップずつ書き出してみましょう。
その手順をそっくりそのままプログラムにすれば良いのです。
そのうえで分からない点をピンポイントで質問すると良いでしょう。
例:
 「手作業でもできないのでアルゴリズムなんて無理。手順を教えてください。」
 「時間の比較のしかたが分かりません。1つ目のデータと他のデータを比較する方法を教えてください。」
…等。

・・・

「そんなことどうでも良いから、今すぐ使えるコードを寄こせ」
という事であれば、有料サイトで代価を支払って制作委託することをお勧めします。
ここは「代わりに作ってくれる」場所ではなく「自分で作るために必要なアドバイスを受ける」場所なんです。


・・・余談・・・

基本的な事を聞きたい人にはコードの例をあげて回答することもあります。
たまたまその例が質問に対する直接の回答であることもある。
たまたまですよ。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!