Supponi che un collega ti dia un foglio di lavoro che ha diverse centinaia di righe di dati in 27 colonne. Prima di iniziare a lavorare con i dati, potresti voler sapere se sono stati precedentemente ordinati. Conoscere le informazioni potrebbe non solo eliminare la necessità di ricorrere ai dati, ma ti darà anche un’idea di ciò che il tuo collega riteneva fosse il modo più importante per esaminare i dati.

Sfortunatamente, Excel non dispone di un modo integrato per determinare i criteri di ordinamento utilizzati per un intervallo di dati. In teoria potresti scrivere una macro che controlli ogni colonna e veda se era in ordine crescente o decrescente. Questo ti dirà se quella singola colonna è stata ordinata, ma ciò non significa necessariamente che l’intera tabella di dati sia stata ordinata in base a quella colonna: potrebbe essere solo una coincidenza che la colonna sia in ordine e che l’ordinamento sia stato eseguito da qualcun altro colonna. Il compito del controllo diventa ancora più complicato quando inizi a considerare i tipi secondari e terziari.

C’è una cosa che puoi provare, tuttavia, per determinare se una particolare colonna è ordinata e se è ordinata in ordine crescente o decrescente. (Ricorda: questo non ti dirà se la colonna in particolare era la colonna principale utilizzata per l’ordinamento, ti dirà solo se la colonna è ordinata.)

L’idea alla base della macro è copiare il contenuto della colonna in un foglio di lavoro temporaneo, due volte. Ad esempio, se si desidera estrarre la colonna F, la macro copia la colonna F nelle colonne A e B del foglio di lavoro temporaneo. La macro ordina quindi la colonna B in ordine crescente e la confronta con la colonna A. Se le colonne ordinate e non ordinate sono le stesse, la colonna originale era in ordine crescente. Quindi la colonna B viene ordinata in ordine decrescente e il confronto viene eseguito di nuovo. Di nuovo, se le colonne sono uguali, la colonna è in ordine decrescente.

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

Una volta determinato se la colonna originale era in ordine crescente o decrescente, la prima cella della colonna nel foglio di lavoro originale viene impostata rispettivamente su giallo o arancione. Infine, il foglio di lavoro temporaneo viene eliminato.

Questa macro può essere modificata in modo che venga chiamata una volta per ogni colonna in una tabella di dati. L’esecuzione della macro per un’intera tabella non richiederebbe così tanto tempo, ma fornirebbe una rappresentazione colorata del fatto che le singole colonne siano ordinate in ordine crescente o decrescente.

Ovviamente, qualsiasi macro come questa non è banale, quindi potrebbe essere più facile capire come si desidera ordinare i dati e quindi ordinarli in questo modo dall’inizio.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (2395) si applica a Microsoft Excel 97, 2000, 2002 e 2003.