時刻のフィルタリングについて

添付のとおり、C列の[時間]の値で「21:00」を超過した人数
をカウントするにはどうすれば良いでしょうか。
FilterDataTableを使用してフィルタリングをかけようと思っても
他のフォーラムで記載されているとおり、数値に関しては
フィルタリングをかけることが出来なく0人と表示されてしまいます。
時刻のフィルタリングに関してご存知の方、ご教示ください。

少し、トリッキー(VB.NET文法)になってしまいますが、DataTableに一度読み込んで、LINQで処理するのが楽だと思います。
サンプルを作成したので、試してみてください。
TimeFilterSample.zip (6。8 キロバイト)

Risaさん
回答いただきありがとうございます。
教えていただいた方法で確かにカウントすることが出来ました!

ただ、私が今回示した添付例がいけなかったのですが
実際のデータは以下のとおり、1,2行目に氏名などが記載されており
このデータで試すと「時間」をDateTimeとして読み取れなくエラーとなってしまいます。
他の方法の方が良いのでしょうか。
%E6%B7%BB%E4%BB%98

@mac1さん
「範囲を読み込み」アクティビに開始セルを指定すれば、同じ方法でうまく取得できます。
image

1 Like

ui-path-exampleさん
回答いただきありがとうございます。
試してみます!

また、もう2点問題があるのですが
[時間]列の中に空白があったりしており、
その場合ですとエラーが返ってくる認識なのです。
空白を無視するといった動作は可能なのでしょうか。

2点目の問題としては、
Risaさんに例として教えていただいたxlsxファイルに記載されていた
[時間]表記はユーザー定義の「yyyy/m/d h:mm」でした。
本当のデータは添付しているとおり、「h:mm」の表記です。
この表記で実行するとDateTimeとして読み取れずエラーになってしまいます・・

ごめんなさい、日付型ではなく、時刻型だったのですね・・・。

Excelの時刻型は、0:00を0、24:00を1として、小数で管理しています。
この方法だと、21:00は0.875になります。
(これは、計算で出すか、Excelに時刻を入力したあと、セルのデータ型を「数値」等にすれば、小数に変換した値が確認できます。)

そこで、上のサンプルを少し応用して、カウントする部分を、

"21:00 超過は、" + workData.AsEnumerable.Where(Function(r) CType(r("時間").ToString(), Single) >0.875 ).Count.ToString() + "件"

と、してみてください。
Single型(桁数が少ない小数型)に変換して、値の比較で抽出できます。

1 Like

FilterDataTableを使用してフィルタリングをかけようと思っても
他のフォーラムで記載されているとおり、数値に関しては
フィルタリングをかけることが出来なく0人と表示されてしまいます。

とあったのですが、@risa さんの条件文を参考に>=0.875を入れた場合、FilterDataTableを使用したフィルタリングでも正常に動いているようです。
※認識違いがあるかも- -;
※studioは2019.7.0-beta.74 Community Editionで動作確認しています。バージョン違いとかもあるのでしょうか?

動かしてみたxamlとinputに使ったexcelファイルを添付します。
sample.zip (8。4 キロバイト)
※結果は想定通り2人となりました。

以上、ご参考まで。

1 Like

遅くなりました;
@Risa さんの方法(>=0.875を入れる)で想定通りの動きができました!
ありがとうございます。
確かに数値に関しては認識違いがあった様です;
サンプルファイルもありがとうございました。

1 Like

横から失礼します。こちらのExcel時刻型で引き算を行いたいときはどの様に対応した方が良いのでしょうか。Excel上の「休憩終了時間」- 「休憩開始時間」をして「休憩時間」を求めたい状態です

休憩開始時間:12:00
休憩終了時間: 13:00

休憩時間: 1:00

1 Like