• 20190102xlVBA_多表按姓名同时拆分


    Sub 多表按姓名同时拆分20190102()
        AppSettings
        Dim StartTime As Variant
        Dim UsedTime As Variant
        StartTime = VBA.Timer
        On Error GoTo ErrHandler
        Dim fRng As Range
        Dim Wb As Workbook
        Dim Sht As Worksheet
        Dim OneSht As Worksheet, OneName, OneKey
        Dim dic As Object, HeadRow, SplitCol, Staff
        Dim dName As Object
        Dim NewWb As Workbook
        Dim Newsht As Worksheet
    
        Set dic = CreateObject("Scripting.Dictionary")
        Set dName = CreateObject("Scripting.Dictionary")
        Set Wb = Application.ThisWorkbook
        
        
        For Each OneSht In Wb.Worksheets
            If OneSht.Visible = xlSheetVisible Then
                With OneSht
                    If .FilterMode Then .Cells.AutoFilter
                    'On Error Resume Next
                    Set fRng = .UsedRange.Find("拆分姓名", , , xlPart)
                    If fRng Is Nothing Then
                        dic(.Name) = "save"
                    Else
                        info = fRng.Address(0, 0)
                        dic(.Name) = info
                        'Debug.Print "需要拆分的表格为 [" & .Name & "]"
                        SplitCol = RegGet(info, "(D+)")
                        HeadRow = CLng(RegGet(info, "(d+)"))
                        EndRow = .Cells(.Cells.Rows.Count, SplitCol).End(xlUp).Row
                        For i = HeadRow + 1 To EndRow
                            Staff = .Cells(i, SplitCol).Value
                            dName(Staff) = ""
                        Next i
                    End If
                End With
            End If
        Next OneSht
        
        counter = 0
        For Each OneName In dName.Keys
            counter = counter + 1
            FileName = OneName & ".xlsx"
            FolderPath = Wb.Path & ""
            FilePath = FolderPath & FileName
            Set NewWb = Application.Workbooks.Add
            On Error Resume Next
            Kill FilePath
            On Error GoTo 0
            NewWb.SaveAs FilePath
            For Each OneKey In dic.Keys
                Debug.Print "正在为 [" & OneName & "] 拆分工作表 [" & OneKey & " ]"
                If dic(OneKey) = "save" Then
                    Set OneSht = Wb.Worksheets(OneKey)
                    OneSht.Copy after:=NewWb.Worksheets(NewWb.Worksheets.Count)
                    
                Else
                    '进行拆分
                    Set Newsht = NewWb.Worksheets.Add(after:=NewWb.Worksheets(NewWb.Worksheets.Count))
                    Newsht.Name = OneKey
                    
                    Set OneSht = Wb.Worksheets(OneKey)
                    info = dic(OneKey)
                    SplitCol = RegGet(info, "(D+)")
                    
                    HeadRow = CLng(RegGet(info, "(d+)"))
                    With OneSht
                        SplitNo = .Cells(1, SplitCol).Column
                        If .FilterMode = True Then .Cells.AutoFilter
                        EndCol = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
                        Set Rng = .Range("A" & HeadRow).Resize(1, EndCol)
                        Rng.AutoFilter Field:=SplitNo, Criteria1:=OneName
                        Set Rng = .UsedRange.SpecialCells(xlCellTypeVisible)
                        Rng.Copy Newsht.Range("A1")
                        If .FilterMode = True Then .Cells.AutoFilter
                    End With
                End If
            Next OneKey
            
            NewWb.Save
            NewWb.Close True
            'If counter = 3 Then Exit For
        Next OneName
        
        Set dic = Nothing
        Set dName = Nothing
        Set Wb = Nothing
        Set NewWb = Nothing
        Set Sht = Nothing
        Set OneSht = Nothing
        Set Newsht = Nothing
        Set Rng = Nothing
        UsedTime = VBA.Timer - StartTime
        Debug.Print "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
        MsgBox "共拆分" & counter & "人,用时 :" & Format(UsedTime, "#0.00秒。")
    ErrorExit:
        AppSettings False
        Exit Sub
    ErrHandler:
        If Err.Number <> 0 Then
            MsgBox Err.Description & "!", vbCritical, "AuthorQQ 84857038"
            Debug.Print Err.Description
            Err.Clear
            Resume ErrorExit
        End If
    End Sub
    Private Function RegGet(ByVal OrgText As String, ByVal Pattern As String) As String
        Dim Regex As Object
        Dim Mh As Object
        Set Regex = CreateObject("VBScript.RegExp")
        With Regex
            .Global = True
            .Pattern = Pattern
        End With
        If Regex.test(OrgText) Then
            Set Mh = Regex.Execute(OrgText)
            RegGet = Mh.Item(0).submatches(0)
        Else
            RegGet = ""
        End If
        Set Regex = Nothing
    End Function
    Private Sub AppSettings(Optional IsStart As Boolean = True)
        Application.ScreenUpdating = IIf(IsStart, False, True)
        Application.DisplayAlerts = IIf(IsStart, False, True)
        Application.Calculation = IIf(IsStart, xlCalculationManual, xlCalculationAutomatic)
        Application.StatusBar = IIf(IsStart, ">>>>>>>>Macro Is Running>>>>>>>>", False)
    End Sub
    

      

  • 相关阅读:
    【Excel】获取网页标题的VBA
    【IIS】windows2008 ii7 设置访问网站提示帐号密码登录
    【JS】JQUERY链接符大全
    【.NET】Repeater控件简单的数据绑定(有bool,日期,序号)
    CXF远程接口调用 用户名密码校验的方法:
    HTTP 请求/响应 设置/获取 Header参数
    zookeeper 实现分布式锁 demo(新)
    两个 中国标准时间 判断大小
    rabbitMq完整通信(三)---测试类
    rabbitMq完整通信(二)---consumer
  • 原文地址:https://www.cnblogs.com/nextseven/p/10206982.html
Copyright © 2020-2023  润新知