Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/603: Рейтинг темы: голосов - 603, средняя оценка - 4.69
237 / 148 / 41
Регистрация: 26.01.2019
Сообщений: 545
27.02.2019, 23:38 121
Author24 — интернет-сервис помощи студентам
Фактически это проблемой/багом не является, но для меня было некоторое удивление, что в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2019, 23:38
Ответы с готовыми решениями:

Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
В этой теме перечень полезных тем для начинающих. Обсуждение введите в самих темах. Для включения...

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

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

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

126
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
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
237 / 148 / 41
Регистрация: 26.01.2019
Сообщений: 545
28.02.2019, 08:09 123
Цитата Сообщение от Казанский Посмотреть сообщение
Что за задача, в которой потребовались такие длинные выражения?
Преобразование геодезических координат по ГОСТу

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

Да, надо было сказать что X и L2 - тестовые данные. По факту они также вычисляются.
Цитата Сообщение от Казанский Посмотреть сообщение
L2 = 1.28643 * 10 ^ -4
Это записывается как
L2 = 1.28643e-4
Спасибо за подсказку. Проскакивала мысль использовать e, но...
До этого не приходилось оперировать такими числами в коде, поэтому написал в более привычном виде ))
0
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
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
1144 / 238 / 21
Регистрация: 20.05.2016
Сообщений: 1,068
Записей в блоге: 21
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 еще больше, далее аналогично вышесказанному - работать через Мастером функций не рекомендуется.
Миниатюры
Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки  

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

Профессиональные проблемы, решения, рекомендации и ошибки   Профессиональные проблемы, решения, рекомендации и ошибки  
2
1144 / 238 / 21
Регистрация: 20.05.2016
Сообщений: 1,068
Записей в блоге: 21
19.04.2019, 23:29 126
Добавлю к выводам: видимо мастер функций в Excel работает одинаково и с VBA транслятором/кодом и библиотеками СОМ и XLL, вызывая несколько раз функцию. Хоть эта информация не относится напрямую к теме VBA, посчитал, что будет интересен этот момент.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 449
26.09.2022, 23:27  [ТС] 127
Прям не выдержал!
картина первая, хорошая: стартуемся с какой-то функции ... отлично! бегаем, работаем. потом ловим кетч в методе DeforeClose на закрытии книги и - все хорошо! в теле функции весь код жив! - переменные, объекты - бери, пользуй ...
картина вторая, плохая: стартуемся как и выше, потом ловим кетч, к примеру на какой-то селекте прямо в "ЭтаКнига", бегаем там по циклу на выходя, отдаем DoEvent ... работаем дальше и ловим кетч в методе BeforeClose на закрытии книги и - все плохо! весь код сдох, все ушли на базу - ни переменных, ни объектов - ни-че-го! пустое поле! все NULL
Не все системные события друг на друга так реагируют
0
26.09.2022, 23:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2022, 23:27
Помогаю со студенческими работами здесь

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

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

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

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

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

BDE - ошибки и решения
Доброго всем дня. Нужна помощь/совет. Есть программа на Delphi, исходников нету - не мной...


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

Или воспользуйтесь поиском по форуму:
127
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru