2016-09-17 6 views
0

Я играю с вызовом sub(), но продолжаю получать ошибку «Определенный пользователем тип не определен». Невозможно разобраться, попробовав различные способы объявления переменных как массива. Был бы признателен за любые рекомендации по этому вопросу:VBA: передача переменных в sub() с настраиваемым типом

Public Type Whatever 
    ppp As String 
    qqq As Long 
    rrr As Single 
End Type 




Sub isthisworking() 
Dim thisis() As Whatever 
Dim i As Long 
Dim athing As Long 

For i = 0 To 5 
    With thisis(i) 
     .ppp = i & "p" 
     .qqq = i * 2 
     .rrr = i^3 
    End With 

athing = 20 

beingcalled thisis(), athing 

End Sub 



Public Sub beingcalled(ByRef thisis() As Whatever, athing As Long) 

Dim cycles As Long 

cycles = UBound(thisis) 

For i = 0 To cycles - 1 
    With thisis(i) 
     Debug.Print i & ": " & .ppp & "," & .qqq & "," & .rrr 
    End With 
Next 


End Sub 
+0

После того, как я размерности 'thisis' правильно, добавьте' Next' в ваш for-loop, и измените вызов 'becalled thisis(), athing' to 'allcalled thisis, athing', он работает без проблем. –

+0

Спасибо @Johncoleman. Понятно, что еще не до размеров. Или вырезать и вставить навыки! – user110084

+0

Когда вам нужно использовать инструкцию CALL? И почему это связано с вызовами функций, вам нужно использовать somefunction (var1, var2, ....), но для sub круглые скобки опущены? Есть ли необходимость в них? – user110084

ответ

1

Ваш For i = 0 To 5 не хватает заявление закрытия Next i.

Вы должны Redim размер вашего thisis() массива:

ReDim thisis(o To 5) 

весь "isthisworking" Sub:

Sub isthisworking() 

Dim thisis() As Whatever 
Dim i As Long 
Dim athing As Long 

ReDim thisis(o To 5) 

For i = 0 To 5 
    With thisis(i) 
     .ppp = i & "p" 
     .qqq = i * 2 
     .rrr = i^3 
    End With 
Next i 

athing = 20 

beingcalled thisis(), athing  
' you can pass also thisis (without the brackets) gives the same result 

End Sub 
+0

Спасибо @ShaiRado. Да, я как-то пропустил строку NEXT при копировании и вставке. У меня также были проблемы с тем, что пользовательский тип не был распознан, пока я не удалю модуль и не вставил новый. Я не знал, что вы можете назвать sub без(), как becalled (thesies(), athing). Мне всегда предшествовал CALL. Могу ли я сделать тот же формат с функциями? – user110084

+0

@ShaiRodo, Redim var (от 5 до 5), делает ли «o» сделать то же самое? Не видно, что зарегистрировано – user110084

+0

Функции вызова могут быть разными, особенно если функция возвращает аргумент, Redim Preserve - это другой метод, чем Redim. –