假设一个同事给您一个工作表,该工作表包含27列中的几百行数据。在开始使用数据之前,您可能想知道以前是否对它进行过排序。了解信息不仅可以消除对数据的再利用,还可以使您了解同事认为什么是查看数据的最重要方式。

不幸的是,Excel没有内置的方法来确定用于一系列数据的排序标准。从理论上讲,您可以编写一个宏来检查每列,并查看它是按升序还是降序。这将告诉您是否对单个列进行了排序,但这并不一定意味着整个数据表都由该列进行了排序-巧合的是,该列是按排序顺序进行的,而排序是由其他排序完成的柱。当您开始考虑二级和三级排序时,检查任务变得更加棘手。

但是,您可以尝试做一件事,以确定某个特定的列是否已排序以及它是按升序还是降序排序。 (请记住:这不会告诉您特定的列是否是用于排序的主列,它只会告诉您该列是否已排序。)

宏背后的想法是将列的内容复制到临时工作表两次。例如,如果要签出F列,则宏会将F列复制到临时工作表上的A列和B列。然后宏将按升序对B列进行排序,并将其与A列进行比较。如果已排序和未排序的列相同,则原始列将按升序排列。然后,B列按降序排序,并再次进行比较。同样,如果列相等,则列按降序排列。

Sub TestIfSorted(i)

Dim CColumn as Number     Dim CSheet as String     Dim FlagSort as String

'Identify Current Column and Current Sheet     CColumn = i     CSheet = ActiveSheet.Name     FlagSort = ""



'Add a temporary sheet to test for sorting     Sheets.Add     ActiveSheet.Name = "TempSort"



'Copy CURRENT column to Columns A,B in Current Sheet     Sheets(CSheet).Select     Columns(CColumn).Select     Selection.Copy

Sheets("TempSort").Select     Range("A1").Select     ActiveSheet.Paste     Range("B1").Select     ActiveSheet.Paste     Application.CutCopyMode = False

'In Column C test for equality of Columns A/B     'If Sum in C1=0 then OK otherwise Col A<>Col B     Range("B2").Select     Selection.End(xlDown).Select     Bottom = ActiveCell.Row     Range(Cells(2, 3), Cells(Bottom, 3)).Select     Selection.FormulaArray = "=IF(RC[-2]=RC[-1],0,1)"

Range("C1").Select     ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[6535]C)"



'Sort Column B--Ascending - See if c1=0     Columns("B:B").Select     Selection.Sort Key1:=Range("B2"), Order1:=xlDescending, _       Header:=xlYes, OrderCustom:=1, MatchCase:=False, _       Orientation:=xlTopToBottom, DataOption1:=xlSortNormal     If Cells(1, 3).Value = 0 Then FlagSort = "Ascending"



'Sort Column B--Descending - See if c1=0     Columns("B:B").Select     Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, _       Header:=xlYes, OrderCustom:=1, MatchCase:=False, _       Orientation:=xlTopToBottom, DataOption1:=xlSortNormal     If Cells(1, 3).Value = 0 Then FlagSort = "Descending"



If FlagSort = "Ascending" Then         'Color Header on original sheet yellow         Sheets(CSheet).Cells(1, CColumn).Interior.ColorIndex = 36     End If

If FlagSort = "Descending" Then         'Color Header on original sheet orange         Sheets(CSheet).Cells(1, CColumn).Interior.ColorIndex = 44     End If

'Delete temporary sheet     Sheets("TempSort").Select     ActiveWindow.SelectedSheets.Delete End Sub

一旦确定原始列是按升序还是降序,然后将原始工作表中该列的第一个单元格分别设置为黄色或橙色。最后,临时工作表被删除。

可以修改此宏,以便为数据表中的每一列调用一次。为整个表运行宏不会花费那么长时间,但是会提供一个生动的表示,表示各个列是按升序还是降序排序。

当然,任何这样的宏都不是无关紧要的,因此您可能更容易弄清楚如何对数据进行排序,然后从一开始就对数据进行排序。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2395)适用于Microsoft Excel 97、2000、2002和2003。