VBA与“调用”和没有调用一个函数有什么区别? (数组sortingfunction – 不同的结果)

这更像是一个“理解一个概念”问题,而不是一个“修正代码问题”types的问题。

我有一个数组,包含一个string列表和一个函数,这些字母顺序排列(使用BubbleSort方法)。

如果我使用

Call AlphSortArray(arr) 

要么

 AlphSortArray arr 

它完美的作品。 但

 AlphSortArray(arr) 

留下未sorting的项目,并剔除列表中的第一个…

我一直在阅读有一个原因,并已经看到提到,这可能是与调用byVal vs byRef有关,但一直没有find一个明确的解释。

虽然代码工作正常,如果有人能指出我正确的方向,这将是一个巨大的帮助,以便我了解将来的参考!

提前谢谢了


上下文:我一直在build立一个包含一个combobox的excel用户表单,其中的源代码是从一个工作表上的名字列表中获取的(名字和名字的数量根据用户的input而不断变化)。 代码当前find正确的单元格范围,将其放入数组中,按字母顺序sorting,然后将其设置为源。


一些代码:

主要初始化用户表单代码:

 Call AlphSortArray(arrMRange) 'replace with lines above for error/no error ComboBox1.List = arrMRange 'arrMRange is declared as Variant previously 

那么function:

 Dim x As Long, y As Long Dim strTemp1 As String For x = LBound(arr) To UBound(arr) - 1 For y = x + 1 To UBound(arr) If UCase(arr(x)) > UCase(arr(y)) Then strTemp1 = arr(x) arr(x) = arr(y) arr(y) = strTemp1 End If Next y Next x 

(bubblesort代码改编自评论: https ://social.msdn.microsoft.com/Forums/en-US/830b42cf-8c97-4aaf-b34b-d860773281f7/sorting-an-array-in-vba-without-excel- function?论坛= isvvba )

如果您正在处理某个function ,请避免使用“ Call 。 这适用于我:

 Sub MAIN2() Dim ary(1 To 3) As String, bry Dim i As Long ary(1) = "zip" ary(2) = "AAA" ary(3) = "bbb" bry = fSort(ary) For i = 1 To 3 MsgBox bry(i) Next i End Sub Public Function fSort(ByVal InOut) As Variant Dim i As Long, J As Long, Low As Long Dim Hi As Long, Temp As Variant Low = LBound(InOut) Hi = UBound(InOut) J = (Hi - Low + 1) \ 2 Do While J > 0 For i = Low To Hi - J If InOut(i) > InOut(i + J) Then Temp = InOut(i) InOut(i) = InOut(i + J) InOut(i + J) = Temp End If Next i For i = Hi - J To Low Step -1 If InOut(i) > InOut(i + J) Then Temp = InOut(i) InOut(i) = InOut(i + J) InOut(i + J) = Temp End If Next i J = J \ 2 Loop fSort = InOut End Function 

注意:

ary()中的数组ary() 不会被UDF更改。