Возьмите сводку значений ячеек за последние 5 дней рабочих книг в одну рабочую книгу. - PullRequest
0 голосов
/ 27 июня 2019

У меня есть требование, чтобы один раз в неделю в пятницу мне нужно было извлекать некоторые данные из рабочих книг, генерируемых каждый день недели (понедельник-пятница), в еженедельную сводку с датой в новой рабочей книге. Новая рабочая книга должна представлять собой совокупное представление каждой недели с автоматически заполненной датой в пятницу, когда данные вставляются в сводный лист.

Мне нужны некоторые указатели о том, как логически определить текущую дату, выполнить поиск обратно, чтобы найти первый файл с того понедельника (кроме файла пятницы), а затем вставить диапазон дат с этой недели в соответствующие ячейки рядом с скопированные данные.

Я нашел различные посты от других, желающих сделать что-то подобное, и я попытался начать работать на этой основе, чтобы создать то, что я хочу, чтобы это делалось. Тем не менее, я не обучаюсь VBA, поэтому я стараюсь делать все как можно лучше. Ниже приведен код, который я написал, который в настоящее время просто открывает последний файл в каталоге. У меня также есть отдельная вкладка с праздничными днями, которую я хочу учитывать при запуске макроса. Очевидно, что мне многое предстоит сделать, я был бы признателен за любые советы и указания на то, что я должен попробовать.

Sub WeeklyUpdate()

Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Long
Dim lDestLastRow As Long
Dim LastPreviousWorkday As Date

'date format to use and where to lookup the bank holidays
LastPreviousWorkday = Application.WorksheetFunction.WorkDay(Date, -1)
LastPreviousWorkday = Format$(LastPreviousWorkday, ("yyyy-mm-dd"))
LastPreviousWorkday = Application.WorksheetFunction.WorkDay(Date, -1, Worksheets("PublicHolidays").Range("A:A"))

'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
Workbooks.Open "W:\Inventory\Inventory Support\3. Reporting\Daily\Daily Fails Report\Daily Fails Report " & Format(Date, "yyyy-mm-dd") & ".xlsb"

  'Set variables for copy and destination sheets
  Set wsCopy = Workbooks("Daily Fails Report 2019-06-26.xlsb").Worksheets("Daily Fails Report (National)")
  Set wsDest = Workbooks("Weekly Issues Summary.xlsb").Worksheets("CurrentPeriodSummary")

'Find last used row in the copy range based on data in column O
  lCopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "O").End(xlUp).Row

'Find first blank row in the destination range based on data in column B
'Offset property moves down 1 row to exclude headers
 lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "B").End(xlUp).Offset(1).Row


'Copy data range excluding the grand total which is always the last row (so use -1 to select the last row above it) & Paste Data into Summary
  wsCopy.Range("O9:Q" & lCopyLastRow - 1).Copy _
    wsDest.Range("B" & lDestLastRow)


End Sub

Я ожидаю, что в результате вышеперечисленного будет обновлена ​​моя сводная рабочая книга с пятью строками данных в неделю с датой против каждой, которая соответствует дате в имени файла.

1 Ответ

0 голосов
/ 27 июня 2019

Мне нужны некоторые указатели о том, как логически определить текущую дату, выполнить поиск обратно, чтобы найти первый файл с того понедельника (но с файлом пятницы), а затем вставить диапазон дат с этой недели в соответствующий ячейки рядом с скопированными данными.

Следующая функция выводит диапазон дат (в виде массива), начиная с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...