VBA Excel - линейная интерполяция
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Excel - линейная интерполяция

VBA Excel - линейная интерполяция

Ответ
Поиск в этой теме
Непрочитано 07.07.2014, 18:49 #1
VBA Excel - линейная интерполяция
Baires
 
94597
Регистрация: 05.05.2005
Сообщений: 900

Есть ли у кого готовый код для линейной интерполяции в VBA Excel?
Можно найти на просторах интернета, но если у кого-то есть уже опробованная програмка - было бы отлично.
__________________
Free advice is worth what you pay for it. (Often)
Просмотров: 8892
 
Непрочитано 07.07.2014, 19:14
#2
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


http://www.sql.ru/forum/328569/poisk...ogo-znacheniya



Код:
[Выделить все]
Function doub_int(InArray, arg_vertic, arg_goris)

 


num_of_rows = InArray.Rows.Count
num_of_cols = InArray.Columns.Count


doub_int = "n/a"


If arg_vertic >= InArray(2, 1) And arg_goris >= InArray(1, 2) And arg_vertic <= InArray(num_of_rows, 1) And arg_goris <= InArray(1, num_of_cols) Then
i = 2
j = 2
Do
x1 = InArray(i, 1)
x2 = InArray(i + 1, 1)

i = i + 1
Loop Until arg_vertic >= x1 And arg_vertic <= x2
Do
y1 = InArray(1, j)
y2 = InArray(1, j + 1)
j = j + 1
Loop Until arg_goris >= y1 And arg_goris <= y2
i = i - 1
j = j - 1
a1 = InArray(i, j)
a2 = InArray(i, j + 1)
a3 = InArray(i + 1, j)
a4 = InArray(i + 1, j + 1)

If x2 - x1 > 0 Then
res1 = a1 + (a3 - a1) * (arg_vertic - x1) / (x2 - x1)
res2 = a2 + (a4 - a2) * (arg_vertic - x1) / (x2 - x1)
End If

If y2 - y1 > 0 Then
doub_int = res1 + (res2 - res1) * (arg_goris - y1) / (y2 - y1)
End If
End If

End Function
Для опен офис бэйсик замена

Цитата:
num_of_rows = UBound(InArray, 1)
num_of_cols = UBound(InArray, 2)
Вложения
Тип файла: zip doub_int.zip (7.9 Кб, 161 просмотров)

Последний раз редактировалось ETCartman, 07.07.2014 в 19:27.
ETCartman вне форума  
 
Автор темы   Непрочитано 07.07.2014, 19:50
#3
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Спасибо, это для общего случая двойной интерполяции.
У меня всего лишь:
If Ar <= 2.5, Cd = 2
If Ar = 7, Cd = 1.4
If Ar >= 25, Cd = 2.0

Надо посчитать промежуточные значения.

В макросе можно наверное также использовать чисто екселовкую функцию для интерполяции.

Кстати Cd это drag coefficient ветровой нагрузки в зависимости от aspect ratio , например, плоской антенны или элемента башни при подсчёте ветровых нагрузок по новому только что вышедшему канадскому снипу по антенным сооружениям.
__________________
Free advice is worth what you pay for it. (Often)
Baires вне форума  
 
Непрочитано 07.07.2014, 20:13
#4
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


Цитата:
Сообщение от Baires Посмотреть сообщение
Спасибо, это для общего случая двойной интерполяции.
У меня всего лишь:
If Ar <= 2.5, Cd = 2
If Ar = 7, Cd = 1.4
If Ar >= 25, Cd = 2.0

Надо посчитать промежуточные значения.

.
Select Case как то так
Можно без VBA через IF(...) но VBA наглядней
канадский снип случайно не открыт для всеобщего доступа? аналог TIA-222?
нет ли опечатки в том что вы написали?
Вложения
Тип файла: zip case.zip (7.0 Кб, 61 просмотров)

Последний раз редактировалось ETCartman, 07.07.2014 в 20:19.
ETCartman вне форума  
 
