Мне нужны некоторые указатели о том, как логически определить текущую дату, выполнить поиск обратно, чтобы найти первый файл с того понедельника (но с файлом пятницы), а затем вставить диапазон дат с этой недели в соответствующий ячейки рядом с скопированными данными.
Следующая функция выводит диапазон дат (в виде массива), начиная с Today
и возвращаясь к предыдущему понедельнику.
Option Explicit
Function dateStuff() As Date()
Dim lastMonday As Date
Dim arrDates() As Date
Dim I As Long
lastMonday = Date - Weekday(Date, vbMonday) + 1
ReDim arrDates(0 To Date - lastMonday)
For I = 0 To UBound(arrDates)
arrDates(I) = lastMonday + I
Next I
dateStuff = arrDates
End Function
Затем можно использовать выходные данные этой функции для создания имен для соответствующих рабочих книг.
Если я правильно понимаю, что вы делаете, не должно быть необходимости исключать праздники из этого списка. Поскольку у вас не будет сгенерированной рабочей книги для выходных, просто проверьте, существует ли рабочая книга, когда вы пытаетесь получить данные.
Вот процедура для помещения сгенерированного диапазона дат в некоторую ячейку. Вы можете узнать, как изменить rOutput
, чтобы отразить вашу реальную целевую ячейку. Это Sub
зависит от вышеуказанного Function
:
Sub insertDateRange()
Dim dateRange() As Date
Dim rOutput As Range
Set rOutput = Worksheets("sheet1").Range("B1")
dateRange = dateStuff
rOutput = dateRange(0) & " - " & dateRange(UBound(dateRange))
End Sub
Выполнить сегодня 27-Jun-2019
макрос выдаст 6/24/2019 - 6/27/2019
но вы можете использовать функцию Формат VBA для изменения формата вывода дат, если хотите.
EDIT:
Если открыть книги и обработать их, достаточно просто перебрать выходные данные функции dateStuff
, чтобы сгенерировать пути к книгам. например:
'This is where I want it to opens the last 5 days of workbooks from today's date including today e.g. Monday-Friday, report is always run on a Friday
Dim wbDates() As Date, Idx As Long
Dim wbDaily As Workbook, wbPath As String
wbDates = dateStuff 'wbDates now contains an array of the relevant dates
'This will open the workbooks one at a time and you can process them as you wish
'You should refer to this daily workbook as `wbDaily` or some other variable of your choice
For Idx = LBound(wbDates) To UBound(wbDates)
wbPath = "W:\Inventory\Inventory Support\3. Reporting\Daily\Daily Fails Report\Daily Fails Report " & Format(wbDates(Idx), "yyyy-mm-dd") & ".xlsb"
If Len(Dir(wbPath)) > 0 Then 'workbook exists
Set wbDaily = Workbooks.Open(wbPath)
'your code
'.....
wbDaily.Close
End If
Next Idx