Excel Vba 递归子不更改 Variant ByRef 参数



我让以下 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

最新更新