我让以下 Sub 将一列数字放入 Variant 数组中,而不是对其调用 Bubble 排序函数来对仍在 Loo 变量中的数字进行排序。我希望 Loo 被更改,即在排序函数收到它 Byref 并完成其工作后,其中的数字按排序顺序出现。有趣的是,排序发生了,正如排序功能中 Inarray 上的手表所示。但是 Loo - 尽管将 ByRef 赋予了一个函数 - 从未改变。
变体数组不适合 ByRef 参数传递吗?我在分拣机功能中做错了什么吗?递归是什么在 Inarray 写回 Loo 之前"杀死"了它?
Option Explicit
Option Base 1
Public Loo As Variant
Public Destfile As Workbook
Private i As Integer
Sub sorter()
Set Destfile = Workbooks("SomeWB")
With Destfile.Worksheets("Somesheet").ListObjects("sometable").ListColumns("Numbers")
Loo = Application.Transpose(.DataBodyRange)
End With
BubbleSortArray (Loo)
End Sub
气泡排序功能如下:
Option Explicit
Option Base 1
Private NumberOfChanges, p As Integer
Private Store As Variant
Public Sub BubbleSortArray(ByRef Inarray As Variant)
NumberOfChanges = 0
For p = 1 To UBound(Inarray, 1) - 1
If Inarray(p) > Inarray(p + 1) Then
Store = Inarray(p + 1)
Inarray(p + 1) = Inarray(p)
Inarray(p) = Store
NumberOfChanges = NumberOfChanges + 1
End If
Next p
If NumberOfChanges <> 0 Then BubbleSortArray (Inarray)
End Sub
您面临的问题是由通话中 Loo 周围的括号引起的。VBA 与其他语言的不同之处在于,如果对例程的调用没有赋值,则不需要括号,实际上会导致不同的行为。所以:
BubbleSortArray (Loo)
或多或少地告诉 VBA 在将 Loo 传递给排序例程之前对其进行评估。
如果你这样称呼它,一切都会好起来的:
BubbleSortArray Loo
例如,请参阅此小演示:
Sub foo()
Dim x As Integer
x = 1
bar (x)
MsgBox x
bar x
MsgBox x
End Sub
Sub bar(ByRef x As Integer)
x = 10
End Sub
您将需要显式制作 Loo 和 Inarray 数组而不是变体(您可以使它们成为变体数组......或长,字符串,随便什么(。 拥有全局或模块级变量也不是一个好主意。这样的东西会起作用:
Option Explicit
Option Base 1
Sub sorter()
Dim Loo() As Variant
Dim Destfile As Workbook
Set Destfile = ThisWorkbook
With Destfile.Worksheets("QueryResult").ListObjects("Table1").ListColumns("COLUMN_NAME")
Loo = Application.Transpose(.DataBodyRange)
End With
Call BubbleSortArray(Inarray:=Loo)
Stop
End Sub
Public Sub BubbleSortArray(ByRef Inarray() As Variant)
Dim NumberOfChanges As Integer
Dim p As Integer
Dim Store As Variant
NumberOfChanges = 0
For p = 1 To UBound(Inarray, 1) - 1
If Inarray(p) > Inarray(p + 1) Then
Store = Inarray(p + 1)
Inarray(p + 1) = Inarray(p)
Inarray(p) = Store
NumberOfChanges = NumberOfChanges + 1
End If
Next p
If NumberOfChanges <> 0 Then BubbleSortArray Inarray:=Inarray
End Sub