1

我一直在用 VBA 为 Solidworks 编写一个宏,有一次我想按以下方式重新排列图纸中的图纸——如果有任何图纸被命名为“CUT”,则将该图纸放在前面. Solidworks API 提供了一种重新排列图纸的方法,但它需要按正确顺序排序的图纸名称数组——这很公平。获取工作表名称的方法看起来是这种方法

因此,我尝试编写一个小函数来以我想要的方式重新排列工作表。我尝试使用的函数调用和函数显示在这里

函数调用

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

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

4

1 回答 1

1

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

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
于 2015-09-27T22:19:32.097 回答