powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Анализ строки в VBA Excel
17 сообщений из 17, страница 1 из 1
Анализ строки в VBA Excel
    #36303568
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла следующая задача в экселе:

В ячейке экселя в текстовом формате есть, например строка:
"y=123x^2+456x^5 - 432x"

Необходимо на VBA написать функцию, которая бы принимала в качестве параметров эту самую строку и значение Х и возвращала результат вычисления уравнения функции, при подставлении в эту функцию значения Х.

т.е. если есть строка S = "y= 123x^2+456x^5 - 432x"

то функция имеет вид F(S,X), и при заданном X возвращает значение = 123*X^2 + 456*X^5 - 432*X.

Надеюсь понятно изложил суть.
Сам попытался решить задачу и оказалось, что для полинома вида, например, "y=123x^2+456x^5 - 432x" (или другого почти произвольного полинома) задача довольно не сложная. Но вот если захочется в качестве строки подсунуть уравнение с элементарными функциями отличными от степенной, например "a1*x*exp(a2*X + a3*X^2)", то задача сильно усложняется.
Поэтому дабы не изобретать велосипед, хочу спросить у вас, может есть какие-то стандартные методи и идеи?
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36303703
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обязательно на VBA?
Есть текстовый редактор MioPad (http://www.msolt.chat.ru/), в нём если написать:
a1*x*exp(a2*x + a3*x^2)
добавить значение переменных:
a1*x*exp(a2*x + a3*x^2) : 25;2
нажать F6, получим:
a1*x*exp(a2*x + a3*x^2) : 25;2=8137739.5709502
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36303990
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chuka,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub Macros1()
Dim a() As String
Range("D4").Copy
Range("F4").PasteSpecial Paste:=xlPasteValues, _
                           Operation:=xlNone, _
                           SkipBlanks:=False, _
                           Transpose:=False
Application.CutCopyMode = False
a = Split(Range("F4").Value, "=")
Range("F4").Value = a( 1 )
Range("F4").Replace What:="x", Replacement:="E4", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Range("F4").Formula = "=" + Range("F4").Value
End Sub

В D4 - формула, в F4 - результат вычисления, в E4 - значение x.

По аналогии, я думаю, разберетесь. Если сокращения в ваших формулах и в формулах Excel не будут совпадать, для них тоже надо будет сделать автозамену.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36304207
m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
m
Гость
2 chuka
Вариант от 2 Minamoto действительно, мне кажется, правильный. Единственное, существующая ошибка в том, что при замене в выражении "123x" икса на, скажем, 2, мы получим такое: "1232", когда нам нужно такое "123*2" = 246... Таким образом, необходимо проверять знак, находящийся слева от x, и если он не входит в множество знаков { ()+-/^... } заменяем на "*X"...
Вообщем вот код, тестируйте:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub justTry()
Dim b As Byte
Dim sCheck As String
Dim x As Integer
Range("F4").Value = " " & Mid(Range("D4").Value,  3 )

x =  2  ' значение для икса
sCheck = "()+-/^" 'может какой знак забыл - можна дописать

For b =  2  To Len(Range("F4")) +  2 
    If Mid(Range("F4").Value, b,  1 ) = "x" And _
    Len(Replace(sCheck, Mid(Range("F4").Value, b -  1 ,  1 ), "")) = Len(sCheck) Then
    Range("F4").Value = Replace(Left(Range("F4").Value, b -  1 ) & "*" & CStr(x) & Mid(Range("F4"), b +  1 ), " ", "")
    ElseIf Mid(Range("F4").Value, b,  1 ) = "x" And _
    Len(Replace(sCheck, Mid(Range("F4").Value, b -  1 ,  1 ), "")) <> Len(sCheck) Then
    Range("F4").Value = Replace(Left(Range("F4").Value, b -  1 ) & CStr(x) & Mid(Range("F4"), b +  1 ), " ", "")
    End If
Next b

Range("F5").Formula = "=" & Range("F4").Value

End Sub
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36304354
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! буду пробовать.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36305783
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m Единственное, существующая ошибка в том, что при замене в выражении "123x" икса на, скажем, 2, мы получим такое: "1232", когда нам нужно такое "123*2" = 246...
Невнимательно смотрите :)
Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы. Можно эту ошибку попробовать обработать и выдавать предупреждение, что формула некорректная.

Плюс, чтобы ошибка не возникала, достаточно просто соблюдать правила работы с формулами - ставить знаки умножения там, где они нужны.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36306043
2 Minamoto
Давайте-ка я Вам все разложу по-порядку.
Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы
Согласно Вашего кода, именно такое мы и получим, НО ошибки не будет, проверьте. Экель записует число как 123E4 и это равно записи 123E+04 или записи 123 0000 , таким образом получаем: "=1230000^2+4560000^5-4320000"
Плюс, чтобы ошибка не возникала, достаточно просто соблюдать правила работы с формулами
chukaВ ячейке экселя в текстовом формате есть, например строка:
"y=123x^2+456x^5 - 432x"
Как Вы видите, с формулами здесь никто и не работает. А обрабатываются строки .

