前提・実現したいこと
【実施したいこと】
先週月曜日~今週月曜日までの8日間が対象ファイル内の日付に該当しているかをチェックしたい。
VBA初心者です。アクセスログの分析ツールを作成しております。(週一で分析)
ロジックが思い浮かばないため、皆様のお知恵をお貸しいただけますと幸いです。
・ファイル数は連休の場合も含み2~6個で、ファイル内の日付は全ファイル合わせて9日分ほどあり、分刻みで集計を行うため万単位のデータがあります。
・祝日など何もない通常の場合はファイルの中身は以下のようになっております。
1つめのファイル:先々週の土曜日の途中から、先々週の日曜日、先週の月曜日、先週の火曜日の途中まで
2つめのファイル:先週の火曜日の途中から、先週の水曜日の途中まで
3つめのファイル:先週の水曜日の途中から、先週の木曜日の途中まで
4つめのファイル:先週の木曜日の途中から、先週の金曜日の途中まで
5つめのファイル:先週の金曜日の途中から、先週の土曜日の途中まで
6つめのファイル:先週の土曜日の途中から、先週の日曜日、今週の月曜日、今週の火曜日の途中まで
しかし、連休や祝日があった場合はファイル数が変動し(出勤日にログファイルを取得するため)、それに伴いファイル内の曜日も上記とは異なってしまいます。
ファイル数が変動してもログは毎日記録されているので、例えばファイル数が3つしかない場合でも先週の月曜日~今週の月曜日の8日間は3ファイルの中に詰め込まれて存在します。
ファイル数とファイル内の曜日が固定ではないため、コードの組み方で苦戦しております。
「試したこと」に記載のコードを考えてみましたが、下記の点で詰まってしまいました。
・8日間全て見つかった場合はcount変数に「8」が入り、その結果でOKでもいいかもしれないが、全ファイルを参照するので無駄な作業が多い。
⇒該当した曜日があった場合、以降はその曜日チェックのみを飛ばしたい。
・該当しない曜日があった場合、「〇〇曜日はありませんでした。」とのメッセージを表示させるために「msg_(曜日)」変数へ格納する処理を入れているが、全ファイルを参照するためどこかのファイルで該当しない曜日があるのは当然。
全ファイルを参照した上で8日間に該当する日付がない場合、「〇〇曜日がありませんでした。」と表示するにはどのようにコードを組めばよいか。
以上となります。
find関数ではなく別の関数を使用した方が良い、根本的にコードの組み方がおかしい等、何かアドバイスいただけますと幸いです。
お手数をおかけいたしますが、よろしくお願いいたします。
試したこと
vba
1 2'型変換などあまり重要でない処理は省いております。 3 4Sub filecheck() 5 6Dim folderPath,filename As String 7Dim num,LastRow,i,count,x As Long 8Dim lastMonday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,thisMonday As date 9Dim msg_lastMonday, msg_Tuesday,msg_Wednesday,msg_Thursday,msg_Friday,msg_Saturday,msg_Sunday,msg_thisMonday As String 10Dim sh_act As Worksheet, sh_wrk As Worksheet 11 12 13 14folderPath = ThisWorkbook.Worksheets(1).Cells(4, 5) '「フォルダ選択」ボタンを押下し、選択されたディレクトリを「folderPath」へ格納する 15 16 17Set sh_act = ActiveSheet 18filename = Dir(folderPath & "*.xls") '拡張子が「.xls」のファイルをすべて取得する。 19 20 21lastMonday = ThisWorkbook.Worksheets(1).Cells(8, 5) '作業者が先週の月曜日をE8セルに入力し、その日付を「lastMonday」へ格納する 22 23 24Tuesday = DateAdd("d", 1, lastMonday) 'lastMonday2 + 1日後⇒先週の火曜日 25Wednesday = DateAdd("d", 2, lastMonday) 'lastMonday2 + 2日後⇒先週の水曜日 26Thursday = DateAdd("d", 3, lastMonday) 'lastMonday2 + 3日後⇒先週の水曜日 27'...今週の月曜日まで 28 29 count = 0 '日付が見つかった場合のカウント用 30 i = 0 'ループのカウント用 31 32 33Do While i < num '「num」は別途ファイル数チェックの戻り値です。(ファイル数分ループする) 34 35 Set sh_wrk = Workbooks.Open(folderPath & "\" & filename).Sheets(1) 'ファイルを開く 36 37 LastRow = sh_wrk.Range("A1").End(xlDown).Row 'ログファイルの最終行 38 39 i = i + 1 '何番目のブックか数える 40 x = 1 '行数カウント用 41 42 43 'ファイル内に「先週の月曜日の日付があるか」を検索する。 44 45 Set myRange = Range("A" & x & ":" & "A" & LastRow) 46 Set myObj = myRange.find(lastMonday, LookAt:=xlPart) 47 If myObj Is Nothing Then 48 msg_lastMonday = "'" & lastMonday & "'はありませんでした" 49 50 Else 51 count = count + 1 '「先週の月曜日」が見つかった場合、を変数「count」に1を足す 52 53 End If 54 55 'ファイル内に「先週の火曜日の日付があるか」を検索する。 56 57 Set myRange = Range("A" & x & ":" & "A" & LastRow) 58 Set myObj = myRange.find(Tuesday, LookAt:=xlPart) 59 60 If myObj Is Nothing Then 61 msg_Tuesday = "'" & Tuesday & "'はありませんでした" 62 63 Else 64 count = count + 1 '「先週の火曜日」が見つかった場合、を変数「count」に1を足す 65 66 67 '...今週の月曜日まで続きます。 68 69 70filename = Dir() 71 Loop 72 73End Sub 74 75

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/08 07:50