У меня есть ежемесячные отчеты, и каждый месяц у них есть определенное шаблонное название. Например, «Визуальный отчет за ноябрь 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
0
Rafael Osipov 31 Дек 2017 в 13:31

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 ,

1
shrivallabha.redij 31 Дек 2017 в 12:05

Если отчеты уже названы, я бы создал функцию для анализа даты из 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

enter image description here

1
user6432984user6432984 31 Дек 2017 в 12:23