在 VBA 中重新排列字符串数组的小函数

Small function to rearrange string array in VBA

我一直在 VBA 中为 Solidworks 编写一个宏,有一次我想按以下方式重新排列绘图中的 sheet——如果有的话sheet 被命名为 "CUT",将 sheet 放在前面。 Solidworks API 提供了 rearrange the sheets, but it requires an array of sheet names sorted into the correct order--fair enough. The way to get the sheet names looks to be this method 的方法。

所以,我试着写了一个小函数来按照我想要的方式重新排列 sheet。我尝试使用的函数调用和函数显示在此处

函数调用

Dim swApp           As SldWorks.SldWorks
Dim swDrawing       As SldWorks.DrawingDoc
Dim bool            As Boolean

Set swApp = Application.SldWorks
Set swDrawing = swApp.ActiveDoc

.
.
.

bool = swDrawing.ReorderSheets(bringToFront(swDrawing.GetSheetNames, "CUT"))

函数定义

Private Function bringToFront(inputArray() As String, _
    stringToFind As String) As String()

Dim i               As Integer
Dim j               As Integer
Dim first           As Integer
Dim last            As Integer
Dim outputArray()   As String

first = LBound(inputArray)
last = UBound(inputArray)

ReDim outputArray(first to last)

For i = first To last
    If inputArray(i) = stringToFind Then
        For j = first To (i - 1)
            outputArray(j + 1) = inputArray(j)
        Next j
        For j = (i + 1) To last
            outputArray(j) = inputArray(j)
        Next j
        outputArray(first) = stringToFind
    End If
Next i

bringToFront = outputArray

End Function

我得到的错误是函数调用行上的 "Type mismatch: array or user defined type expected"。我已经做了很多搜索,我认为我搞砸的事情与静态数组和动态数组有关,但我还没有完全能够自己找到解决方案。

除了评论中建议的更正之外,正在发生的是行

bringToFront(j + 1) = inputArray(j)

bringToFront(first) = stringToFind

编译器认为您正在尝试递归调用函数 bringToFront。这就是为什么它抱怨错误消息中的参数数量。要解决这个问题,只需创建另一个数组作为本地数组变量,使用不同的名称,让我们将其命名为 "ret",适当地填充它,并在返回前最后分配它。

编辑:此外,最好将数组声明为 Variant 类型以避免 VB6 和 .Net 之间的互操作性问题。这是最后一期

Private Function bringToFront(inputArray As Variant, _
stringToFind As String) As Variant

    Dim i       As Integer
    Dim j       As Integer
    Dim first   As Integer
    Dim last    As Integer

    first = LBound(inputArray)
    last = UBound(inputArray)

    Dim ret() As String
    ReDim ret(first To last)

    For i = first To last
        If inputArray(i) = stringToFind Then
            For j = first To (i - 1)
                ret(j + 1) = inputArray(j)
            Next j
            ret(first) = stringToFind
        End If
    Next i
    bringToFront = ret
End Function