0

我有一个包含四个“系统”工作表的工作簿,每个系统工作表都有一个动态编号或用于各种数据收集的后续选项卡。我需要的是一种按字母顺序对系统及其子工作表进行排序但存在于两个特定工作表之间的方法。例子:

[介绍/参考表] [客户信息表] [系统 1] [Sys1 Child 1-12] [System 2] [Sys2 Child 1-12] [System 3] [Sys3 Child 1-12] [System 4] [Sys4 1-12] [其他表]

我试过排序潜艇,如

For Each w1 In Sheets
 For Each w2 In Sheets
  If w1.Range("Z1") <> "" And w2.Range("Z1") <> "" Then
   If w2.Range("Z1").Value < w1.Range("Z1").Value Then
    If w2.Range("Z1").Value = "S1L0" Then
     w2.Move after:=Cover
    Else
     w2.Move before:=w1
    End If
   End If
  End If
 Next w2
Next w1

它开始工作得很好,但随后循环失控,我在目标范围内有一张带有“S1L0”的表格,其他所有内容都在列表的末尾。关于如何让它发挥作用的任何想法?

编辑:系统工作表都以“S1”到“S4”开头,但它们被重命名为“S1 - %string%”到“S4 - %string%”,子工作表是最初命名的隐藏工作表的副本“ S#L#" 其中 # 分别是系统编号和子编号。子表也可以重命名,但它将遵循模式“S#L# - %string%”

4

1 回答 1

3

这应该做的工作:

Sub SortSheets()
    Dim lngParentID As Long, lngChildID As Long
    Dim wsParent As Worksheet, wsChild As Worksheet, wsLast As Worksheet

    Set wsLast = Sheets("Customer Info Sheet")
    For lngParentID = 1 To 4
        Set wsParent = GetSheet(lngParentID)
        If Not wsParent Is Nothing Then
            wsParent.Move After:=wsLast
            Set wsLast = wsParent

            For lngChildID = 1 To 12
                Set wsChild = GetSheet(lngParentID, lngChildID)
                If Not wsChild Is Nothing Then
                    wsChild.Move After:=wsLast
                    Set wsLast = wsChild
                End If
            Next lngChildID
        End If
    Next lngParentID
End Sub

Private Function GetSheet(lngParentID As Long, Optional lngChildID As Long = 0) As Worksheet
    Dim ws As Worksheet

    For Each ws In Sheets
        If (lngChildID = 0 And (ws.Name = "S" & lngParentID Or Left(ws.Name, 4) = "S" & lngParentID & " -")) Or _
            Left(ws.Name, 5) = "S" & lngParentID & "L" & Format(lngChildID, "00") Then
            Set GetSheet = ws
            Exit Function
        End If
    Next
End Function
于 2013-02-26T19:36:18.167 回答