2013-10-10 4 views
0

У меня есть следующий код: он работает нормально, но я хочу улучшить его в последней части кода, если contador = 0, я хочу не mespt = "нет С.Е. considera" вместо того, чтобы просто возвращающие 0.VBA Excel - функция, которая возвращает либо число, либо строку

Public Function mespt(tutor As String, mes As String, j As Long) As Double 


Application.Volatile 

Dim a As Long 
Dim totalmesp As Double 


mespt = 0 
contador = 0 
totalmespt = 0 
For i = 4 To 1000 
If Sheets("Hoja1").Cells(i, 2).FormulaR1C1 = tutor And Sheets("Hoja1").Cells(i, 5).FormulaR1C1 = mes Then 
Select Case Sheets("Hoja1").Cells(i, j).Value 



Case "No cumple" 
a = 0 
contador = contador + 1 
Case "Regular" 
a = 1 
contador = contador + 1 
Case "Pleno" 
a = 3 
contador = contador + 1 
Case "No se considera" 
a = 0 
End Select 


totalmespt = totalmespt + a 
If contador = 0 Then 
mespt = 0 
Else 
mespt = totalmespt/contador 
End If 

End If 
Next 


End Function 

I`ve использоваться вариант следующим образом:

Funcion mespt(      ) as Variant 
....... 

if contador = 0 then 
mespt="No se considera" then 
mespt=totalmespt/contador 
end if 

end function 

Но в случае Контадор = 0, то функция просто возвращает #! Valor

Извините, остроумие h тип варианта это рабочая область ОК, как я ожидаю сейчас, проблема была только с формулой в excel, которая работает с функцией mespt.

+3

как о возврате как Varient. – JSJ

+0

@jsj: Это действительный ответ. :) Возможно, вы захотите сказать это как ответ? –

+0

Запомните мое сообщение о реализации моего кода с вашими рекомендациями, к сожалению, он не работает. – CreamStat

ответ

1

Используйте вариант, как сказал JSJ.

VBA автоматически преобразует тип Variant в соответствующий тип. В приведенном ниже примере функция устанавливает его возврат в логическое или строковое значение в зависимости от аргумента функции.

Private Function returnVariant(returnBoolean As Boolean) As Variant 

    If returnBoolean Then 
     returnVariant = False 
    Else 
     returnVariant = "Hi this is a string" 
    End If 

End Function 

Private Sub showFunctionExample() 
    Dim v As Variant 
    Dim v2 As Variant 

    v = returnVariant(True) 
    v2 = returnVariant(False) 

    Debug.Print CStr(v) + "- Type: " + CStr(TypeName(v)) 
    Debug.Print v2 + "- Type:" + TypeName(v2) 
End Sub 

Для вашего кода, сделайте следующее:

Public Function mespt(tutor As String, mes As String, j As Long) As Variant 


Application.Volatile 

Dim a As Long 
Dim totalmesp As Double 


mespt = 0 
contador = 0 
totalmespt = 0 
For i = 4 To 1000 
If Sheets("Hoja1").Cells(i, 2).FormulaR1C1 = tutor And Sheets("Hoja1").Cells(i, 5).FormulaR1C1 = mes Then 
Select Case Sheets("Hoja1").Cells(i, j).Value 



Case "No cumple" 
a = 0 
contador = contador + 1 
Case "Regular" 
a = 1 
contador = contador + 1 
Case "Pleno" 
a = 3 
contador = contador + 1 
Case "No se considera" 
a = 0 
End Select 


totalmespt = totalmespt + a 
If contador = 0 Then 
mespt="No se considera" 
Else 
mespt = totalmespt/contador 
End If 

End If 
Next 


End Function 

Обратите внимание, что вы должны быть осторожны, назначая эту функцию для переменных, которые не имеют в тип Variant себя, как вы получите сообщение об ошибке, если вы возвращаете строку и присваиваете ее двойнику.

+0

Есть ли возможность заставить его работать в функции VBA, которую я собираюсь использовать в качестве пользовательской рабочей таблицы? Я протестировал вашу функцию returnVariant и, похоже, не работает. Фон - я хотел бы вернуть либо двойное, либо сообщение об ошибке как строку. –

0

Я бы не использовал подход Variant, потому что позже вы могли столкнуться с ошибками при попытке установить переменную с возвратом. Я вернусь как String на всех счетах.

Public Function mespt(tutor As String, mes As String, j As Long) As String 


Application.Volatile 

Dim a As Long 
Dim totalmesp As Double 


mespt = 0 
contador = 0 
totalmespt = 0 
For i = 4 To 1000 
If Sheets("Hoja1").Cells(i, 2).FormulaR1C1 = tutor And Sheets("Hoja1").Cells(i, 5).FormulaR1C1 = mes Then 
Select Case Sheets("Hoja1").Cells(i, j).Value 



Case "No cumple" 
a = 0 
contador = contador + 1 
Case "Regular" 
a = 1 
contador = contador + 1 
Case "Pleno" 
a = 3 
contador = contador + 1 
Case "No se considera" 
a = 0 
End Select 


totalmespt = totalmespt + a 
If contador = 0 Then 
mespt = 0 
Else 
mespt = totalmespt/contador 
End If 

End If 
Next 


End Function 

И тогда при использовании его проверить возвращения

Sub Sample() 
IF IsNumeric(mespt("a","b","c") Then 
    'Code if it comes back with a number 
Else 
    'Code to run if it doesn't not return number 
End If 
End Sub 

ИЛИ

=if(ISNUMBER(mespt(a,b,c)), "What to do If Number is Returned", "What To do if NON-Number is returned") 

IsNumeric возвращается Правда если тип данных выражения является Boolean, Byte, Десятичный, Double, Integer, Long, SByte, Short, Single, UInteger, ULong или UShort, или Объект, содержащий один из этих числовых типов. Он также возвращает True, если выражение представляет собой Char или String, которые могут быть успешно преобразованы в число.

IsNumeric возвращает ложных если выражение имеет тип данных Дата или типа данных объекта и не содержит числовой тип.

IsNumeric также возвращает ложных если выражение является Char или Строка, которая не может быть преобразовано в число.

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