2011-05-23 12 views
9

वीबीए में एक मान, एक्सेल अनुक्रम आइटम का ऑर्डर करने के लिए कस्टमऑर्डर पैरामीटर का उपयोग करके मूल्यों को सॉर्ट करने की अनुमति देता है। दुर्भाग्यवश, वस्तुओं का अनुक्रम अल्पविरामों द्वारा सीमित है और मेरे सॉर्ट आइटमों में से एक को अल्पविराम शामिल है। उदाहरण के लिए, मैं दूसरे कॉलम में श्रेणियों द्वारा डेटा को पहले कॉलम में सॉर्ट करना चाहता हूं। "वायु, भूमि, या सागर" श्रेणी में अल्पविराम शामिल हैं।एक कस्टम ऑर्डर के साथ एक एक्सेल वीबीए सॉर्ट कोड और कॉमा

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

आप एक VBA मैक्रो रिकॉर्ड करते हैं, तो इस तरह कोड बनाया दिखता है:

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

तो, कस्टम सॉर्ट क्रम "साइबरस्पेस" फिर "हवा, जमीन, होना चाहिए या सागर ", फिर" एयरोस्पेस "। हालांकि, अल्पविराम की वजह से दूसरी श्रेणी को तीन श्रेणियों के रूप में माना जाता है। "वायु, भूमि, या सागर" वाली पंक्तियों को नीचे से क्रमबद्ध किया जाता है क्योंकि एक्सेल को उनके लिए एक कस्टम सॉर्ट मैच नहीं मिलता है। क्या कस्टमऑर्डर को उस श्रेणी के साथ काम करने का कोई तरीका है जिसमें एम्बेडेड कॉमा शामिल हैं?

मैंने श्रेणी के चारों ओर डबल कोट्स डालने की कोशिश की और मैंने अर्धविरामों के साथ डेलीमीटर कॉमा को बदलने की कोशिश की (आशा है कि एक्सेल अल्पविराम के बजाय अर्धविराम स्वीकार करेगा)। न तो काम किया।

उत्तर

11

ऐसा लगता है कि Apply अनुपलब्ध है। क्या आप

MyWorksheet.Sort.Apply 

आपके पास कस्टम ऑर्डर मेरे नमूने में काम कर रहा है।

संपादित ओपी सवाल अद्यतन

संपादित के आधार पर अपडेट किया गया निम्नलिखित करने के लिए मैक्रो - 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

मेरा मूल उदाहरण बहुत स्पष्ट नहीं था। कृपया अद्यतन प्रश्न पढ़ें। –

+0

@ डीन हिल ने मेरा जवाब अपडेट किया। –

+0

यह समाधान मेरे लिए पूरी तरह से काम किया। धन्यवाद। –

0

ठीक है ... अद्यतन विवरण के आधार पर, आप जो सॉर्ट कर रहे हैं उसके बगल में कॉलम के लिए सूत्र के बारे में कैसे।

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

तो फिर तुम तो जैसे अपने कस्टम प्रकार कर सकता है::

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

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

तो, अगर "वायु, भूमि, या सागर" कॉलम बी 1 में है, तो सी 1 इस लिए होता है उचित रूप से सीमा समायोजित करना सुनिश्चित करें।

+0

मेरा मूल उदाहरण बहुत स्पष्ट नहीं था। कृपया अद्यतन प्रश्न पढ़ें। गलतफहमी के लिए खेद है। –

+0

उत्तर अद्यतन और उम्मीद है कि लागू – ray

संबंधित मुद्दे