excel vba排序表数字

时间:2017-04-12 22:24:39

标签: excel vba excel-vba

我想在excel文件中对工作表进行排序。我找到了this代码。但问题是我的工作表名称是1_abc,2_adf,3_dasf,11_ad等。此代码将11_ad放在2_adf和3_dasf之前。我想在#34; _"之前根据数字对表格进行排序。 (第一个下划线)在我的工作表名称中。我怎么能这样做?

################################ UPDATE1

我修改了如下代码。但它按降序排序:(。我想按升序排序

Option Explicit

Sub SortWorksheets()

    Dim N As Integer
    Dim M As Integer
    Dim FirstWSToSort As Integer
    Dim LastWSToSort As Integer
    Dim SortDescending As Boolean

    SortDescending = False

    If ActiveWindow.SelectedSheets.Count = 1 Then

         'Change the 1 to the worksheet you want sorted first
        FirstWSToSort = 1
        LastWSToSort = Worksheets.Count
    Else
        With ActiveWindow.SelectedSheets
            For N = 2 To .Count
                If .Item(N - 1).Index <> .Item(N).Index - 1 Then
                    MsgBox "You cannot sort non-adjacent sheets"
                    Exit Sub
                End If
            Next N
            FirstWSToSort = .Item(1).Index
            LastWSToSort = .Item(.Count).Index
        End With
    End If

    For M = FirstWSToSort To LastWSToSort
        For N = M To LastWSToSort
            If SortDescending = True Then
                If CLng(Split(Worksheets(N).Name, "_")(0)) > _
   CLng(Split(Worksheets(M).Name, "_")(0)) Then
                    Worksheets(N).Move Before:=Worksheets(M)
                End If
            Else
                If CLng(Split(Worksheets(N).Name, "_")(0)) > _
   CLng(Split(Worksheets(M).Name, "_")(0)) Then
                    Worksheets(N).Move Before:=Worksheets(M)
                End If
            End If
        Next N
    Next M

End Sub

2 个答案:

答案 0 :(得分:6)

而不是:

If UCase(Worksheets(N).Name) > UCase(Worksheets(M).Name) Then     

你需要这样的东西:

If CLng(Split(Worksheets(N).Name,"_")(0)) > _
   CLng(Split(Worksheets(M).Name,"_")(0)) Then

答案 1 :(得分:-1)

经过长期研究,我发现这是唯一可行的解​​决方案:

Sub WorksheetsSortAscending()
'http://www.erlandsendata.no/english/vba/wb/sortsheets.htm
' sort worksheets in a workbook in ascending order
Dim sCount As Integer, i As Integer, j As Integer
sCount = Worksheets.Count
If sCount = 1 Then Exit Sub
For i = 1 To sCount - 1
For j = i + 1 To sCount
If Val(Worksheets(j).Name) < Val(Worksheets(i).Name) Then
Worksheets(j).Move before:=Worksheets(i)
End If
Next j
Next i
End Sub

来源: https://www.mrexcel.com/board/threads/sort-worksheets-ascending-using-values-no-alphanumerically.83302/

我的升级版本(屏幕更新+在调用该子程序的末尾重新激活工作表):

Sub WorksheetsSortAscending()

Dim currentWorksheet As Worksheet
Set currentWorksheet = ActiveSheet

Application.ScreenUpdating = False
'http://www.erlandsendata.no/english/vba/wb/sortsheets.htm
' sort worksheets in a workbook in ascending order
Dim sCount As Integer, i As Integer, j As Integer
sCount = Worksheets.Count
If sCount = 1 Then Exit Sub
For i = 1 To sCount - 1
For j = i + 1 To sCount
If Val(Worksheets(j).Name) < Val(Worksheets(i).Name) Then
Worksheets(j).Move before:=Worksheets(i)
End If
Next j
Next i

currentWorksheet.Activate
Application.ScreenUpdating = True

End Sub