Здравствуйте уважаемые знатоки. Можно ли получить результат вычисления формулы записанной в ячейки С1 т.е. (5) в VBA без использования Имен и ячейки листа
Что понимается под именем ячейки? Cells(Rowindex,Columnindex) - не подойдет? Если же опустить имя листа, то данные будут использованы с того, который сейчас активный
"Все гениальное просто, а все простое гениально!!!"
Почему из ничего в Имя мы записываем формулу и получаем результат. меня интересует можно ли как либо записать без использования имени формулу чтобы получить результат ее вычислений
Nordheim, ага Евгений Смирнов, вам зачем? Что значит "взять значение из ячейки без ячейки"? Спросить у того, кто занёс - так, наверное Можно файл открыть, как архив и найти в зашифрованном содержимом…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Евгений Смирнов написал: Почему из ничего в Имя мы записываем формулу и получаем результат.
В какое имя и какую формулу? Формула возвращает имя Книги(листа, ячейки), сама формула расчитывается на листе или в коде? Может я не совсем понял вопрос темы? Вы хотите не зная листа и ячейки получить значение формулы из этих двух неизвестных объектов так? Или ......?
Вот как написать чтобы она расчиталась в коде VBA Те в 2 вариантах у меня 2 действия сначала записываем формулу в имя или ячейку а потом берем результат можно ли без промежуточных действий сразу в VBA получить результат вычисления формулы
Просмотрел сообщения от Казанского на тему.Метод Application.Evaluate но так и не могу запихнуть формулу в метод Evaluate. Зато увидел интересный способ заполнения массива. Может кто-то все таки напишет как запихнуть формулу в этот метод.
Function COUNT_IF()
Count = 1
With ActiveSheet
dx = .Range("a1").Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)
End With
With CreateObject("scripting.dictionary")
For n = 1 To UBound(dx)
If .Exists(dx(n, 1)) Then
.Item(dx(n, 1)) = .Item(dx(n, 1)) + 1
Count = IIf(Count > .Item(dx(n, 1)), Count, .Item(dx(n, 1)))
Else
.Item(dx(n, 1)) = 1
End If
Next
End With
COUNT_IF = Count
End Function
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек. В #9 показано, как это сделать. Результаты вычислений совпадают.
Могу ошибаться в интерпретации, хотелось бы услышать мнение автора.
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек
вычислить формулу, текст которой указан в ячейке C1, не используя имена(Names) книги и ячейки листа. Таким оператором сразу получаем значение функции рабочего листа сумм
Код
MsgBox Application.WorksheetFunction.Sum(2, 3)
как записать чтобы в переменной Х записался результат вычисления формулы
Что то с браузером в другом скопировал код из сообщения 9 вроде получилось Теперь получилось Спасибо всем и лично sokol92 Я вроде бы так пробовал но у меня почему то не получалось. Надо еще попробовать на других формулах самому Потом отпишусь
Нужно иметь в виду, что при обращении к методу Evaluate адреса ячеек должны быть указаны с учетом текущего стиля ссылок (A1 или RC). В документации ошибка - упоминается исключительно стиль A1.
Для того, чтобы не зависеть от текущего стиля ссылок и не запутаться в сложных формулах, Казанский разработал подход, который ниже проиллюстрирован на Вашем примере. Макрос будет работать при любом стиле ссылок (Application.Range всегда использует стиль A1).
Код
Sub Test()
Dim s As String, rg1 As Range, rg2 As Range
Set rg1 = Range("A1:A12")
Set rg2 = Range("A1:A12")
s = "=MAX(COUNTIF(%%1, %%2))" ' исходная формула, адреса диапазонов заменены на %%1, %%2
s = Replace(s, "%%1", rg1.Address(ReferenceStyle:=Application.ReferenceStyle))
s = Replace(s, "%%2", rg2.Address(ReferenceStyle:=Application.ReferenceStyle))
MsgBox Evaluate(s)
End Sub
При необходимости можно использовать и другие параметры свойства Range.Address