2011-05-23 9 views
9

VBA'da Excel, sıralama öğelerini sıralamak için CustomOrder parametresini kullanarak değerlerin sıralanmasına izin verir. Maalesef, öğe sıralaması virgüllerle sınırlandırıldı ve sıralama öğelerinden biri virgül içeriyor. Örneğin, ilk sütundaki verileri ikinci sütundaki kategorilere göre sıralamak istiyorum. "Hava, Kara veya Deniz" kategorisinde virgül bulunur.Kod özel bir sipariş ve virgül içeren değer içeren bir Excel VBA kodunu kodlayın

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

Bir VBA makro kaydedebilir, bu gibi kod oluşturulmuş görünüyor:

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

Yani, özel sıralama düzeni "Siber" ardından "Hava, Kara, olmalı ya da Deniz ", sonra" Havacılık ". Bununla birlikte, ikinci kategori, virgüllerden dolayı üç kategori olarak ele alınmaktadır. "Hava, Kara veya Deniz" satırları altta sıralanır, çünkü Excel onlar için özel bir sıralama eşleşmesi bulamaz. CustomOrder'ın gömülü virgül içeren bir kategori ile çalışmasını sağlamanın bir yolu var mı?

Kategorinin etrafına çift tırnak işareti koymaya çalıştım ve sınırlayıcı virgülleri noktalı virgülle değiştirmeyi denedim (umut Excel'de virgül yerine noktalı virgül kabul eder). Ne işe yaramadı.

cevap

11

Apply eksik görünüyor.

Eklediğiniz özel sipariş örneğimdeki gibi çalışabilir.

DÜZENLEME OP güncellenen soru

Edit dayalı Updated aşağıdaki makro - OrderCustom parametresi için bir dizi kullanarak.

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

Orijinal örneğim çok net değildi. Lütfen güncellenen soruyu okuyun. –

+0

@Dean Hill Cevabımı güncelledi. –

+0

Bu çözüm benim için mükemmel çalıştı. Teşekkürler. –

0

Tamam ... güncellenmiş açıklamaya göre, sıraladığınız sütunun yanındaki formül için formül.

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

Sonra şöyle özel sıralama yapabilirdi:

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

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

"Hava, Kara, veya Deniz" sütunu B1 ise

yani, sonra C1 bu olurdu Aralığı uygun şekilde ayarladığınızdan emin olun.

+0

Orijinal örneğim çok açık değildi. Lütfen güncellenen soruyu okuyun. Karışıklık için özür dilerim. –

+0

Yanıt güncellendi ve umarız uygulanabilir – ray

İlgili konular