2016-01-18 1 views
0

Я использую предоставленный код here в качестве шаблона для доступа к нескольким значениям переменных класса (строк), определяемым входами пользователя вне функции, но конечный результат (строковая переменная lptmstr) всегда пуст; поэтому мне нужна помощь для отладки.Сочетание строковых свойств объекта, созданного в функции, приводит к пустой строке?

Class lptm 
    public inputstr3 
    public grpString1 
    public inputstr4 
    public grpString2 
End Class 

Function lptmIn 
    Set lptmIn = New lptm 

    lptmIn.inputstr3 = InputBox("enter names") 
    lptmIn.grpString1 = Split(inputstr3, ",") 

    lptmIn.inputstr4 = InputBox("enter loss %") 
    lptmIn.grpString2 = Split(inputstr4, ",") 

    If UBound(lptmIn.grpString1) = UBound(lptmIn.grpString2) Then 
    Else 
     Call lptmIn 
    End If 
End Function 

ublptm = UBound(lptmIn.grpString1) 
For i=0 To ublptm 
    lptmStr = lptmstr & lptmIn.grpString1(i) + lptmIn.grpString2(i) 
Next 
+1

Поместите «Option Explicit» в начало вашего кода. Вы бы нашли проблему. – RLH

ответ

2

В функции lptmIn вы звоните Split на (неопределенные) переменных inputstr3 и inputstr4 вместо свойств объекта lptmIn.inputstr3 и lptmIn.inputstr4. Изменить это:

lptmIn.inputstr3 = inputbox("enter names") 
lptmIn.grpString1 = split(inputstr3, ",") 

lptmIn.inputstr4 = inputbox("enter loss %") 
lptmIn.grpString2 = split(inputstr4, ",") 

в этом:

lptmIn.inputstr3 = inputbox("enter names") 
lptmIn.grpString1 = split(lptmIn.inputstr3, ",") 

lptmIn.inputstr4 = inputbox("enter loss %") 
lptmIn.grpString2 = split(lptmIn.inputstr4, ",")

Кроме того, вам нужно присвоить объект, созданный вызов функции переменного в вашем глобальном коде, в противном случае вы будете называть функцию lptmIn для каждого вхождения lptmIn в глобальном коде.

Set obj = lptmIn 
ublptm = UBound(obj.grpString1) 
For i=0 To ublptm 
    lptmStr = lptmstr & obj.grpString1(i) + obj.grpString2(i) 
Next 

Вы также можете отказаться от рекурсивного вызова функции, когда число элементов в двух массивах отличается. Вместо этого используйте цикл.

Модифицированный код:

Function lptmIn 
    Set o = New lptm 

    Do 
     o.inputstr3 = InputBox("enter names") 
     o.grpString1 = Split(o.inputstr3, ",") 

     o.inputstr4 = InputBox("enter loss %") 
     o.grpString2 = Split(o.inputstr4, ",") 
    Loop Until UBound(o.grpString1) = UBound(o.grpString2) 

    Set lptmIn = o 
End Function 

Set obj = lptmIn 
For i=0 To UBound(obj.grpString1) 
    lptmstr = lptmstr & obj.grpString1(i) + obj.grpString2(i) 
Next 

В качестве примечания, имена переменных и функций являются зверским. Я настоятельно рекомендую выбрать более понятные имена.

+0

Я должен был очистить имена для удобства чтения, прежде чем публиковать код, извинения. – sda

+0

В целях обучения вы могли бы объяснить необходимость «Установить lptmIn = o' до конца функции? – sda

+1

Это не по необходимости само по себе, просто чистить, чтобы назначить созданный объект локальной переменной, пока вы работаете с ней внутри функции, и назначьте ее имени функции, как только вы ее вернете. –

Смежные вопросы