Я писал макрос для Solidworks в VBA, и в какой-то момент я хотел бы переставить листы на чертеже следующим образом: если какой-либо из листов называется «CUT», переместите этот лист на передний план. . API Solidworks предоставляет способ переупорядочить листы, но для этого требуется массив имен листов, отсортированных в правильном порядке - достаточно справедливо. Способ получения имен листов выглядит следующим образом: метод.
Итак, я попытался написать небольшую функцию для перестановки листов так, как я хочу. Вызов функции, которую я пытаюсь использовать, и функция показаны здесь
Вызов функции
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
Я получаю сообщение об ошибке: «Несоответствие типов: ожидается массив или пользовательский тип» в строке вызова функции. Я провел немало поисков и думаю, что то, что я испортил, связано со статическими и динамическими массивами, но я не смог найти решение самостоятельно.
ReDim bringToFront(first to last)
, иначе ваш код не будет работать, если inputArray не отсчитывается от нуля. Это все, что я мог увидеть подозрительного в вашем коде. - person A.S.H   schedule 28.09.2015Sheets("CUT").Move before:=Sheets(1)
? Вы можете проверить, существуют ли Sheets(CUT). или просто используйте Возобновить при ошибке - person A.S.H   schedule 28.09.2015swDrawing.ReorderSheets(BringToFront(swDrawing.GetSheetNames), "CUT")
. О, я вижу, есть еще одна проблема, это может быть она. - person A.S.H   schedule 28.09.2015bringToFront(j + 1) = inputArray(j)
слишком похож на вызов функции для левой части присваивания. Обычно вы можете использовать локальную переменную для retval вместо этого без потери производительности, особенно. если последняя строкаbringToFront = retVal
, копирование массива не происходит (только возня с указателем). - person wqw   schedule 28.09.2015