Поиск листа в другой книге;Добавить лист, если не найдено совпадений - PullRequest
0 голосов
/ 24 августа 2018

ПРИМЕЧАНИЕ. Я недавно спрашивал об этом, но не получил необходимой помощи, поэтому снова спрашиваю с изменениями в вопросе и коде. Извините!

У меня есть МЕСЯЧНЫЕ данные по районам, территориям и периодам (период = месяц) в серии из примерно 500 рабочих книг. Для каждого округа существует МАСТЕРСКАЯ рабочая тетрадь с отдельными рабочими листами для каждой территории, обобщающими ежемесячные данные.

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

Однако нам необходим код для создания листа NEW Territory, если территория добавляется в ежемесячные файлы округа через некоторое время после первоначального создания книги MASTER округа.

Написанный код не работает, потому что (кажется) он неправильно оценивает текущее МЕСЯЦЕВОЕ название территории по ВСЕМ возможным именам рабочей таблицы MASTER. Если совпадение найдено, оно должно скопировать, вставить, закрыть ежемесячный файл и перейти к следующему ЕЖЕМЕСЯЧНОМУ файлу. Если совпадения не найдены, он должен создать новый лист, скопировать, вставить, закрыть ежемесячный файл и перейти к следующему ЕЖЕМЕСЯЧНОМУ файлу. Любые предложения по исправлению этого?

Sub DSMReportsP02 ()

Dim DistrictDSM As Range, DistrictsDSMList As Range
Dim Period As String, Path As String, DistPeriodFile As String, Territory As String
Dim YYYY As Variant
Dim WBMaster As Workbook, DistMaster As Workbook, CurDstTerrFile As Workbook
Dim wsFind As Worksheet, SheetXXX As Worksheet
Dim wsCount As Integer, x As Integer
Set WBMaster = ActiveWorkbook
Period = Range("C6").Value
YYYY = Range("C8").Value

Set DistrictsDSMList = Range("E11:E" & Cells(Rows.Count, "E").End(xlUp).Row)

For Each DistrictDSM In DistrictsDSMList.Cells
    Workbooks.Open Filename:="H:\Accounting\Monthend " & YYYY & "\DSM Files\DSM Master Reports\" & DistrictDSM & ".xlsx"
    Set DistMaster = ActiveWorkbook
    wsCount = Application.Sheets.Count
    Path = "H:\Accounting\Monthend " & YYYY & "\DSM Files\" & DistrictDSM & "\P02"
    DistPeriodFile = Dir(Path & "\*.xlsx")

   Do While DistPeriodFile <> ""
        Workbooks.Open Filename:=Path & "\" & DistPeriodFile, UpdateLinks:=False
        DistPeriodFile = Dir
        Set CurDstTerrFile = ActiveWorkbook
        Territory = CurDstTerrFile.Sheets("Index").Range("A3").Value

        For x = 1 To wsCount
         If DistMaster.Worksheets(x).name = Territory Then
          CurDstTerrFile.Sheets("Index").Range("F20").Copy 'PM
          DistMaster.Sheets(Territory).Activate
             Range("C3").PasteSpecial Paste:=xlPasteValues
         End If

         If DistMaster.Worksheets(x).name <> Territory Then
          CurDstTerrFile.Sheets("Index").Range("F20").Copy 'PM
          WBMaster.Sheets("ReptTemplate").Activate
             Range("C3").PasteSpecial Paste:=xlPasteValues
          WBMaster.Sheets("ReptTemplate").Copy after:=DistMaster.Sheets(DistMaster.Sheets.Count)
          DistMaster.Sheets("ReptTemplate").name = DistMaster.Sheets("ReptTemplate").Range("A1").Value
         End If
        CurDstTerrFile.Close
        Next x
    Loop
  Next DistrictDSM
End Sub

1 Ответ

0 голосов
/ 24 августа 2018

Я полагаю, что следующее будет делать то, что вы ожидаете, возможно, стоит отметить, что полная квалификация ваших диапазонов рекомендуется особенно при работе с различными рабочими книгами / листами, чтобы не путать код при обращении к ActiveSheet, поэтому ядополнительно внесет изменения в код, чтобы убедиться, что каждый диапазон указывает на нужную книгу / рабочий лист:

Sub DSMReportsP02()
Dim DistrictDSM As Range, DistrictsDSMList As Range
Dim Path As String, DistPeriodFile As String, Territory As String, YYYY As String
Dim WBMaster As Workbook, DistMaster As Workbook, CurDstTerrFile As Workbook
Dim wsCount As Integer, x As Integer
Dim FoundFlag As Boolean
Set WBMaster = ThisWorkbook
Period = Range("C6").Value
YYYY = Range("C8").Value
FoundFlag = False

Application.ScreenUpdating = False
    Set DistrictsDSMList = Range("E11:E" & Cells(Rows.Count, "E").End(xlUp).Row)

    For Each DistrictDSM In DistrictsDSMList.Cells
        Set DistMaster = Workbooks.Open("H:\Accounting\Monthend " & YYYY & "\DSM Files\DSM Master Reports\" & DistrictDSM & ".xlsx")
        wsCount = DistMaster.Sheets.Count
        Path = "H:\Accounting\Monthend " & YYYY & "\DSM Files\" & DistrictDSM & "\P02"
        DistPeriodFile = Dir(Path & "\*.xlsx")

        Do While DistPeriodFile <> ""
            Set CurDstTerrFile = Workbooks.Open(Path & "\" & DistPeriodFile)
            DistPeriodFile = Dir
            Territory = CurDstTerrFile.Sheets("Index").Range("A3").Value

            For x = 1 To wsCount
                If DistMaster.Worksheets(x).Name = Territory Then
                    FoundFlag = True 'set flag to found if worksheet found
                    DistMaster.Sheets(Territory).Range("C3").Value = CurDstTerrFile.Sheets("Index").Range("F20").Value 'PM
                End If
            Next x
            If FoundFlag = False Then 'if worksheet not found then add it
                WBMaster.Sheets("ReptTemplate").Range("C3").Value = CurDstTerrFile.Sheets("Index").Range("F20").Value 'PM
                WBMaster.Sheets("ReptTemplate").Copy After:=DistMaster.Sheets(DistMaster.Sheets.Count)
                DistMaster.Sheets("ReptTemplate").Name = DistMaster.Sheets("ReptTemplate").Range("A1").Value
            End If
            CurDstTerrFile.Close
            FoundFlag = False 'reset the flag before next iteration of the loop
        Loop
    Next DistrictDSM
Application.ScreenUpdating = True
End Sub
...