Vba 环路及;在单独的WKBK中搜索匹配的工作表;如果未找到匹配项,则添加Wksht

Vba 环路及;在单独的WKBK中搜索匹配的工作表;如果未找到匹配项,则添加Wksht,vba,excel,Vba,Excel,我有一系列按地区、地区和时期划分的工作手册,其中包含地区、地区和时期组合的每月销售数据。每个地区都有一份主工作簿,其中包含每个地区的单独工作表。每月数据显示在列B:M中 我需要打开每个月度地区、地区和期间文件,打开相应地区的主工作簿,搜索相应地区,并将该月的数据粘贴到与该月相关的列中(例如,2月数据粘贴到C列)。然后关闭月度文件并循环到下一个月度文件 然而,我需要有一个代码,以便在年中,在一个地区的主工作簿最初创建之后的某个时间,向该地区添加一个新的地区 编写的循环希望从打开的每月文件跳转到将创

我有一系列按地区、地区和时期划分的工作手册,其中包含地区、地区和时期组合的每月销售数据。每个地区都有一份主工作簿,其中包含每个地区的单独工作表。每月数据显示在列
B:M

我需要打开每个月度地区、地区和期间文件,打开相应地区的主工作簿,搜索相应地区,并将该月的数据粘贴到与该月相关的列中(例如,2月数据粘贴到C列)。然后关闭月度文件并循环到下一个月度文件

然而,我需要有一个代码,以便在年中,在一个地区的主工作簿最初创建之后的某个时间,向该地区添加一个新的地区

编写的循环希望从打开的每月文件跳转到将创建新工作表的循环代码的下一部分,但这不是所需要的

有没有解决这个问题的建议?以下是我到目前为止的情况:

Sub DSMReportsP02()

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    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 wsCount As Integer, x As Integer
    Dim wsExists As Boolean

    Set DistrictsDSMList = Range("E11:E" & Cells(Rows.Count, "E").End(xlUp).Row)
    Set WBMaster = ActiveWorkbook
    Period = Range("C6").Value
    YYYY = Range("C8").Value
    wsExists = False

    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

                    CurDstTerrFile.Sheets("Index").Range("J20").Copy 'XRA
                    DistMaster.Sheets(Territory).Activate
                    Range("C5").PasteSpecial Paste:=xlPasteValues

                    CurDstTerrFile.Sheets("Index").Range("N20").Copy 'CO-OP
                    DistMaster.Sheets(Territory).Activate
                    Range("C7").PasteSpecial Paste:=xlPasteValues

                    CurDstTerrFile.Sheets("Index").Range("S20").Copy 'VR
                    DistMaster.Sheets(Territory).Activate
                    Range("C9").PasteSpecial Paste:=xlPasteValues

                    CurDstTerrFile.Sheets("Index").Range("W20").Copy 'OVER & ABOVE
                    DistMaster.Sheets(Territory).Activate
                    Range("C11").PasteSpecial Paste:=xlPasteValues

                    CurDstTerrFile.Sheets("Index").Range("AA20").Copy 'SS
                    DistMaster.Sheets(Territory).Activate
                    Range("C13").PasteSpecial Paste:=xlPasteValues

                    CurDstTerrFile.Sheets("Index").Range("A3:D19").Copy 'COPY BTs by DISTRICT
                    WBMaster.Sheets("BTs by District").Activate
                    Range("A1000000").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues

                    Exit For
                End If
            Next x

            If wsExists = False Then             '***********FIX THIS SECTION!!!*************************
                Worksheets.Add after:=DistMaster.Worksheets(Worksheets.Count)

                CurDstTerrFile.Sheets("Index").Range("A3").Copy 'COPY TERRITORY
                ActiveSheet.name = "New Territory"
                DistMaster.Sheets(Territory).Activate
                Range("A1").PasteSpecial Paste:=xlPasteValues
            End If

            Dim WS As Worksheet, SheetXXX As Worksheet
            Set WS = WBMaster.Sheets("ReptTemplate")
            WS.Copy after:=Sheets(WBMaster.Sheets.Count)

            Set SheetXXX = ActiveWorkbook.ActiveSheet
            SheetXXX.name = Worksheets("ReptTemplate").Range("A1").Value
            CurDstTerrFile.Close

        Loop

        Dim DistWS As Worksheet
        Dim DistName As String
        Dim wbNew As Workbook

        DistName = Left(DistrictDSM, 6) & "*"
        Set wbNew = Application.Workbooks.Add

        For Each DistWS In WBMaster.Sheets
            If DistWS.name Like DistName Then DistWS.Move after:=Sheets(wbNew.Sheets.Count)
        Next DistWS

        With wbNew
            .SaveAs "H:\Accounting\Monthend " & YYYY & "\DSM Files\DSM Master Reports\" & DistrictDSM & ".xlsx"
            .Close
        End With

    Next DistrictDSM

    Application.EnableEvents = True

