Страницы: 1
RSS
[ Закрыто ] Вопрос: Как записать математическое выражение (формулу) из ячейки в макрос VBA?, Как записать выражение типа "=15/2*1,2" в переменную макроса, для дальнейшей модернизации формулы?
 
Добрый день!
Может кто-то сталкивался с подобной задачей и подскажет как её можно реализовать:

Необходимо в ячейку содержащую значение/формулу или математическое выражение добавить множитель на определённый коэффициент, при этом всё что ранее находилось в этой ячейке нужно поместить в скобки (кроме знака равно), но саму формулу оставить неизменной.
Например: в ячейке А1 содержится выражение "=15/2*1,2", после выполнения команды в этой ячейке должна получиться запись "=(15/2*1,2)*K", где K - имя именованной ячейки в этом же файле.

Поиск в интернете не принёс результатов, очень много примеров, как макросом вписать формулу в ячейку или как в соседнюю ячейку записать подправленную формулу из первой. А как записать формулу формата Excel в макрос и затем перезаписать её в этой же ячейке, примеров не нашёл...

Пока я дошёл до следующей формулы:
Код
Dim xPrice
Set xPrice = ActiveCell
  ActiveCell.Formula = "=(" & xPrice & ")*курсЕ" 

В данном случае цена в активной ячейке домножается на курс Евро (значение которого указано в именованной ячейке курсЕ)

Но формула работает не совсем корректно...

1) При попытке присвоить переменной xPrice атрибут String, в переменную перестаёт записываться содержимое ActiveCell...

2) Если в ячейку записано "=10/2", то макрос срабатывает, но переменной xPrice присваивается значение, а не формула и в итоге вместо требуемой строки в формуле "=(10/2)*курсЕ", записывается "=(5)*курсЕ", т. е. теряются необходимые данные.

P. S. Почему-то данная формула перестала работать, если переменной xPrice присваивается дробное число. Хотя изначально макрос выполнялся.

В дальнейшем скрипт планируется нарастить проверками ячейки на содержимое. Например, чтобы случайно не помножить 2 раза на курс Евро или не брать выражение в скобки если оно уже в них.

Макросу планируется присвоить комбинацию горячих клавиш, при нажатии которой в активную ячейку добавлялся бы множитель.

Спасибо!

 
Типа так:

Код
Public Sub коэф()
Dim fOld As String
fOld = Cells(2, "C").Formula
Cells(2, "C").Formula = "=(" & Right(fOld, Len(fOld) - 1) & ") * KursE"
End Sub
Изменено: tutochkin - 26.11.2021 14:38:55
 
Цитата
tutochkin написал:
Типа так:Код ? 12345Public Sub коэф()Dim fOld As StringfOld = Cells(2, "C").FormulaCells(2, "C").Formula = "=(" & Right(fOld, Len(fOld) - 1) & ") * KursE"End Sub

Прикрепленные файлы
КурсЕ.xlsm (19.11 КБ)

Изменено: tutochkin - 26.11.2021 14:38:55
Изменено: Денис Крицков - 29.11.2021 09:15:43
 
Цитата
Денис Крицков написал:
Что-то не работает у меня данный макрос, как и мой...
Я файл приложил - всё в нём работает.
до выполнения макроса

после выполнения макроса
Изменено: tutochkin - 26.11.2021 14:58:18
 
Денис Крицков, у Вас не работает еще одно: цитирование. Учитесь не копировать, а цитировать. исправьте сообщение
 
Цитата
tutochkin написал:
Я файл приложил - всё в нём работает.
У меня, при запуске макроса в приложенном файле, выскакивает ошибка... Предварительно ячейку в которую должен записаться макрос я очистил
Изменено: Денис Крицков - 29.11.2021 09:15:28
 
Цитата
Денис Крицков написал:
Предварительно ячейку в которую должен записаться макрос я очистил
И какой сакральный смысл был в этом? Вы хоть попытались понять что делает макрос то?
Действие 1.
fOld = Cells(2, "C").Formula - забирает данные из ячейки и сохраняет как строку
Right(fOld, Len(fOld) - 1) - отсчитывает "Len(fOld) - 1" от последнего символа (-1 т.к. в формуле ещё знак = есть, и его оборачивать не надо). А строка то, упс, пустая. Т.е. 0-1... сколько он должен отсчитать?
У Вас было чётко сформулированное задание - формулу в ячейке обернуть в скобки, и умножить на именованное значение. Зачем Вы удалили формулу? Что оборачивать то?
нет слов...
 
Цитата
tutochkin написал:
И какой сакральный смысл был в этом? Вы хоть попытались понять что делает макрос то?
Да, прошу прощения. Действительно, запутался, и не разобрался что делает макрос (я только начал влезать в эти дебри). Почему-то решил, что в ячейку С2 записываются данные из B2. Видимо, всё дело и в моём случае было, в лишнем знаке "="

У меня в исходной ячейке может быть как формула, так и значение. Но это уже мелочи - можно сделать проверку перед выполнением =)

Спасибо за помощь!
Изменено: Денис Крицков - 29.11.2021 09:15:04
 
Отреагируйте на сообщение №5
 
Цитата
vikttur написал:
Отреагируйте на сообщение №5
Извините, я не знаю как поправить цитату у уже опубликованном сообщении...

Внёс правки в свой макрос с учётом написанного выше и вроде заработало оба варианта и со значением в ячейке и с формулой  :)  Сейчас макрос выглядит так:
Код
Sub КурсЕ()
'
' КурсЕ Макрос
' Добавление к цене переменной "КурсЕ"
'
' Сочетание клавиш: Ctrl+Е
'
    Dim xPrice As String
    xPrice = ActiveCell.Formula
            If ActiveCell.Formula Like "=*" Then
            ActiveCell.Formula = "=(" & Right(xPrice, Len(xPrice) - 1) & ")*курсЕ"
            Else
            ActiveCell.Formula = "=(" & xPrice & ")*курсЕ"
        End If
 End Sub
Изменено: Денис Крицков - 29.11.2021 09:14:45
 
Цитата
Денис Крицков написал: не знаю как поправить цитату
Средняя кнопочка
 
Цитата
Денис Крицков написал:
всё что ранее находилось в этой ячейке нужно поместить в скобки (кроме знака равно),
попробуйте начать с этого (для чего скобки)  :)
Пардон, кавычки еще бывают "("    :)
Изменено: _Igor_61 - 26.11.2021 19:38:11 (пришлось скопировать и вставить имя ТС-а, т.к. в цитате имя не отображается :()
 
Цитата
_Igor_61написал:
Цитата Денис Крицков  написал:всё что ранее находилось в этой ячейке нужно поместить в скобки (кроме знака равно),попробуйте начать с этого (для чего скобки)  Пардон, кавычки еще бывают "("    

Изменено: _Igor_61  - 26.11.2021 19:38:11
(пришлось скопировать  и вставить имя ТС-а, т.к. в цитате имя не отображается )
Скобки нужны потому, что в ячейке изначально может находиться математическое выражение со сложением или вычитанием и, чтобы не получить ошибку при домножении коэфициента, проще изначальное выражение взять в скобки. Наличие лишних скобок при этом ошибку в результат вычисления не вносят.
Изменено: Денис Крицков - 29.11.2021 09:14:18
Страницы: 1
Наверх