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

时间:2015-09-27 20:38:39

标签: vba solidworks

我一直在为VBA中的Solidworks编写一个宏,有一点我想按照以下方式重新排列图纸中的纸张 - 如果任何纸张被命名为&#34 ; CUT",把那张纸放在前面。 Solidworks API为rearrange the sheets提供了一种方法,但它需要按照正确的顺序排列一系列工作表名称 - 足够公平。获取工作表名称的方式看起来是method

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

函数调用

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

我得到的错误是"类型不匹配:数组或用户定义的类型预期"在函数调用行上。我已经做了很多搜索,我认为我搞砸了与静态和动态数组有关,但我还没有能够自己找到解决方案。

1 个答案:

答案 0 :(得分:0)

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

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