End Sub
子DSMReportsP02()
Application.ScreenUpdating=False
Application.EnableEvents=False
Dim DistrictDSM作为范围,DistrictsDSMList作为范围
Dim Period作为字符串,Path作为字符串,DistPeriodFile作为字符串,Territory作为字符串
Dim YYYY作为变量
Dim WBMaster作为工作簿,DistMaster作为工作簿,CurDstTerrFile作为工作簿
Dim wsCount为整数,x为整数
它以布尔形式存在
Set DistrictsDSMList=范围(“E11:E”和单元格(Rows.Count,“E”)。结束(xlUp).Row)
设置WBMaster=ActiveWorkbook
周期=范围(“C6”)。值
YYYY=范围(“C8”).值
wsExists=False
对于DistrictsDSMList.Cells中的每个DistrictDSM
工作簿。打开文件名:=“H:\Accounting\Monthend”&YYYY&“\DSM Files\DSM Master Reports\”&DistrictDSM&“.xlsx”
设置DistMaster=ActiveWorkbook
wsCount=Application.Sheets.Count
Path=“H:\Accounting\Monthend”&YYYY&“\DSM Files\”&DistrictDSM&“\P02”
DistPeriodFile=Dir(路径&“\*.xlsx”)
删除文件“”时执行此操作
工作簿。打开文件名:=Path&“\”&DistPeriodFile,UpdateLinks:=False
DistPeriodFile=Dir
设置curdsterrfile=ActiveWorkbook
Territory=curdsterrfile.Sheets(“索引”).范围(“A3”).值
对于x=1到wsCount
如果DistMaster.Worksheets(x).name=Territory,则
curdsterrfile.Sheets(“索引”).范围(“F20”).复制“PM”
DistMaster.Sheets(区域)。激活
范围(“C3”)。粘贴特殊粘贴:=XLPasteValue
curdsterrfile.Sheets(“Index”).Range(“J20”)。复制“XRA”
DistMaster.Sheets(区域)。激活
范围(“C5”)。粘贴特殊粘贴:=XLPaste值
curdsterrfile.Sheets(“索引”).Range(“N20”).Copy'CO-OP
DistMaster.Sheets(区域)。激活
范围(“C7”)。粘贴特殊粘贴:=XLPasteValue
curdsterrfile.Sheets(“索引”).范围(“S20”).复制“VR”
DistMaster.Sheets(区域)。激活
范围(“C9”)。粘贴特殊粘贴:=XLPasteValue
curdsterrfile.Sheets(“索引”).Range(“W20”)。复制以上内容
DistMaster.Sheets(区域)。激活
范围(“C11”)。粘贴特殊粘贴:=XLPasteValue
curdsterrfile.Sheets(“索引”).范围(“AA20”).副本“SS”
DistMaster.Sheets(区域)。激活
范围(“C13”)。粘贴特殊粘贴:=XLPasteValue
curdsterrfile.Sheets(“索引”).范围(“A3:D19”).复制“按地区复制基站”
WBMaster.Sheets(“按地区划分的基站”)。激活
范围(“A1000000”)。结束(xlUp)。偏移量(1,0)。粘贴特殊粘贴:=xlPasteValues
退出
如果结束
下一个x
如果wsExists=False,则'**********修复此部分*************************
Worksheets.Add after:=DistMaster.Worksheets(Worksheets.Count)
curdsterrfile.Sheets(“索引”).范围(“A3”).复制“复制区域”
ActiveSheet.name=“新领土”
DistMaster.Sheets(区域)。激活
范围(“A1”)。粘贴特殊粘贴:=XLPaste值
如果结束
图纸WS作为工作表,图纸XXX作为工作表
设置WS=WBMaster.Sheets(“ReptTemplate”)
WS.Copy after:=工作表(WBMaster.Sheets.Count)
设置SheetXXX=ActiveWorkbook.ActiveSheet
SheetXXX.name=工作表(“ReptTemplate”).范围(“A1”).值
curdsterrfile.Close
环
Dim DistWS作为工作表
Dim DistName作为字符串
以工作簿的形式新建
DistName=左侧(DistrictDSM,6)和“*”
设置wbNew=Application.Workbooks.Add
对于WBMaster.Sheets中的每个DistWS
如果DistWS.name类似于DistName,那么DistWS.Move after:=Sheets(wbNew.Sheets.Count)
下一步
用wbNew
.SaveAs“H:\Accounting\Monthend”&yyy&“\DSM Files\DSM Master Reports\”&DistrictDSM&“.xlsx”
.结束
以
下一区
Application.EnableEvents=True
端接头

很抱歉,我无法发表评论(声誉不够,无法对问题发表评论),否则我在发布本文之前会问一些问题

据我所知。您需要的是一种逻辑/算法,用于在开始向主文件复制过程之前检查是否需要向主文件添加新图纸(新区域)。如果需要添加图纸,则应将其添加到主文件的末尾

下面的代码是一个通用代码,但是您应该能够轻松地调整它以符合您的目的
Sub Comapre_Sheets()

Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim bWorkSheet_Found As Boolean

Set wb1 = Workbooks("Book1") ''' Change this to the master file
Set wb2 = Workbooks("Book2") ''' Change this to the file that might have the new sheet/territory 

For Each wks2 In wb2.Worksheets

    bWorkSheet_Found = False

    For Each wks1 In wb1.Worksheets

        If wks1.name = wks2.name Then
            bWorkSheet_Found = True
        End If

    Next wks1

    If Not bWorkSheet_Found Then
        wb1.Worksheets.Add(After:=Worksheets(wb1.Sheets.Count)).name = wks2.name
    End If

Next wks2

End Sub