Страница 1 из 1

не работает циклическая ссылка в EXCEL

Добавлено: 25 сен 2005, 11:25
krank
Подскажите пожалуйста как сделать чтобы ячейка плюсовала содержимое другой ячейки к своему
Пример
B1: A1+B1
число итераций ставлю =1
Она плюсует, только когда ввожу данные в другие ячейки формула пересчитывает значение и ещё раз добавляет значение A1. пробовал ставить $ перед А1 и В1 не помогает.
Кто знает пожалуйста подскажите.

Добавлено: 25 сен 2005, 12:49
Naeel Maqsudov
Это происходит по тому, что любое изменение на листе приводит к возникновению события Calculate. В течение этого события происходят перерасчеты формул, и итерационных с том числе.

Если нужно, чтобы прибавила и больше никогда не пересчитывала, то не нужно использовать формулы. Или введя формулу затем с помощью копирования и меню Правка\Специальная вставка замените формулу результатом.

Если нужно, чтобы значение А1 прибавлялось к B1 только при вводе A1, то нужно в VBA в модуле этого листа написать макрос-обработчик события Change. В этом обработчике проверить, если Target.Address = $A$1, то сделать
[b1] = [b1] + Target.Value
пробовал ставить $ перед А1 и В1 не помогает
И не поможет. Признак абсолютной ссылки не влияет на процесс вычисления. Он влияет только на процесс копирования этой формулы в другие ячейки. Абсолютные части адреса остаются неизменными, а относительные меняются так, чтобы влияющие ячейки как бы "проследовали" поступательно за формулой.

Добавлено: 25 сен 2005, 13:16
pashulka
Если у Вас наличествует циклическая ссылка, то ввод данных в любую ячейку рабочего листа вызывает пересчёт всех формул (при условии, что у Вас не установлен ручной режим вычислений), поэтому циклическая ссылка работает, но только не так, как Вы рассчитывали.

Для решения Вашей задачи можно использовать макросы, а точнее сказать события, которые помогут Вам обойтись, без использования циклической ссылки :

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$A$1" Then
   If IsNumeric(Target.Value) And IsNumeric(Target.Next.Value) Then
      Application.EnableEvents = False
      Target.Next.Value = Target.Next.Value + Target.Value
      Application.EnableEvents = True
   End If
End If
End Sub

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$A$1" Then
   With Target
        If IsNumeric(.Value) And IsNumeric(.Next.Value) Then
           .Application.EnableEvents = False
           .Next.Value = .Next.Value + .Value
           .Application.EnableEvents = True
        End If
   End With
End If
End Sub
Любой из двух вышеопубликованных кодов нужно расположить в модуле того рабочего листа, в котором Вы хотите производить нужные манипуляции. Для этого можно выделить ярлычок нужного рабочего листа, нажать на правую кнопку мышки и в появившемся контекстном меню выбрать команду Исходный текст

P.S. Надеюсь, что Naeel Maqsudov не обидится за некоторый повтор с моей стороны, но свой вариант ответа я написал автономно, а редактировать уж очень не хочется.

Добавлено: 25 сен 2005, 21:54
krank
Большое спасибо за совет, только как быть если мне надо чтоб те же манипуляции проделывались с C1 и D1, A2 и B2 и т. д.
А ещё лучше, чтобы складывала А1(А2), В1(В2), С1(С2) и каждый раз выводила результат в D1(D2)

Добавлено: 26 сен 2005, 13:34
pashulka
IMHO Лучше сначала определиться с тем, какие же именно ячейки Вам нужно суммировать ... должны ли это быть вполне конкретные ячейки или все ячейки в определённых столбцах и т.п.

Добавлено: 27 сен 2005, 11:16
krank
Мне надо чтобы построчно суммировались(так же как А1 и В1) все значения в столбцах C и D, F и G, I и J

Добавлено: 27 сен 2005, 11:58
pashulka
Один из возможных вариантов решения Вашего вопроса, заключается в замене :

Код: Выделить всё

If Target.Address = "$A$1" Then 
   …
End If
на :

Код: Выделить всё

Select Case Target.Column
Case 1, 3, 6, 9
…
End Select
P.S. Если существует вероятность, что изменение данных будет происходить не в одной отдельно взятой ячейке, а в целом диапазоне, то макрос нужно будет немного изменить.