Доброго времени суток. Начал изучать VBA и создал нужную мне функцию. При пошаговом ее выполнении (F 8) в окне VBA никаких ошибок не возникает, все выполняется как мне нужно. Но вот когда хочу использовать ее в ячейке (ввожу знак "=" и нахожу ее название), то возникает "Предупреждение о циклической ссылке". Ниже представлен код функции. В чем может быть проблема?
Код
Function Tonnaj()
If ActiveCell.Offset(0, -4) = "-" Then GoTo m6
a5 = Mid(ActiveCell.Offset(0, -5), 9, Len(ActiveCell.Offset(0, -5)))
b5 = ActiveCell.Offset(0, -3)
c5 = ActiveCell.Offset(0, -2)
Set b6 = Sheets(3).Columns("A:A").Find(What:=a5)
If b6 Is Nothing Then
e5 = ""
Else
c6 = b6.Address
End If
For j5 = 1 To 200
d5 = Sheets(3).Range(c6).Offset(0, 2)
If b5 < d5 Then
e5 = Sheets(3).Range(c6).Offset(0, 3)
GoTo m5
End If
If Sheets(3).Range(c6).Offset(1, 0) = Sheets(3).Range(c6) Then
f5 = Range(c6).Row
f6 = Range(c6).Column
c6 = Cells(f5 + 1, f6).Address
Else:
GoTo m6
End If
Next j5
m6:
e5 = "-"
m5:
ActiveCell = e5
End Function
Проблема скорее всего в том, что вы водите функцию в те ячейки, которые обрабатывает функция, получается что ее результаты будут зависеть от ее же результатов... как-то так.
Белиберда это а не функция. Во первых функция должна возвращать значение, а Ваша не возвращает ничего. Дальше формулы листа не могут изменять других ячеек. Только ту, где находятся. Дальше ActiveCell - сменили Вы активную ячейку и что она покажет при пересчете? Стоит заменить на thiscell.
Добавьте параметр в функцию и сделайте её по правилам - функция на то и функция, чтобы возвращать значение. А у Вас она пытается в активную ячейку записать значение. Да и в таких случаях лучше файл с функцией выкладывать, а не тупо код. У Вас слишком много других ячеек используется - тестировать не на чем. Что-то вроде этого. Не пытался особо оптимизировать и вникать(тестировать все равно не на чем) - просто чуть изменил под "рабочий" вариант и убрал GoTo(они у Вас явно излишни были). Да и Вам так будет удобнее понять.
Код
Function Tonnaj()
Dim rMeCell As Range
Set rMeCell = Application.Caller 'назначаем переменной ячейку с функцией
If rMeCell.Offset(0, -4) = "-" Then
Tonnaj = "-"
Exit Function
End If
a5 = Mid(rMeCell.Offset(0, -5), 9, Len(rMeCell.Offset(0, -5)))
b5 = rMeCell.Offset(0, -3)
c5 = rMeCell.Offset(0, -2)
Set b6 = Sheets(3).Columns("A:A").Find(What:=a5)
If b6 Is Nothing Then
e5 = ""
Else
c6 = b6.Address
End If
For j5 = 1 To 200
d5 = Sheets(3).Range(c6).Offset(0, 2)
If b5 < d5 Then
Tonnaj = Sheets(3).Range(c6).Offset(0, 3)
Exit Function
End If
If Sheets(3).Range(c6).Offset(1, 0) = Sheets(3).Range(c6) Then
f5 = Range(c6).Row
f6 = Range(c6).Column
c6 = Cells(f5 + 1, f6).Address
Else:
Tonnaj = "-"
Exit Function
End If
Next j5
End Function
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Прошу прощения, за нелепость кода. Я только начинающий пользователь VBA, поэтому так вышло) Понял все комментарии, буду анализировать. Спасибо за ответы.