【问题标题】:Combine Worksheets based on certain name structure根据特定名称结构组合工作表
【发布时间】:2015-07-28 06:09:57
【问题描述】:

Excel 文件的工作表结构如下:

A1A2A3A4B1B2B3C1C2C3C5...@p>

所以你可以看到 4 次 A、3 次 B、5 次 C 等等(不均匀分布)

我想做的事:

1) 将每种类型(A、B、C 等)工作表的内容分别组合到新创建的汇总工作表中。

假设以下是目标结构: AXA1A2A3A4BXB1B2B3等, 而AXA1的内容汇总为A4BXB1的内容汇总为B3等等。

我有以下例程将所有个工作表合并到一个摘要表中。

Sub Combine()    
Dim i As Integer

On Error Resume Next
Sheets(1).Select
Worksheets.Add
Sheets(1).name = "XXX"
Sheets(2).Activate
Range("A1").EntireRow.Select
Selection.Copy Destination:=Sheets(1).Range("A1")
For i = 2 To Sheets.Count
    Sheets(i).Activate
    Range("A1").Select
    Selection.CurrentRegion.Select
    Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Select
    Selection.Copy Destination:=Sheets(1).Cells(Sheets(1).Rows.Count, "A").End(xlUp)(2)
Next    
End Sub

但现在我想“拆分”这个例程,以便根据工作表组创建多个汇总表,如上述目标结构中一样。

2) 在下一步中,我想删除除摘要表之外的所有工作表,以便只剩下摘要工作表,如下图所示:

AXBXCX

作为附加说明:我确实知道每种类型有多少张纸,例如 4 x A、3 x B 等,但如果可能,程序应该自动计算纸的数量。感谢您的任何提示。

【问题讨论】:

    标签: vba loops excel worksheet


    【解决方案1】:

    这里根据您的要求提供解决方案

    Sub combine()
    Dim ws As Worksheet, wsD As Worksheet
    Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
    Dim key, i&
    Application.DisplayAlerts = False
    With ThisWorkbook
        For Each ws In .Worksheets
            If Not Dic.exists(UCase(Left(ws.Name, 1))) Then
                Dic.Add UCase(Left(ws.Name, 1)), Nothing
            End If
        Next ws
        For Each key In Dic
        Set wsD = .Sheets.Add(After:= _
                     .Sheets(.Sheets.Count))
          wsD.Name = key & " Summary"
          i = 1
            For Each ws In .Worksheets
                If UCase(ws.Name) Like key & "*" And _
                    ws.Name <> key & " Summary" Then
                    ws.Activate: ws.[A1].CurrentRegion.Offset(1, 0).Resize([A1].CurrentRegion.Rows.Count - 1).Copy
                    wsD.Activate: Range("A" & i).PasteSpecial xlPasteAll
                    i = wsD.Cells(Rows.Count, "A").End(xlUp).Row + 1
                End If
            Next ws
        Next key
        For Each ws In .Worksheets
            If Not ws.Name Like "* Summary" Then
                ws.Delete
            End If
        Next ws
    End With
    Application.DisplayAlerts = True
    End Sub
    

    更新

    没有字典的变体

    Sub combine2()
    Dim ws As Worksheet, wsL As Worksheet, wsD As Worksheet
    Dim i&, cl As Range
    Application.DisplayAlerts = False
    i = 1
    With ThisWorkbook
        Set wsL = .Sheets.Add(After:=.Sheets(.Sheets.Count))
        wsL.Name = "List"
        For Each ws In .Worksheets
            If ws.Name <> "List" Then
                Set cl = wsL.[A:A].Find(UCase(Left(ws.Name, 1)))
                If cl Is Nothing Then
                    wsL.Cells(i, 1).Value = UCase(Left(ws.Name, 1))
                    i = i + 1
                End If
            End If
        Next ws
        For Each cl In wsL.[A1].CurrentRegion
            Set wsD = .Sheets.Add(After:= _
                         .Sheets(.Sheets.Count))
              wsD.Name = cl.Value & " Summary"
            i = 1
            For Each ws In .Worksheets
                If UCase(ws.Name) Like cl.Value & "*" And _
                    ws.Name <> cl.Value & " Summary" And ws.Name <> "List" Then
                    ws.Activate: ws.[A1].CurrentRegion.Offset(1, 0).Resize([A1].CurrentRegion.Rows.Count - 1).Copy
                    wsD.Activate: Range("A" & i).PasteSpecial xlPasteAll
                    i = wsD.Cells(Rows.Count, "A").End(xlUp).Row + 1
                End If
            Next ws
        Next cl
        For Each ws In .Worksheets
            If Not ws.Name Like "* Summary" Then
                ws.Delete
            End If
        Next ws
    End With
    Application.DisplayAlerts = True
    End Sub
    

    【讨论】:

    • 哇,真快。完美运行。只是作为初学者的一个额外问题:你为什么使用字典,或者换句话说,它可以以不同的方式解决(可能更慢..)?
    • @EDC 是的,您的任务可以在不使用字典的情况下完成。您需要示例如何在没有字典的情况下解决它吗?
    • 学习对我来说会很有趣,但公平地说,我认为没有必要,因为您当前的解决方案可以正常工作。
    • @EDC 不使用字典的变体已添加到我的帖子中
    • 太棒了。非常感谢,非常感谢您的时间和精力:)!
    猜你喜欢
    • 2011-02-26
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多