Автор темы   Непрочитано 07.07.2014, 21:05
#5
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Цитата:
Сообщение от ETCartman Посмотреть сообщение
Цитата:
Сообщение от Baires
Спасибо, это для общего случая двойной интерполяции.
У меня всего лишь:
If Ar <= 2.5, Cd = 2
If Ar = 7, Cd = 1.4
If Ar >= 25, Cd = 2.0

Надо посчитать промежуточные значения.

.
Select Case как то так
Можно без VBA через IF(...) но VBA наглядней
канадский снип случайно не открыт для всеобщего доступа? аналог TIA-222?
нет ли опечатки в том что вы написали?
Да, конечно ошибка в первой строке: If Ar <= 2.5, Cd = 1,2
Канадский S37-13 почти копия последнего TIA-222. Предыдущая версия, S37-01 (2001г.) имела больше отличий от американцев.

----- добавлено через 12 сек. -----
Спасибо, всё работает отлично.
По твоему примеру (из блога в твоей подписи) начал понемногу делать утилиты для эскселя в VBA.
Один примитивный вопрос для спеца но сложный для меня :
Можно ли написать в ВБА функцию которая возвращала бы два значения в зависимости от значения двух аргументов, но аргументы были бы текстовыми значениями (например "Flat" или "Rond")?
__________________
Free advice is worth what you pay for it. (Often)

Последний раз редактировалось Baires, 07.07.2014 в 23:17.
Baires вне форума  
 
Непрочитано 07.07.2014, 23:44
#6
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


Да, можно. Просто введите через запятую переменную типа key_of_shape (текстовую или не важно если вы тип не объявляете - по умолчанию Variant)
и сделайте внутри функции два варианта расчета с использованием IF ...Then
If key_of_shape="Flat" Then
......
End If
Я в основном стараюсь писать не для VBA а для опен-офис, там есть некоторые преимущества в языке (хотя в принципе все очень похоже если брать математику)
а именно - функции массива проще писать. Таким образом можно написать функцию которая сразу возвращает таблицу значений целиком (с заголовками и пр)
Есть довольно много статей на эти темы - тут например. Basic вообще очень удобен для простых расчетов (то есть не то чтобы программиста из себя изображать, а просто делать быстро) - особенно в англоязычной среде
Снабдил программу комментариями, вот как бы и в репорт можно вставлять.

Последний раз редактировалось ETCartman, 07.07.2014 в 23:51.
ETCartman вне форума  
 
Автор темы   Непрочитано 08.07.2014, 00:24
#7
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Спасибо, ça marche, т.е. оно заработало!
Я немножко ошибся в синтасисе if then, для выбора из двух значений надо было написать две строки.
__________________
Free advice is worth what you pay for it. (Often)
Baires вне форума  
 
Непрочитано 08.07.2014, 00:30
#8
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


если варианта всего два, то можно if-then писать один раз в принципе. То есть сначала идет вычисление для какого то одного, например Flat, и выводится результат в конце. После этого можно сделать If ...round
и писать уже для круглого и выводить значение функции для круглого. Если первое - то расчет не пойдет дальше if, если второе - то посчитает сначала первое, а потом окончательно пересчитает уже внутри If.
Хотя прописывать If для каждого отдельно - методологически вернее и быстрее.
Хотя Время счета сейчас как правило роли не играет, в таких вычислениях. ЧТо одна миллисекунда, что две.
Для скорости счета там много отдельных рекомендаций - переменные нужно объявлять и так далее.
вот есть статья на тему скорости http://myooo.ru/content/view/116/95/ (верная отчасти и для VBA)

Последний раз редактировалось ETCartman, 08.07.2014 в 00:48.
ETCartman вне форума  
 
Автор темы   Непрочитано 08.07.2014, 19:00
#9
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Снова привет техасцам!
Сделал одну функцию - возвращает нулевое значение.
Проверил как процедуру - работает корректон. Не понимаю что происходит, можете посмотреть?
Вложения
Тип файла: zip Test Sub-Function.zip (517 байт, 36 просмотров)
__________________
Free advice is worth what you pay for it. (Often)
Baires вне форума  
 
Непрочитано 08.07.2014, 19:05
#10
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


вы по ошибке заархивировали ярлык - не сам файл
думаю что ошибка может быть в присвоении значения (типа имя напутано или что то в этом роде)
ETCartman вне форума  
 
