Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/355: Рейтинг темы: голосов - 355, средняя оценка - 4.95
GeoCod
143 / 70 / 22
Регистрация: 26.01.2019
Сообщений: 230
27.02.2019, 23:38 121
Фактически это проблемой/багом не является, но для меня было некоторое удивление, что в VBA есть ограничение на вложенные выражения (...(...(...(...)))). MS называют это "Слишком сложное выражение". Уж от VBA такого не ожидал.

Подозревал что вся проблема в большом количестве аргументов возводимых в степень. Заменил их на переменные.
И тогда стала появляться ошибка Переполнение.

Решение такого безобразия - разбивка выражения на отдельные части.
Для матерых пользователей, наверное, это не будет новостью. Надеюсь, начинающим пригодится

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub testtest()
Dim X#, L2#, sinX2#, sinX4#, sinX6#
X = 0.8305085035398
L2 = 1.28643 * 10 ^ -4
      
'Вариант 1. При внесении всех аргументов "как есть"
'вызывает ошибку (6) overflow
'   X = 6367558.4968 * X - Sin(X * 2) _
      * (16002.89 + 66.9607 * Sin(X) ^ 2 + 0.3515 * Sin(X) ^ 4 - _
       L2 * (1594561.25 + 5336.535 * Sin(X) ^ 2 + 26.79 * Sin(X) ^ 4 + 0.149 * Sin(X) ^ 6 + _
       L2 * (672483.4 - 811219.9 * Sin(X) ^ 2 + 5420 * Sin(X) ^ 4 - 10.6 * Sin(X) ^ 6 + _
       L2 * (278194 - 830174 * Sin(X) ^ 2 + 572434 * Sin(X) ^ 4 - 16010 * Sin(X) ^ 6 + _
       L2 * (109500 - 574700 * Sin(X) ^ 2 + 863700 * Sin(X) ^ 4 - 398600 * Sin(X) ^ 6)))))
 
sinX2 = Sin(X) ^ 2
sinX4 = Sin(X) ^ 4
sinX6 = Sin(X) ^ 6
 
'Вариант 2. С заменой аргументов со степенями на переменные
'вызывает ошибку (16) Expression too complex
'   X = 6367558.4968 * X - Sin(X * 2) _
      * (16002.89 + 66.9607 * sinX2 + 0.3515 * sinX4 - _
       L2 * (1594561.25 + 5336.535 * sinX2 + 26.79 * sinX4 + 0.149 * sinX6 + _
       L2 * (672483.4 - 811219.9 * sinX2 + 5420 * sinX4 - 10.6 * sinX6 + _
       L2 * (278194 - 830174 * sinX2 + 572434 * sinX4 - 16010 * sinX6 + _
       L2 * (109500 - 574700 * sinX2 + 863700 * sinX4 - 398600 * sinX6)))))
 
'Вариант 3. Разбивка варианта 2 на части
'работает
   X = L2 * (109500 - 574700 * sinX2 + 863700 * sinX4 - 398600 * sinX6)
   X = L2 * (278194 - 830174 * sinX2 + 572434 * sinX4 - 16010 * sinX6 + X)
   X = L2 * (672483.4 - 811219.9 * sinX2 + 5420 * sinX4 - 10.6 * sinX6 + X)
   X = L2 * (1594561.25 + 5336.535 * sinX2 + 26.79 * sinX4 + 0.149 * sinX6 + X)
X = 6367558.4968 * X - Sin(X * 2) * (16002.89 + 66.9607 * sinX2 + 0.3515 * sinX4 - X)
Debug.Print X
End Sub
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2019, 23:38
Ответы с готовыми решениями:

Обсуждение темы "Готовые решения, примеры и рекомендации начинающим на WPF"
Тема для обсуждения, критики, предложения изменений и дополнений темы...

Проблемы с алгоритмом решения задачи
Нужно написать алгоритм решения задачи. Т.е. что и как делает прога, желательно построчно, ну или...

USB устройство, проблемы и пути решения.
Народ, что делать с флешкой - сохраняю на ней файлы (форматы разные), после не могу их открыть,...

Бывший профессионал cs 1.6 просит решения проблемы
Зайду немного из далека. Мне вот уже под 30 лет, и как бы это смешно не звучало, я до сих пор в...

Прошу помощи решения проблемы в перекрестном...
Ребята, прошу помощи. Есть перекрестный запрос: TRANSFORM Count(.TypObor) AS SELECT .LICS,...

125
Казанский
14903 / 6306 / 1719
Регистрация: 24.09.2011
Сообщений: 9,977
28.02.2019, 01:44 122
GeoCod, работает, но в 34 строке Х уже не тот, который использовался для вычисления sinX2,sinX4,sinX6.
Что за задача, в которой потребовались такие длинные выражения?
Цитата Сообщение от GeoCod Посмотреть сообщение
L2 = 1.28643 * 10 ^ -4
Это записывается как
Visual Basic
1
L2 = 1.28643e-4
правда бейсик меняет формат на 0.000128643.
1
GeoCod
143 / 70 / 22
Регистрация: 26.01.2019
Сообщений: 230
28.02.2019, 08:09 123
Цитата Сообщение от Казанский Посмотреть сообщение
Что за задача, в которой потребовались такие длинные выражения?
Преобразование геодезических координат по ГОСТу

