Страницы: 1
RSS
Циклическая ссылка в функции VBA
 
Доброго времени суток. Начал изучать VBA и создал нужную мне функцию. При пошаговом ее выполнении (F 8)   в окне VBA никаких ошибок не возникает, все выполняется как мне нужно. Но вот когда хочу использовать ее в ячейке (ввожу знак "=" и нахожу ее название), то возникает "Предупреждение о циклической ссылке". Ниже представлен код функции. В чем может быть проблема?



Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
Изменено: gaiwer123 - 17.11.2013 20:09:40
 
Проблема скорее всего в том, что вы водите функцию в те ячейки, которые обрабатывает функция, получается что ее результаты будут зависеть от ее же результатов... как-то так.
 
Цитата
В чем может быть проблема?
проблема в формуле.
с циклическими ссылками.
других вариантов нет.
пс. "восстанавливать" формулы по коду на неизвестном файле желания не возникло.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Белиберда это а не функция.  :)   Во первых функция должна возвращать значение, а Ваша не возвращает ничего. Дальше формулы листа не могут изменять других ячеек. Только ту, где находятся. Дальше ActiveCell - сменили Вы активную ячейку и  что она покажет при пересчете? Стоит заменить на thiscell.
Я сам - дурнее всякого примера! ...
 
Скажите, а может помешать использование объекта Activecell в конце кода, либо свойства Offset?
 
Нельзя внутри функции пытаться вычислять значение ячейки на основе её же самой.
Почитайте на досуге: Что такое функция пользователя(UDF)?

Добавьте параметр в функцию и сделайте её по правилам - функция на то и функция, чтобы возвращать значение. А у Вас она пытается в активную ячейку записать значение. Да и в таких случаях лучше файл с функцией выкладывать, а не тупо код. У Вас слишком много других ячеек используется - тестировать не на чем.
Что-то вроде этого. Не пытался особо оптимизировать и вникать(тестировать все равно не на чем) - просто чуть изменил под "рабочий" вариант и убрал GoTo(они у Вас явно излишни были). Да и Вам так будет удобнее понять.

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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, поэтому так вышло) Понял все комментарии, буду анализировать. Спасибо за ответы.
 
Все мы когда-то начинали и косячили :D
Я сам - дурнее всякого примера! ...
Страницы: 1
Читают тему
Loading...