質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

336閲覧

【vba】時間の識別について

satomori

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/05/16 08:01

前提・実現したいこと

ファイル内から「先週の月曜日の6:00以上から今週の月曜日の5:59以下まで」を集計したい。
(5時と17時を識別させたい。)

現在、万単位のアクセスログデータ集計を行っております。
ファイル数は可変で2~6個あり(変数numにファイル数を格納)上記処理は最終ファイルでの処理となります。

また、集計対象のデータ形式は以下の通りとなります。

(例)
A列             B列    C列     D列    E列
2019/2/18 17:58:00  項目A   項目B   項目C   項目D
2019/2/18 17:58:09  項目A   項目B   項目C   項目D
2019/2/18 17:59:03  項目A   項目B   項目C   項目D



こちらの形式が何万件と続きます。

発生している問題・エラーメッセージ

今回発生している問題は、「今週の月曜日の5:59以下まで」の処理となります。
「5:59」以前のデータを集計対象としたいのですが、逆から検索しているせいか【「17:59」以前のデータ】で引っかかってしまい、希望とは異なる「先週の月曜日の6:00以上から今週の月曜日の17:59以下」までが集計されてしまいます。

「5:59」が存在しない場合は「5:58」までと、どんどん遡っていくため、上から検索するのは難しいのではないかと思っております。
「17時欄」が引っかからない良い解決策があれば教えていただけますと幸いです。
お手数をお掛けいたしますがよろしくお願いいたします。

該当のソースコード

vba

1 2'> ■ 最終ファイルの処理 ■ 3 ElseIf i = num Then 4 x = 1 5 6 '>ファイル内から「今週の月曜日」を検索する。 7 Set myRange = Range("A" & x & ":" & "A" & LastRow) 8 Set myObj = myRange.find(thisMonday, LookAt:=xlPart, SearchDirection:=xlPrevious) '逆検索 9 10       If myObj Is Nothing Then 11 MsgBox "'" & thisMonday & "'はありませんでした" 12 Exit Sub 13 Else 14 x = myObj.Row '逆から検索し、今週の月曜日が見つかった行数を変数xへ格納 15 16        '>ファイル内から「今週の月曜日」の「5:59以前」を検索する。 17 Set myRange = Range("A" & x & ":" & "A2") 18 Set myObj = myRange.find(" 5:5?", LookAt:=xlPart, SearchDirection:=xlPrevious) 19 20          If myObj Is Nothing Then 21 MsgBox "'" & "5:59以前" & "'はありませんでした" 22 Exit Sub 23 Else 24 25            x = myObj.Row '5:59以前が見つかった行数を変数xへ格納 26 sh_wrk.Range("A2" & ":" & "E" & x).Copy 27 ThisWorkbook.Worksheets("貼り付け用").Range("A" & this_lastRow).PasteSpecial Paste:=xlPasteAll 28 Application.DisplayAlerts = False 29 Workbooks(csvname).Close 30 Application.DisplayAlerts = True 31 End If 32 End If 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この手の時間比較は6:00未満かという比較が正しい方法です。
残念ながらFindでは大小比較はできないようですので、面倒ですが最終行から順に見ていく方法を提示しておきます。
見つからないときなどの処理は入れていませんので、あとはカスタマイズしてください。

VBA

1 '>ファイル内から「今週の月曜日」の「5:59以前」を検索する。 2 'Set myRange = Range("A" & x & ":" & "A2") ←この行削除 3 findrow = 0 4 For r = x To 2 Step -1 5 If TimeValue(Cells(r, 1)) < TimeValue("6:00") Then 6 Debug.Print "6時未満の行=" & r 7 findrow = r 8 Exit For 9 End If 10 Next 11   If findrow = 0 Then 12 MsgBox "'" & "5:59以前" & "'はありませんでした" 13 Exit Sub 14 Else 15 16以下略

投稿2019/05/16 08:31

編集2019/05/17 06:03
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moririn

2019/05/16 11:23

迅速にご回答くださりありがとうございます。 理解力が無いためまだあまり理解出来ておりませんが、記載していただいたコードで修正してみます。
ttyp03

2019/05/17 06:03

すみません、検索する時間をなぜか18:00と書いてしまっていました。 正しくは6:00ですね。 修正しておきました。
ttyp03

2019/05/17 06:07

少し解説しておきますと、文字列で"5:59"などと比較すると、既知の通り"15:59"などもマッチしてしまうので、その対策としてシリアル値に変換してから比較しています。 あとは6:00未満で比較することで、5:59でも5:58でも5:57でも(つまり0:00~5:59)マッチするようにしています。
satomori

2019/05/20 06:37

ttyp03様 ご回答いただいていたことに気付かず返信が遅れてしまい申し訳ございません。 ご丁寧に具体的なコードを記述してくださってありがとうございます。 試させていただきます。
guest

0

Findメソッドは、結構日付の検索で躓く人が多いです。

日付が入っているセルの中身は実際は数値ですので、
Match関数を使ってみてはいかがでしょう?

データが昇順に並んでいるようなので、
3つめの引数、照合の型を1で検索すると、
ぴったりの数値が無くても検索できます。
ただし、上の数値か下の数値かが1個ずれることがあるので、
セルの位置を微調整してやる必要があります。

または、オートフィルターの機能で、抽出することも可能でしょう。

検索機能(Findメソッド)の使用は今回の件の場合不向きなので、
他のやり方を模索してみてください。
こちらは、万単位のデータは扱うことが無いので、
処理速度についてどの方法はよいのかはわかりません。
まずは、手動でいろいろ試してみて、
欲しい結果が得られることを確認してみてください。

投稿2019/05/16 12:20

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satomori

2019/05/17 01:51

ご丁寧にご回答くださりありがとうございます。 Match関数かオートフィルターでも可能なのですね。 色々試してみます。
ttyp03

2019/05/20 06:35

どのように解決されたのか記入していただけると、(自分も含め)他の人の参考になるのでお願いします。
satomori

2019/05/21 01:44

ttyp03様 失礼いたしました。次回より留意いたします。 コードを記述してくださっていたので先にttyp03様の方法を試させていただき、 ご回答くださったTimeValue関数で解決いたしました。 ttyp03様のご回答を拝見する前にベストアンサーを押してしまったので選び直させていただきました。 お二方にはご丁寧で具体的なご回答をくださり本当に感謝しております。 Match関数も気になっているので時間がある際にコード作成してみたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問