Цитата Сообщение от Казанский Посмотреть сообщение
но в 34 строке Х уже не тот
Действительно. Т.к. это только одна из формул преобразования координат, в процессе "обрезки" и подготовки кода для форума упустил этот момент. Но суть осталась той же.

Да, надо было сказать что X и L2 - тестовые данные. По факту они также вычисляются.
Цитата Сообщение от Казанский Посмотреть сообщение
L2 = 1.28643 * 10 ^ -4
Это записывается как
L2 = 1.28643e-4
Спасибо за подсказку. Проскакивала мысль использовать e, но...
До этого не приходилось оперировать такими числами в коде, поэтому написал в более привычном виде ))
0
Казанский
14903 / 6306 / 1719
Регистрация: 24.09.2011
Сообщений: 9,977
19.04.2019, 17:42 124
Excel: Мастер функций подавляет точки останова и оператор Stop в пользовательской функции

Пишем простейшую функцию, вставляем оператор Stop и Msgbox.
Visual Basic
1
2
3
4
5
Function f(a, b)
  Stop
  MsgBox a & " " & b
  f = a * b
End Function
При вставке в ячейку например =f(3;4) наблюдаем останов на операторе Stop. После нажатия F5 (Continue) появляется окно сообщения, после нажатия ОК в ячейке появляется значение.
При выделенной ячейке с функцией вызываем Мастер функций (Shift+F3) - появляется MsgBox, причем 2 раза! При изменении аргумента в поле ввода Мастера опять 2 раза появляется MsgBox. И вот почему 2 раза: в окне Мастера значение функции отображается дважды - под значениями аргументов и внизу окна, после надписи "Значение:".
Видимо, эти две части окна делали разные люди, и каждый написал свой вызов функции
Можно заметить, что после первого появления MsgBox меняется значение функции под аргументами, а после второго - внизу.
Профессиональные проблемы, решения, рекомендации и ошибки

Если написать функцию, которая возвращает новое значение при каждом вызове
Visual Basic
1
2
3
Function g(x)
  g = Rnd
End Function
, можно увидеть два разных значения функции
Профессиональные проблемы, решения, рекомендации и ошибки


Вывод: не пользуйтесь Мастером функций для отладки пользовательской функции. При обычной вставке функции в ячейку точки останова и оператор Stop работают нормально.
1
19.04.2019, 17:42
bedvit
618 / 179 / 19
Регистрация: 20.05.2016
Сообщений: 726
Записей в блоге: 11
19.04.2019, 19:31 125
Казанский, Спасибо за инфо!
А вот как происходит расчет функции Rnd, в .xll (на С++)
Шаг/Итерация 1 - Выбираем функцию из списка, видим что рендомное значение посчиталось и равно 4827 (см.рис.1)
Шаг/Итерация 2 - В библиотеки вторая итерация в этой же функции, теперь рендомное значение равно 5436 (см.рис.2)
Шаг/Итерация 3 - Начинается самое интересное! Библиотека отработала, Excel дал возможность ввести данные. Вводим значение в функцию =1, видим в первом результате значение 4827 (первая итерация), во втором результате 5436 (вторая итерация), а в самой библиотеки видим новое (третье) рендомное значение 32391 (см. рис.3)
Шаг/Итерация 4 - автоматически происходит следующий шаг в точке останова с новым рендомным значением в библиотеке 14604. т.е. это четвертая итерация (напомню, Excel пока недоступен (кроме ввода единицы), это расчет идет в библиотеке. Видим результат функции уже 32392 (это наше предыдущее 32391+1), второй результат 5436 в мастере (пока без сложения) (см. рис. 4)
Шаг/Итерация 5 - заканчиваем ввод формулы в Excel, видим ужу новое рендомное значение в библиотеке 15724 (пятое), в мастере уже не видим, он закрылся. (см.рис.5)
Шаг/Итерация 6 - итоговый результат функции 15725 - наше последнее рендомное пятое значение 15724 плюс введенная единица. (см.рис.6)

При вводе данных в саму формулу, без мастера, итерация в библиотека одна (рис.7-8)

ВЫВОД: Итераций через мастер функций в Excel для библиотек .xll еще больше, далее аналогично вышесказанному - работать через Мастером функций не рекомендуется.
1
Миниатюры
Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки  

Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки  

Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки  
bedvit
618 / 179 / 19
Регистрация: 20.05.2016
Сообщений: 726
Записей в блоге: 11
19.04.2019, 23:29 126
Добавлю к выводам: видимо мастер функций в Excel работает одинаково и с VBA транслятором/кодом и библиотеками СОМ и XLL, вызывая несколько раз функцию. Хоть эта информация не относится напрямую к теме VBA, посчитал, что будет интересен этот момент.
0
19.04.2019, 23:29
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2019, 23:29

Проблемы с выводом решения на стандартный поток
Вот текст задания: Напишите программу, на вход которой даются четыре числа a, b, c и d, каждое в...

Каковы возможные решения проблемы рывков в эмуляторе?
пишу игру, кадры перерисовываются в методе, который контролируется таймером. поставил 60 кадров....

ФР Electrolube PRP, проблемы, подводные камни, решения
Не смог найти привычный POSITIV20, пришел довольствоваться тем что есть. Не работает сцуко. Во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
126
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru