1. 程式人生 > >陣列排序系列(4)

陣列排序系列(4)

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過程返回引數ab的差值,其返回值可能為負數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做為過程引數。

相關文章連結: