2011-05-23 11 views
9

En VBA, Excel permite ordenar valores usando el parámetro CustomOrder para elegir la secuencia de los elementos pedidos. Lamentablemente, la secuencia de elementos está delimitada por comas y uno de mis elementos de ordenación contiene comas. Por ejemplo, quiero ordenar los datos en la primera columna por las categorías en la segunda columna. La categoría "Aire, tierra o mar" contiene comas.Codifique una clasificación VBA de Excel con un orden personalizado y un valor que contenga comas

Data1  Aerospace 
Data2  Cyberspace 
Data3  Cyberspace 
Data4  Air, Land, or Sea 
Data5  Aerospace 
Data6  Air, Land, or Sea 
Data7  Cyberspace 

Si graba una macro de VBA, el código creado se ve así:

MyWorksheet.Sort.SortFields.Add Key:=Range(_ 
    "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _ 
    CustomOrder:= "Cyberspace,Air,Land,or Sea,Aerospace", _ 
    DataOption:=xlSortNormal 
MyWorksheet.Sort.Apply 

Por lo tanto, el orden personalizado debe ser "ciberespacio" y luego "aire, tierra o Mar ", luego" Aeroespacial ". Sin embargo, la segunda categoría se trata como tres categorías debido a las comas. Las filas con "Aire, tierra o mar" se clasifican en la parte inferior porque Excel no encuentra una coincidencia de clasificación personalizada para ellas. ¿Hay alguna forma de que CustomOrder funcione con una categoría que contiene comas incrustadas?

Traté de poner comillas dobles alrededor de la categoría y traté de reemplazar las comillas del delimitador por punto y coma (con la esperanza de que Excel acepte un punto y coma en lugar de una coma). Ninguno funcionó.

Respuesta

11

Parece que falta el Apply. Puede agregar

MyWorksheet.Sort.Apply 

El orden personalizado que tiene funciona como está en mi muestra.

EDITAR actualizan en función de actualización OP pregunta

Editar la macro a la siguiente - el uso de una matriz para el parámetro OrderCustom.

Dim oWorksheet As Worksheet 
Set oWorksheet = ActiveWorkbook.Worksheets("Sheet1") 
Dim oRangeSort As Range 
Dim oRangeKey As Range 

' one range that includes all colums do sort 
Set oRangeSort = oWorksheet.Range("A1:B9") 
' start of column with keys to sort 
Set oRangeKey = oWorksheet.Range("B1") 

' custom sort order 
Dim sCustomList(1 To 3) As String 
sCustomList(1) = "Cyberspace" 
sCustomList(2) = "Aerospace" 
sCustomList(3) = "Air, Land, or Sea" 

Application.AddCustomList ListArray:=sCustomList 
' use this if you want a list on the spreadsheet to sort by 
' Application.AddCustomList ListArray:=Range("D1:D3") 

oWorksheet.Sort.SortFields.Clear 
oRangeSort.Sort Key1:=oRangeKey, Order1:=xlAscending, Header:=xlGuess, _ 
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _ 
    Orientation:=xlTopToBottom, DataOption1:=xlSortNormal 

' clean up 
Application.DeleteCustomList Application.CustomListCount 
Set oWorksheet = Nothing 
+0

Mi ejemplo original no era muy claro. Por favor lea la pregunta actualizada. –

+0

@ Dean Hill Actualizado mi respuesta. –

+0

Esta solución funcionó perfectamente para mí. Gracias. –

0

OK ... según la descripción actualizada, qué tal una fórmula para la columna al lado de lo que está ordenando.

lo tanto, si "aire, tierra o mar" está en la columna B1, entonces C1 tendría esto:

=SUBSTITUTE(B1,",","|") 

entonces usted podría hacer su ordenación personalizada, así:

MyWorksheet.Sort.SortFields.Add Key:=Range(_ 

     "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _ 
     CustomOrder:= "Cyberspace,Air|Land|or Sea,Aerospace", _ 
     DataOption:=xlSortNormal 
    MyWorksheet.Sort.Apply 

Asegúrese de ajustar el rango apropiadamente.

+0

Mi ejemplo original no era muy claro. Por favor lea la pregunta actualizada. Perdón por la confusion. –

+0

Respuesta actualizada y posiblemente aplicable – ray

Cuestiones relacionadas