У меня есть ежемесячные отчеты, и каждый месяц у них есть определенное шаблонное название. Например, «Визуальный отчет за ноябрь 2017 года», «Визуальный отчет за декабрь 2017 года» и так далее ... И в моем макросе мне нужно использовать 2 отчета, и для меня очень важно, какой из них является предыдущим. месяц и какой из этого месяца.
Итак, я составил таблицу с возможными названиями отчетов для каждого месяца в столбце A с «Визуальным отчетом для ..», а также с названием месяца и годами в столбце B, и я просматриваю эти ячейки и ищу файл с этим именем в папке (Должно быть всего 2 файла. В этом месяце и в предыдущем.
Моя проблема в том, что переменные месяца и года меняются после открытия второй книги, и я не могу скопировать данные из первой книги, потому что он устанавливает путь ко второй. Если у кого-то есть идеи, как можно по-другому назвать первую рабочую тетрадь, буду признателен.
here is my code:
Sub Main()
Call initialize
Call name_workbook
End Sub
Sub initialize()
Set MainWB = ThisWorkbook
Path = ThisWorkbook.Path
Set empWS = MainWB.Worksheets("emp")
Set sigilWS = MainWB.Worksheets("sigil")
Set centerWS = MainWB.Worksheets("center)
Set ListsWS = MainWB.Worksheets("Lists")
ListsLR = ListsWS.Cells(Rows.Count, "A").End(xlUp).Row
End Sub
Вот основной цикл, о котором я говорил:
Sub name_workbook()
'clear old data
centerWS.Cells.Clear
empWS.Cells.Clear
sigilWS.Cells.Clear
'look for files in the folder and name them
For j = 1 To 3
For i = 2 To ListsLR
year = ListsWS.Cells(i, 2).Value
month = ListsWS.Cells(i, 1).Value
FName = month & " " & year
SecondPath = Dir(Path & "\" & FName & ".*xlsx*")
If SecondPath <> "" Then
j = j + 1
If j = 2 Then
Set preWB = Workbooks.Open(Path & "\" & SecondPath)
Else
Set nextWB = Workbooks.Open(Path & "\" & SecondPath)
End If
If j = 3 Then Exit For
End If
Next i
Next j
End Sub
2 ответа
Вот как я бы сделал это в качестве примера, если бы вы смотрели на текущий месяц и предыдущий месяц во время выполнения.
Sub Test()
Dim strPrevWB As String
Dim strNextWB As String
strPrevWB = "Visual report for " & Format(Application.EoMonth(Date, -1), "mmmm yyyy")
strNextWB = "Visual report for " & Format(Date, "mmmm yyyy")
Debug.Print strPrevWB & "--" & strNextWB
End Sub
Это также можно использовать для расчета любой комбинации месяцев, как показано ниже, которую вы можете ввести в цикл для изменения переменной dtReport
.
Sub Test2()
Dim strPrevWB As String
Dim strNextWB As String
Dim dtReport As Date
dtReport = DateValue("31/08/2017")
strPrevWB = "Visual report for " & Format(Application.EoMonth(dtReport, -1), "mmmm yyyy")
strNextWB = "Visual report for " & Format(dtReport, "mmmm yyyy")
Debug.Print strPrevWB & "--" & strNextWB
End Sub
Hth ,
Если отчеты уже названы, я бы создал функцию для анализа даты из FileName.
Function getWorkbookDate(FileName As String) As Date
getWorkbookDate = DateValue(Replace(FileName, "Visual report for ", ""))
End Function
Затем вы можете определить, какая из книг является какой, проверив, какая дата больше.
Sub SimpleExample()
Const Path = "C:\"
Dim FileNames(1) As String
FileNames(0) = "Visual report for December 2017"
FileNames(1) = "Visual report for November 2017"
If getWorkbookDate(FileNames(0)) > getWorkbookDate(FileNames(1)) Then
Set nextWB = Workbooks.Open(Path & "\" & FileNames(1))
Set preWB = Workbooks.Open(Path & "\" & FileNames(0))
Else
Set nextWB = Workbooks.Open(Path & "\" & FileNames(0))
Set preWB = Workbooks.Open(Path & "\" & FileNames(1))
End If
End Sub
Если у вас было несколько книг, вы можете отсортировать даты, чтобы определить, какие книги старше. Здесь я использую SortedList, чтобы поместить книги в коллекцию, отсортированную по дате по возрастанию.
Sub SortedList_Example()
Const Path = "C:\"
Dim x As Long
Dim FileNames(5) As String
Dim WBList As Object, item As Variant
Set WBList = CreateObject("System.Collections.SortedList")
FileNames(0) = "Visual report for July 2017"
FileNames(1) = "Visual report for November 2016"
FileNames(2) = "Visual report for September 2016"
FileNames(3) = "Visual report for November 2017"
FileNames(4) = "Visual report for January 2016"
FileNames(5) = "Visual report for October 2017"
For Each item In FileNames
WBList.Add getWorkbookDate(CStr(item)), Workbooks.Open(Path & "\" & item)
Next
For x = 0 To WBList.Count - 1
Debug.Print WBList.GetKey(x), WBList.GetByIndex(x).Name
Next
End Sub
Похожие вопросы
Новые вопросы
excel
Только для вопросов по программированию для объектов или файлов Excel или для разработки сложных формул. Вы можете объединить тег Excel с VBA, VSTO, C #, VB.NET, PowerShell, OLE-автоматизацией и другими тегами и вопросами, связанными с программированием, если это применимо. Общая помощь по MS Excel для функций одного листа доступна в Super User.