2016-09-19 6 views
2

Я прочитал темы, которые касаются ошибок UDF #VALUE, и кажется, что либо я не знаю достаточно о VBA, чтобы иметь возможность использовать их, либо проблема, которую я имею, не то же самое.VBA UDF Excel 2010 #VALUE

В любом случае, я пытаюсь сделать UDF для вычисления количества месяцев в возрасте в формате YY: MM на основе формулы, которую я создал, и сделал то же самое.

Function TOTALMONTHS(YearsMonths As String) 
Colonz = WorksheetFunction.Find(":", YearsMonths) 
Yearz = Left(YearsMonths, Colonz - 1) 
Monthz = Mid(YearsMonths, Colonz + 1, Lengthz - Colonz) 
Lengthz = Len(YearsMonths) 
TOTALMONTHS = Yearz * 12 + Monthz 
End Function 

Приведенный выше код возвращает ошибку # ЗНАЧ при реализации в Excel 2010.

Любая помощь на какую ошибку (ы) я сделал бы весьма признателен!

Спасибо!

Edit:

Я пытаюсь и блок Если для удовлетворения возрастов, содержащих «>» в ​​начале. Например, 8: 6 и> 8: 6. Я думаю, что я, возможно, получаю ложный положительный результат поиска = 1 в начале, но не могу понять, почему.

Function TOTALMONTHS(YearsMonths As String) As Integer 
If WorksheetFunction.Search(">", YearsMonths) = 1 Then 
Greaterz = 2 
Else 
Greaterz = 1 
End If 
Colonz = WorksheetFunction.Find(":", YearsMonths) 
Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz) 
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz) 
TOTALMONTHS = Yearz * 12 + monthz 
End Function 

Я понятия не имею, как это сделать «Если» бит, а также не может понять, как поместить код в комментарии ниже ... заранее спасибо !!

РЕШЕНИЕ, используя ответ ниже - большое вам спасибо!

И это окончательный код, позволяющий «:» или «.». разделители и символы ">", а также:

Function TOTALMONTHS(YearsMonths As String) As Integer 

Dim Colonz As Integer, Yearz As Integer, monthz As Integer, Greaterz As Integer 

' check if the stings consists of ">" sign 
If InStr(YearsMonths, ">") >= 1 Then 
    Greaterz = 2 
Else 
    Greaterz = 1 
End If 

' check position of ":" or "." sign 
If InStr(YearsMonths, ":") >= 1 Then 
    Colonz = InStr(YearsMonths, ":") 
Else 
    Colonz = InStr(YearsMonths, ".") 
End If 

Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz) 
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz) 
TOTALMONTHS = Yearz * 12 + monthz 

End Function 
+0

'Lengthz' равно 0 в строке' Monthz = Mid (YearsMonths, Colonz + 1, Lengthz - Colonz) ', потому что вы еще не установили значение. – Comintern

+0

Разве вы не хотите что-то вернуть? как 'Function TOTALMONTHS (YearsMonths As String) как Long'? –

+0

Я хочу, чтобы он возвращал целое количество месяцев - спасибо, я попробую те 2 сейчас! –

ответ

0

Попробуйте обновленный UDF код ниже:

Function TOTALMONTHS(YearsMonths As String) As Integer 

Dim Colonz As Integer, Yearz As Integer, monthz As Integer, Greaterz As Integer 

' check if the stings consists of ">" sign 
If InStr(YearsMonths, ">") >= 1 Then 
    Greaterz = 2 
Else 
    Greaterz = 1 
End If 

' check position of ":" sign 
Colonz = InStr(YearsMonths, ":") 

Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz) 
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz) 
TOTALMONTHS = Yearz * 12 + monthz 

End Function 

Ниже вы можете найти образцы данных, которые я тестировал этот UDF код с:

(иметь в виду, что клетки в столбцах в и Е должны быть отформатированы как текст)

enter image description here

+0

Легенда! Большое вам спасибо за вашу помощь! Теперь он отлично работает! Ваш совет был очень полезным, и я чувствую, что многому научился! –

+0

Добро пожаловать, спасибо за маркировку как ответ –

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