我有一张工作簿,大约有50张。我想编写一个按字母顺序排序的模块,然后在名为“Closed =>”的选项卡之后将具有黑色选项卡的表单移动到最后。按字母顺序排序后按颜色排序
Sub sortsheets()
Dim WB As Workbook
Dim WS_Count As Integer
Dim i As Integer
Dim j As Integer
Set WB = ActiveWorkbook
WS_Count = WB.Sheets.count
'Below will sort alphabetically
For i = 1 To WS_Count
For j = 1 To WS_Count - 1
If UCase(Sheets(j).name) > UCase(Sheets(j + 1).name) Then
Sheets(j).Move after:=Sheets(j + 1)
End if
Next j
Next i
' Move closed tab to the end
For i = 1 To WS_Count
If UCase(Sheets(i).name) = "Closed =>" Then
Sheets(i).Move after:=Sheets(WS_Count)
End If
Next i
' Below needs to iterate through the sheets and move all black sheets to the end
For i = 1 To WS_Count
For j = 1 To WS_Count
If Sheets(j).Tab.ColorIndex = 1 Then
Sheets(j).Move after:=Sheets(WS_Count)
End If
Next j
Next i
End Sub
问题是,最后一步将黑色页面移动到结尾处将废弃字母顺序。我认为那是因为在它继续循环的时候,它正在穿过已经移动到最后的黑色床单,并再次移动它们。我怎样才能防止呢?
其实试过循环您在使用'最后一步做的方式I = I-1'但我没有考虑到'bcount'。星期一让我试试吧。我有一个关于前两个循环中的循环算法的问题:对于我来说,对于j..'。我想出了j循环的必要性,因为如果我们只执行i循环,我们会在将工作表移动到最后之后跳过工作表。但是,我无法向我自己证明这些循环会照顾所有床单。我能够成功地对其进行测试,但在概念上并没有证明它对我自己。这是一个我能读懂的证明的已知算法吗? – newdimension
从概念上讲,第一个嵌套循环与[冒泡排序](https://en.wikipedia.org/wiki/Bubble_sort)类似(不是最高效但易于实现的),但是对于此循环来说太多;我们可以优化它通过消除中间的一个,如果表“关闭=>”将始终存在于您的文件 –
感谢您的文章!是的,工作簿将始终有一个名为“已关闭=>”的表单 – newdimension