|
|
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Возникла следующая задача в экселе: В ячейке экселя в текстовом формате есть, например строка: "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)", то задача сильно усложняется. Поэтому дабы не изобретать велосипед, хочу спросить у вас, может есть какие-то стандартные методи и идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 12:42 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Обязательно на 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 13:19 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
chuka, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В D4 - формула, в F4 - результат вычисления, в E4 - значение x. По аналогии, я думаю, разберетесь. Если сокращения в ваших формулах и в формулах Excel не будут совпадать, для них тоже надо будет сделать автозамену. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 14:32 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 15:24 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 16:01 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
m Единственное, существующая ошибка в том, что при замене в выражении "123x" икса на, скажем, 2, мы получим такое: "1232", когда нам нужно такое "123*2" = 246... Невнимательно смотрите :) Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы. Можно эту ошибку попробовать обработать и выдавать предупреждение, что формула некорректная. Плюс, чтобы ошибка не возникала, достаточно просто соблюдать правила работы с формулами - ставить знаки умножения там, где они нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 09:21 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
2 Minamoto Давайте-ка я Вам все разложу по-порядку. Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы Согласно Вашего кода, именно такое мы и получим, НО ошибки не будет, проверьте. Экель записует число как 123E4 и это равно записи 123E+04 или записи 123 0000 , таким образом получаем: "=1230000^2+4560000^5-4320000" Плюс, чтобы ошибка не возникала, достаточно просто соблюдать правила работы с формулами chukaВ ячейке экселя в текстовом формате есть, например строка: "y=123x^2+456x^5 - 432x" Как Вы видите, с формулами здесь никто и не работает. А обрабатываются строки . P.S. Желательно свой код тестировать, перед тем, как давать его :)... А если не тестируете, то можна этот факт указать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 10:52 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Друзья, не ссорьтесь:) Идея хорошая использовать свойство диапазона .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) Но такой подход мне не кажется разумным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 11:41 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Hugo121, да, без VBA никак, мне необходимо в екселевских таблицах работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 11:56 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 19:18 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Если ожидаются функции, то можно расширить: Arr = Array("+*", "-*", "**", "/*","(*") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 19:20 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Вот так будет работать побыстрее, с функциями, как с запятой, так и с точкой в качестве разделителя десятичных разрядов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 19:35 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
ZVI, большое спасибо:) Не знал про Application.Evaluate. Теперь все стало гораздо проще :)!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 19:36 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Это функция прогнозирования????????????? Если да то можно ее посмотреть, а я Вам буду полезен (по макросам) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 10:43 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
Ser Artur, что Вы имеете ввиду?:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 11:07 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
chukaHugo121, да, без VBA никак, мне необходимо в екселевских таблицах работать. Вдруг пригодится? chuka, в Excel есть функция ВЫЧИСЛИТЬ. Не работает на листе Excel, но справляется с вычислениями в VBA или в именованных. В штатной справке информации нет, но в сети можно найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 11:24 |
|
||
|
Анализ строки в VBA Excel
|
|||
|---|---|---|---|
|
#18+
внимательно смотрящий 2 Minamoto Давайте-ка я Вам все разложу по-порядку. Мы получим такое: "123E4", что приведет к ошибке при попытке создания формулы Согласно Вашего кода, именно такое мы и получим, НО ошибки не будет, проверьте. Экель записует число как 123E4 и это равно записи 123E+04 или записи 123 0000 , таким образом получаем: "=1230000^2+4560000^5-4320000" P.S. Желательно свой код тестировать, перед тем, как давать его :)... А если не тестируете, то можна этот факт указать. Я код тестировал, и у меня Выдавалась именно ошибка :) А вы мой код тестировали? ;) Судя по всему, нет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 15:32 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=179&tid=2178830]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
16ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 285ms |

| 0 / 0 |
