Страницы: 1
RSS
Можно ли получить результат вычисления формулы в VBA без использования Имен и ячейки листа
 
Здравствуйте уважаемые знатоки.
Можно ли получить результат вычисления формулы записанной в ячейки С1 т.е. (5) в VBA без использования Имен и ячейки листа
Изменено: Евгений Смирнов - 02.04.2021 10:54:57
 
Что понимается под именем ячейки?
Cells(Rowindex,Columnindex) - не подойдет?
Если же опустить имя листа, то данные будут использованы с того, который сейчас активный
"Все гениальное просто, а все простое гениально!!!"
 
Без имен книги и без ячейки
В файле эти 2 варианта сделаны
Изменено: Евгений Смирнов - 02.04.2021 10:51:26
 
Если честно, не совсем понимаю, как это вы себе представляете, взять данные из ничего?
"Все гениальное просто, а все простое гениально!!!"
 
Почему из ничего в Имя мы записываем формулу и получаем результат. меня интересует можно ли как либо записать без использования имени формулу чтобы получить результат ее вычислений
 
Nordheim, ага  :D
Евгений Смирнов, вам зачем? Что значит "взять значение из ячейки без ячейки"? Спросить у того, кто занёс - так, наверное
Можно файл открыть, как архив и найти в зашифрованном содержимом…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Евгений Смирнов написал:
Почему из ничего в Имя мы записываем формулу и получаем результат.
В какое имя и какую формулу? Формула возвращает имя Книги(листа, ячейки), сама формула расчитывается на листе или в коде?
Может я не совсем понял вопрос темы? Вы хотите не зная листа и ячейки получить значение формулы из этих двух неизвестных объектов так?
Или ......?
Изменено: Nordheim - 02.04.2021 11:27:24
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
сама формула расчитывается на листе или в коде?
Вот как написать чтобы она расчиталась в коде VBA
Те в 2 вариантах у меня 2 действия сначала записываем формулу в имя или ячейку а потом берем результат
можно ли без промежуточных действий сразу в VBA получить результат вычисления формулы
Изменено: Евгений Смирнов - 02.04.2021 11:34:44
 
Метод Application.Evaluate "понимает" формулы. На данном сайте есть много замечательных сообщений от Казанского на эту тему.

В Вашем примере:
Код
  MsgBox Application.Evaluate("=MAX(COUNTIF('ПолучЗначФорм'!$A$1:$A$12,'ПолучЗначФорм'!$A$1:$A$12))")
Изменено: sokol92 - 02.04.2021 13:30:08
Владимир
 
Просмотрел сообщения от Казанского на тему.Метод Application.Evaluate но так и не могу запихнуть формулу в метод Evaluate.
Зато увидел интересный способ заполнения массива.
Может кто-то все таки напишет как запихнуть формулу в этот метод.
 
А #9 чем не подходит?
Владимир
 
Цитата
sokol92 написал:
'ПолучЗначФорм'!
наверное из-за этого
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, у Вас формула из #9 для примера из #1 не работает?
Владимир
 
Цитата
Евгений Смирнов написал:
Может кто-то все таки напишет как запихнуть формулу в этот метод.
как только сможете обьяснить что вам нужно, скорее всего найдутся люди, которые расскажут как это сделать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
sokol92, работает все - я имел ввиду автор же хочет не использовать
Цитата
Евгений Смирнов написал:
без использования Имен и ячейки листа
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Евгений Смирнов написал:
Можно ли получить результат вычисления формулы записанной в ячейки С1 т.е. (5) в VBA без использования Имен и ячейки листа
Можно!

P.S. какой вопрос - такой ответ )
 
Вангую.
Код
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
 
Цитата
Mershik написал:
автор же хочет не использовать
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек.
В #9 показано, как это сделать. Результаты вычислений совпадают.

Могу ошибаться в интерпретации, хотелось бы услышать мнение автора.
Изменено: sokol92 - 02.04.2021 16:21:40
Владимир
 
армянская народная мудрость гласит:
бросил дурак камень в воду - 100 умных достать не могут!
Изменено: Ігор Гончаренко - 02.04.2021 17:07:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек
вычислить формулу, текст которой указан в ячейке C1, не используя имена(Names) книги  и  ячейки листа.
Таким оператором сразу получаем значение функции рабочего листа сумм
Код
MsgBox Application.WorksheetFunction.Sum(2, 3)
как записать чтобы в переменной Х записался результат вычисления формулы
Код
=MAX(COUNTIF('ПолучЗначФорм'!R1C1:R12C1,'ПолучЗначФорм'!R1C1:R12C1))

Вероятно в качестве оператора нужен  Evaluate
X = Оператор(формула)
В сообщении 9 где написано <Код> там пусто.Никакого кода там нет
 
Цитата
Евгений Смирнов написал:
Никакого кода там нет
А я вижу этот код. Обновите страницу.
Владимир
 
Что то с браузером в другом скопировал код из сообщения 9 вроде получилось
Теперь получилось Спасибо всем и лично sokol92
Я вроде бы так пробовал но у меня почему то не получалось. Надо еще попробовать на других формулах самому
Потом отпишусь
Изменено: Евгений Смирнов - 02.04.2021 18:14:30
 
Нужно иметь в виду, что при обращении к методу Evaluate адреса ячеек должны быть указаны с учетом текущего стиля ссылок (A1 или RC). В документации ошибка - упоминается исключительно стиль A1.
Владимир
 
sokol92 Спасибо за разъяснение я пробовал ещё вчера так и у меня вылезала ошибка, поэтому подумал что неправильно что-то написал
Код
MsgBox Application.Evaluate("=MAX(COUNTIF('ПолучЗначФорм'!R1C1:R12C1,'ПолучЗначФорм'!R1C1:R12C1))")

а сейчас все посмотрел и хотел еще спросить почему лезет ошибка, а вы уже все объяснили. Оказывается стиль ссылок надо смотреть Спасибо огромное

Изменено: Евгений Смирнов - 02.04.2021 19:11:10
 
Для того, чтобы не зависеть от текущего стиля ссылок и не запутаться в сложных формулах, Казанский разработал подход, который ниже проиллюстрирован на Вашем примере. Макрос будет работать при любом стиле ссылок (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
Владимир
 
sokol92 Спасибо за пример.На досуге поразбираюсь.
Страницы: 1
Наверх