Кажется, что Application.Volatile и ActiveSheet.Calculate - это не то, что я думал, что это так, мне нужна помощь в создании функции, которая правильно пересчитывается при изменении соответствующих данных. Вот что я собираюсь прямо сейчас:Неустойчивая пользовательская функция не пересчитывается, как ожидалось (VBA/Excel)
Public Function Availability(EmpName As Range)
Application.Volatile (True)
ColLetter = Cletter(EmpName.Column)
Set NameRange1 = Range("$" & ColLetter & "$1:$" & ColLetter & "$" & (Application.ActiveCell.Row - 1))
Set SumRange1 = Range(Cletter(Application.ActiveCell.Column) & "1:" & Cletter(Application.ActiveCell.Column) & (Application.ActiveCell.Row - 1))
Sum1 = Application.SumIfs(SumRange1, NameRange1, EmpName)
Availability = Sum1
End Function
Так как вы можете видеть, это занимает клетку и делает SUMIFS с использованием этой клетки, чтобы обеспечить критерии и столбец критериев, с помощью колонки функции помещается в течение фактические цифры для суммы (я знаю, это похоже на переосмысление колеса, но я просто представляю самую простую форму моей проблемы). Он выполняет эти вычисления по каждой предыдущей строке.
CLetter - это еще одна небольшая функция, которая превращает колонку № в букву, потому что я слишком ленив, чтобы вызвать R1C1 и найти ее более читаемой.
Но всякий раз, когда я вношу изменения в диапазоны критериев или сумм, вместо пересчета для учета изменений в идентификаторах или числах, кажется, забывает, что затронутая строка существует (даже если я только что изменил ее на MATCH критерии) или просто выбросите ошибку #VALUE. Это легко устранить, щелкнув по функции «= Доступность (A #)» и нажав кнопку ввода, но я бы не хотел писать дополнительный макрос, чтобы обновить все эти ячейки, когда они будут по всей электронной таблице. Toggling Волатильность помог немного, но не решить проблему, а также не добавляя некоторые вариации на следующем событии изменения листа:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Calculate
End Sub
Наверняка есть какой-нибудь способ, чтобы получить функцию, чтобы обновить себя всякий раз, когда любая клетка изменяется , а не только своими.
Проблема заключается в том, что вы ссылаетесь на активную ячейку. Если вы меняете данные, активная ячейка является той, которая только что изменилась, а не той, в которой находится формула. –
«Энергоэффективная функция должна быть пересчитана всякий раз, когда расчет происходит в любых ячейках на листе». - если ячейки, которые вы меняете, не ссылаются на * any * формулу, тогда никакие вычисления не вызваны редактированием. Вы можете попробовать добавить «фиктивную» формулу, которая ссылается на ячейки, которые вы меняете, - этого должно быть достаточно, чтобы вызвать перерасчет. –
Dangit, вы правы, Скотт, я считал, что это может быть проблемой, но не может найти способ, который не содержит аргументов, чтобы найти строку и столбец, в котором он должен быть (не вводить вручную , Я имею в виду). Любая идея, как я всегда мог ссылаться на эту ячейку внутри функции? Возможно, что-то с косвенным? – basaltanglia