陣列排序系列(4)
阿新 • • 發佈:2018-12-13
JavaScript排序法 - 數字升序
JavaScript一種直譯式指令碼語言,是一種動態型別、弱型別、基於原型的語言,內建支援型別。它的直譯器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的指令碼語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。 ~~ 摘自百度百科
雖然JavaScript(以下簡稱為JS)與VBA同屬於指令碼語言,但是用JS程式碼實現陣列排序比VBA程式碼簡潔很多。
function sortarr(para) { arr=para.split(','); arr.sort ( function cmp(a,b) {return a-b;} ); return arr; }
JS程式碼解析:
sortarr
的引數為逗號分隔的數字組成的字串。
第3行程式碼使用split
方法將字串拆分為一維陣列。
第4行程式碼呼叫陣列的Sort方法,其引數為cmp
的返回值。
cmp
過程返回引數a
和b
的差值,其返回值可能為負數
、0
或正數
。Sort方法將根據這3種返回值來確定是否互動相鄰陣列元素的值。
第9行程式碼返回排序後的陣列。
接下來看看如何在VBA中呼叫JS程式碼。
Sub JSSortNum_ASC() Dim aintData(1 To 10) As Variant Dim strNum As String Dim i As Integer Dim intLB As Integer Dim intUB As Integer Dim objJS As Object Dim strSortedNum As String intLB = LBound(aintData) intUB = UBound(aintData) For i = intLB To intUB aintData(i) = Application.WorksheetFunction.RandBetween(1, 100) Next i strNum = Join(aintData, ",") Debug.Print "Original Data: " & strNum Set objJS = CreateObject("msscriptcontrol.scriptcontrol") objJS.Language = "javascript" objJS.addcode "function sortarr(para){arr=para.split(',');arr.sort(function(a,b) cmp{return a-b;});return arr;}" strSortedNum = objJS.eval("sortarr('" & strNum & "')") Debug.Print "After Sort(ASC): " & strSortedNum End Sub
執行程式碼結果如下。
Original Data: 72,8,53,2,38,51,39,63,77,33 After Sort: 2,8,33,38,39,51,53,63,72,77
程式碼解析:
第16行程式碼使用後期繫結的方式建立scriptcontrol
物件 。
第17行程式碼指定指令碼語言完成JS。
第18行程式碼新增JS程式碼,其中無需使用換行和縮排。與VBA排序程式碼相比,JS程式碼實現排序更簡單。
第19行程式碼使用eval方法呼叫JS過程,並將strNum
做為過程引數。
相關文章連結: