Определение критериев сортировки (Microsoft Excel)
Предположим, ваш коллега дает вам рабочий лист, содержащий несколько сотен строк данных в 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.