Автор темы   Непрочитано 08.07.2014, 19:12
#11
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Уже дошло - был временный приступ тупости
В коде функции надо было в конце присвоить значение результата значения функции.

Всё равно, посмотрите код если есть пару минут, уверен там можно оптимизировать много чего
Вложения
Тип файла: zip ___Tests.zip (28.9 Кб, 55 просмотров)
__________________
Free advice is worth what you pay for it. (Often)
Baires вне форума  
 
Непрочитано 08.07.2014, 19:42
#12
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


У вас функция как бы наполовину привязана к конкретному листу
то есть - часть значений вы берете из ячеек. В принципе можно было бы просто записать valCeFunction(Hx1, Cg,Ca ...) и так далее
могу пояснить зачем - во первых если вы ее и дальше будете использовать в работе (делать другой видоизмененный расчет) - вам не надо переадресовывать переменные (вы также можете двигать их для дизайна как угодно)
Во вторых если вы будете писать какую то другую функцию - вы сможете ссылаться из вашего кода на вашу функцию используя промежуточные результаты как аргументы

Например пишете функцию с внутренними усилиями в балке и тут же естественно проверить ее по нормам. А у вас такая проверка есть уже. Таким образом легко совместить все предыдущие наработки с новыми.


В третьих если вы захотите написать программу отдельную от Excel вообще - например на вижуал Бэйсик, вам можно будет просто скопировать ваши функции туда.
Учитывая что интерфейс рисуется визуально, сделать расчет полностью отдельным от офиса труда большого не составляет

Если вам хочется чтобы аргумент был все таки один - можете оформить его как массив и подцеплять с листа выделением диапазона. А потом уже ранжиовать - что значит первый элемент массива, что второй и так далее. Тут много вариантов.

Можно генерировать целый многострочный отчет в одной функции которая возвращает многострочную переменную - с выкладками и разными результатами.

Последний раз редактировалось ETCartman, 08.07.2014 в 21:01.
ETCartman вне форума  
 
Автор темы   Непрочитано 08.07.2014, 21:51
#13
Baires


 
Регистрация: 05.05.2005
94597
Сообщений: 900


Цитата:
Сообщение от ETCartman Посмотреть сообщение
У вас функция как бы наполовину привязана к конкретному листу
то есть - часть значений вы берете из ячеек. В принципе можно было бы просто записать valCeFunction(Hx1, Cg,Ca ...) и так далее
могу пояснить зачем - во первых если вы ее и дальше будете использовать в работе (делать другой видоизмененный расчет) - вам не надо переадресовывать переменные (вы также можете двигать их для дизайна как угодно)
Во вторых если вы будете писать какую то другую функцию - вы сможете ссылаться из вашего кода на вашу функцию используя промежуточные результаты как аргументы
Вопрос - если я буду ссылаться из другой функции на эту функцию с несколькими аргументами (Hx1, Cg,Ca ...), они (аргументы) будут становиться аргументами уже этой новой функции, которая включает предыдущую?
__________________
Free advice is worth what you pay for it. (Often)
Baires вне форума  
 
Непрочитано 08.07.2014, 21:59
#14
ETCartman


 
Регистрация: 09.12.2008
Сообщений: 4,643


да.
смысл в том что функция может быть использована как в коде бэйсик (для получения промежуточных результатов) так и в рабочей книге как стандартная функция эксель. в этом случае вы приобретаете достоинства модульности своих программ. То есть у вас есть некоторая коллекция функций, которые вы по мере надобности вставляете в шаблоны для расчета и комбинируете как хотите.
это проще чем каждый отдельный шаблон по хитрому переделывать.
ETCartman вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Excel - линейная интерполяция



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сквозная нумерация листов через поля Sta1917 Программирование 6 13.11.2012 00:27
как скопировать ячейки excel в чертеж AutuCAD vestes AutoCAD 5 14.06.2011 00:37
Подключение Excel к AutoCad 2008 c помощью базы ODBC Eddicordo AutoCAD 4 03.02.2011 17:01
Проблема вставки диаграмм в ACAD 2009 из Excel 2007 ST2 AutoCAD 1 26.05.2009 01:30