在 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
我一直在 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