P.S. Желательно свой код тестировать, перед тем, как давать его :)... А если не тестируете, то можна этот факт указать.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36306206
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, не ссорьтесь:)

Идея хорошая использовать свойство диапазона .Formula, чтобы ексель сам в качестве формулы на листе подставил измененную строку (с числами вместо X). Но мне нужна принципиально другая тема, мне нужна не процедура, которая в ячейку формулы вставляет, мне нужна именно функция, которая _возвращает_ значение функции хранимой в текстовом виде в ячейке.

В качестве примера прикладываю файл (то, что сам пытался сделать).

здесь функция FUNC1(s,x) принимает в качестве аргументов строку s и число x. И возвращает вычисленное значения.
Например s = "y=2X^3 + 4X^6"
x = 10

Тогда FUNC(s,x) = 4002000

Чтобы функция работала нужно соблюдать простые правила
1. X в строке должен быть заглавным
2. степенб икса указывается символом "^"
3. знак умножения "*" между множителем и иксом должен отсутствовать (как в примере)

Таким образом, получается вычислять простые полиномы (со степенями X от 0 до 9).
Но у меня такое ощущение, что код я придумал сильно кривой (я совсем не программист:)) и в целом, чтобы научить вычислять нечто более сложное чем полином (например если в строке будут експоненты и логарифмы), мне придется придумать еще более кривой и запутанный алгоритм :). Так вот чтобы не страдать ерундой хочу у вас спросить, возможно есть более элегантное решение этой задачи.

В целом наверное можно придумать симбиоз процедуры и функции.
Если например сделать что-то типа:
Range("F5").Formula = s
S1 = Range("F5").Value

а потом в теле функции FUNC1() значению функции присвоить S1:
FUNC1() = Cdbl(S1)

Но такой подход мне не кажется разумным.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36306254
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, да, без VBA никак, мне необходимо в екселевских таблицах работать.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36307663
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function Fn(Formula As String, X As Double) As Double
  Dim s As String, v
  Arr = Array("+*", "-*", "**", "/*")
  s = Replace(UCase(Formula), " ", "")
  s = Mid(s, InStr(s, "=") +  1 )
  s = Replace(s, " ", "")
  s = Replace(s, "X", "*" & X)
  For Each v In Arr
    s = Replace(s, v, Left$(v,  1 ))
  Next
  Fn = Application.Evaluate(s)
End Function
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36307670
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ожидаются функции, то можно расширить: Arr = Array("+*", "-*", "**", "/*","(*")
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36307698
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так будет работать побыстрее, с функциями, как с запятой, так и с точкой в качестве разделителя десятичных разрядов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function Fn(Formula As String, X As Double) As Double
  Dim s As String, Arr(), v
  Arr = Array("+*", "-*", "**", "/*", "(*")
  s = Replace(UCase(Formula), " ", "")
  s = Mid(s, InStr(s, "=") +  1 )
  s = Replace(s, "X", "*" & X)
  If InStr(s, ",") Then s = Replace(s, ",", ".")
  For Each v In Arr
    If InStr(s, v) Then s = Replace(s, v, Left$(v,  1 ))
  Next
  Fn = Application.Evaluate(s)
End Function
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36307700
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI, большое спасибо:)
Не знал про Application.Evaluate. Теперь все стало гораздо проще :)!!
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36314155
Фотография Ser Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это функция прогнозирования?????????????
Если да то можно ее посмотреть, а я Вам буду полезен (по макросам)
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36314221
chuka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ser Artur, что Вы имеете ввиду?:)
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36314271
Фотография vikttur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chukaHugo121, да, без VBA никак, мне необходимо в екселевских таблицах работать.
Вдруг пригодится?
chuka, в Excel есть функция ВЫЧИСЛИТЬ. Не работает на листе Excel, но справляется с вычислениями в VBA или в именованных. В штатной справке информации нет, но в сети можно найти.
...
Рейтинг: 0 / 0
Анализ строки в VBA Excel
    #36315079
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
внимательно смотрящий 2 Minamoto
Давайте-ка я Вам все разложу по-порядку.
Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы
Согласно Вашего кода, именно такое мы и получим, НО ошибки не будет, проверьте. Экель записует число как 123E4 и это равно записи 123E+04 или записи 123 0000 , таким образом получаем: "=1230000^2+4560000^5-4320000"

P.S. Желательно свой код тестировать, перед тем, как давать его :)... А если не тестируете, то можна этот факт указать.
Я код тестировал, и у меня Выдавалась именно ошибка :) А вы мой код тестировали? ;) Судя по всему, нет :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Анализ строки в VBA Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]