Страницы: 1
RSS
UDF выдает #ЗНАЧ!, или что нельзя делать в UDF, что можно в макросе
 
Добрый день, эксперты
Моя первая UDF оказалась довольно сложной... для начала написал макрос, он работает, потом узнал что в функции нельзя использовать, к примеру, select и activate и прочее, все переделал, но результат по-прежнему "ЗНАЧ", посмотрите, кому не трудно, что я делаю не так. Писанины конечно очень много, но уже волосы на голове закончились - все вырвал, и не знаю куда идти дальше.
Или покажите на статью, где перечислено что точно нельзя использовать в UDF.
Код
Function countshit(d As Date, n As String, kol As Integer) As Single

'(d As Date, n As String,kol as double)
' Макрос1 Макрос

' Сочетание клавиш: Ctrl+t

Dim q(100) As Single
Dim tov(100) As String
Dim col(100) As Integer
Dim r As Integer
Dim V(100) As Single
Dim sum As Single
Dim iRange As Range
Dim m(100) As Single
Dim s As Single
'ищем дату на листе производства
Set iRange = Sheets("Производство").Cells.Find(what:=d, LookIn:=xlValues, lookat:=xlPart)

'собираем имена и количество выпущенных продуктов
For i = 1 To kol

If iRange = d Then

Set iRange = iRange.Offset(0, 1)
tov(i) = iRange
Set iRange = iRange.Offset(0, 1)
q(i) = iRange
Set iRange = iRange.Offset(1, -2)
Else: i = kol
End If
Next i

'ищем имена товаров в спецификации, собираем номера их столбцом
For i = 1 To kol

Set iRange = Sheets("спецификация").Cells.Find(what:=tov(i), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
col(i) = iRange.Column

Next i

'ищем имя сырья и собираем номер его столбца
Set iRange = Sheets("спецификация").Cells.Find(what:=n, After:=ActiveCell, LookIn:=xlValues, lookat:= _
        xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)
r = iRange.Row

'перемножаем количество на норму
For i = 1 To kol
m(i) = Sheets("спецификация").Cells(r, col(i))
V(i) = m(i) * q(i)
Next i
'складываем произведения
For i = 1 To kol
s = s + V(i)
Next i

countshit = s
End Function
 
воспитан в семье пьющих макрорекордеров
 
Цитата
dichman написал: волосы на голове закончились - все вырвал
Документальное подтверждение будет? :)
Замените
Код
Set iRange = Sheets("Производство").Cells.Find(what:=d , LookIn:=xlValues, lookat:=xlPart)

на
Код
Set iRange = Sheets("Производство").Cells.Find(what:=d & "", LookIn:=xlValues, lookat:=xlPart)
 
Цитата
dichman написал:
уже волосы на голове закончились - все вырвал, и не знаю куда идти дальше
ну раз на голове закончились - идите ниже. Обычно в моменты нервные волосы рвут еще на ж...  :D
1. Для начала научитесь использовать пошаговую отладку кода. Тогда хотя бы сможете понять на какой строке сбоит: Отлов ошибок и отладка кода VBA
2. Первая ошибка здесь:
Код
If iRange = d Then
почему Вы пытаетесь приравнять к iRange то, что в нем должно содержаться? Ведь iRange должно быть найденной через Find ячейкой. А там как раз d Вы и ищете. И совершенно логично, что если ничего на найдено, то...iRange = Nothing и не может быть приравнено к переменной через равенство.
Правильно так:
Код
If Not iRange Is Nothing Then
3. Что хотелось сделать этой строкой? Else: i = kol
4. Зачем искать после активной ячейки данные на неактивном листе?
Код
Set iRange = Sheets("спецификация").Cells.Find(what:=n, After:=ActiveCell, 

Изменено: The_Prist - 25.08.2016 14:57:50
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Doober написал: Замените
Не знаю, что за магия была сконцентрирована в тех кавычках
Цитата
what:=d & ""
но оно заработало!!!!
Лучи добра, вам , Doober!

The_Prist,
1. как ловить ошибки в функции? с макросом то оно понятно)
2. эта чудо-конструкция должна проверять не выбежали ли мы цикличискими offset`ами из нужной даты в другую, теперь  не нужна, согласен
3. это чудо также пережиток прошлых экспериментов
4. наследие безудержного и безумного макрорекордирования

Спасибо за поправки, буду внимательнее и аккуратнее.
приклеиваю волосы обратно.
воспитан в семье пьющих макрорекордеров
Страницы: 1
Наверх