Страницы: 1
RSS
Функция с Application.Volatile и #ЗНАЧ при редактировании листов.
 
Господа, доброго времени суток.  
 
Ситуация такая: средствами VBA написал функцию, производящую некоторые вычисления, опираясь на ячейки в листе, где используется функция.  
 
Для автоматического пересчета значений добавил после объявления переменных Application.Volatile.  
 
Теперь при любом изменении любых ячеек на текущем листе формула пересчитывается, но при изменении ячеек в других листах появляется #ЗНАЧ.    
 
Полагаю, напортачил где-то в описании функции,  
код оной привожу:  
 
Private Function FullPrice(cellAddress As String)  
    Dim PostPriceCell As String  
    Dim PostPrice As Double  
    Dim FullWeight As Double  
    Dim Weight As Double  
    Dim Price As Double  
    Dim UCells As Double  
    Dim CellTop As String  
    Dim CellBottom As String  
    Dim cellAddress1 As String  
       
    Application.Volatile True  
           
    With Range(cellAddress)  
       PostPriceCell = .Offset(0, -1).MergeArea.Address  
       Price = .Offset(0, -3).Value  
       Weight = .Offset(0, -4).Value  
    End With  
       
    PostPrice = WorksheetFunction.Sum(Range(PostPriceCell))  
       
    UCells = Range(PostPriceCell).Rows.Count  
    CellTop = Range(PostPriceCell).Range("A1").Offset(0, -3).Address  
    CellBottom = Range(CellTop).Offset(UCells - 1, 0).Address  
           
    FullWeight = WorksheetFunction.Sum(Range(CellTop, CellBottom))  
       
    FullPrice = Price + Weight * PostPrice / FullWeight  
   
End Function  
 
Любые изменения и оптимизация только приветствуются.
 
Основная проблема тут вот в чем:  
 
Private Function FullPrice(cellAddress As String)  
'...  
With Range(cellAddress)  
 
В этой строке берется диапазон на активном (в момент пересчета) листе, а не на том, с которого была вызвана функция.  
Решение - передавайте сам диапазон, а не его адрес. Будет и проще, и правильнее:  
 
Private Function FullPrice(MyCell As Range)  
'...  
With MyCell  
 
Так же можно оптимизировать с CellTop и т.д.
 
не очень понятно, что передается в качестве cellAddress - полный адрес, вместе с именем листа или нет?  
вообще не очень понятно, зачем передавать адрес?  
 
и... лучше бы пример в виде небольшого xls-файла (догадки есть, но однозначный диагноз лично я, например, по приведённому коду поставить не могу :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
выложил файлик,  
 
формула записана в графе полная стоимость.
 
wolfdingo = Boyscout? какой интересный этот английский язык!!!  
пс. я не являюсь счастливым обладателем последних версий Excel'я. ждал xls. сорри.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Автоматом форму заполнил ((,  
 
приложил обычный xls
 
может быть, Вы не совсем корректно пример составили?  
у вас там сейчас циклические ссылки - напр., в яч. N4 стоит формула =FullPrice(N4)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Возможно в этом дело, тогда просто имеет смысл указать  =FullPrice(K4), и соответствующие офсеты подвинуть. Но у меня в положительную сторону таким изменением дело не сдвинулось.
 
а нужна ли в такой задаче такая функция?  
какая задача?  
корректно обрабатывать объединенные ячейки?  
 
попробуйте в N4:  
=K4+ИНДЕКС($M$4:$M4;ПОИСКПОЗ(9E+307;$M$4:$M4;1))  
 
ну и протянуть вниз, ессно :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Для первой итерации все получилось, спасибо за помощь,  
 
ЗЫ:    
каким образом можно внутри функции вытащить Range или адрес ячейки, в которой функция прописана, чтобы каждый раз не передавать в функцию входные параметры.
 
Application.Caller.Address
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх