Предположим, ваш коллега дает вам рабочий лист, содержащий несколько сотен строк данных в 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), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2395) применим к Microsoft Excel 97, 2000, 2002 и 2003.