Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2010, 12:35   #1
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию Преведение расчитываемого параметра к ближайшему значению из заданного массива

Есть нестандартная задача:
по определнной формуле вычисляется величина (число, дробное, положительное). Эту величину необходимо привести к значению максимально близкому из имеющегося массива значений (числа, целые, положительные, шаг изменения непостоянный). Сделать это надо одной формулой (что бы результат получить в пределах одной строки, т.к. следующая строка рассчитывает следующий параметр, который тоже надо приводить к данному массиву).
КАГ?
Если неясно изъяснился - требуйте объяснений.
KASTCHEI вне форума Ответить с цитированием
Старый 11.02.2010, 12:38   #2
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Предметнее: сделана таблица для максимально автоматизированного подсчёта сечений (площадей, длин, и т.п.) воздуховодов. Каждая строка расчитывает новый участок.
Рассчитать расчётное сечение - не проблемма. Проблемма в том, что существуют стандартизированные сечения. Вот и надо расчитаный диаметр подменить на стандартное ближайшее значение.
KASTCHEI вне форума Ответить с цитированием
Старый 11.02.2010, 20:09   #3
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте KASTCHEI.
даже после "предметного" объяснения у MS Excel не появится специализированная функция с помощью которой можно "Рассчитать расчётное сечение.."
Скорее всего нужна пользовательская функция, т.е созданная специально для решения Вашей задачи. Поместите в модуль подобный код:
Код:
Public Function besideArr(vArr As Range, vVal) As Double
Dim j#
besideArr = 1000000000
For Each v In vArr
    j = v.Value
    If Abs(vVal - j) < Abs(besideArr) Then
        besideArr = vVal - j
    End If
Next
besideArr = vVal - besideArr
End Function
и формула =besideArr(B1:B20;C5) размещенная в ячейке, отобразит значение из массива B1:B20 ближайшее значению в ячейке C5.
надеюсь правильно понял задачу.
Евгений.
P.S. форум не "машина ответов", его участники люди, и выкладывая вопрос не забывайте обращаться к тем кому Вы его адресуете, не знаете как - можно просто поздоровавшись.
Teslenko_EA вне форума Ответить с цитированием
Старый 11.02.2010, 20:23   #4
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

ВПР с параметром 1 вернет ближайшее число которое меньше искомого.

А еще желательно пример с "есть вот" и "хочу так"
Dophin вне форума Ответить с цитированием
Старый 11.02.2010, 20:30   #5
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

=ИНДЕКС(A1:A4;МИН(ЕСЛИ(ABS(C3-A1:A4)=МИН(ABS(C3-A1:A4));СТРОКА(A1:A4))))

формула массива (вводится Ctrl+shift+enter)

A1:A4 - массив для поиска
С3 - искомое значение
Вложения
Тип файла: rar формула массива.rar (3.2 Кб, 16 просмотров)
Dophin вне форума Ответить с цитированием
Старый 12.02.2010, 00:35   #6
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Здравствуйте KASTCHEI.
даже после "предметного" объяснения у MS Excel не появится специализированная функция с помощью которой можно "Рассчитать расчётное сечение.."
Скорее всего нужна пользовательская функция, т.е созданная специально для решения Вашей задачи. Поместите в модуль подобный код:
Код:
Public Function besideArr(vArr As Range, vVal) As Double
Dim j#
besideArr = 1000000000
For Each v In vArr
    j = v.Value
    If Abs(vVal - j) < Abs(besideArr) Then
        besideArr = vVal - j
    End If
Next
besideArr = vVal - besideArr
End Function
и формула =besideArr(B1:B20;C5) размещенная в ячейке, отобразит значение из массива B1:B20 ближайшее значению в ячейке C5.
надеюсь правильно понял задачу.

Спасибо за подсказку, Евгений, но вынужден признаться, что я в принципе не программист. Осваиваю всё самостоятельно и пока дальше написания макросов и перебирания формул мои успехи не доходили. Мне к сожелению не очень понятно, что же мне сделать. Ниже помещу пример таблицы и вариант своего промежуточного решения (полуполноценного).

P.S. форум не "машина ответов", его участники люди, и выкладывая вопрос не забывайте обращаться к тем кому Вы его адресуете, не знаете как - можно просто поздоровавшись.[/QUOTE]

Спасибо за совет. Учту.
KASTCHEI вне форума Ответить с цитированием
Старый 12.02.2010, 00:36   #7
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Dophin Посмотреть сообщение
ВПР с параметром 1 вернет ближайшее число которое меньше искомого.

А еще желательно пример с "есть вот" и "хочу так"

Пример с "есть вот" и "хочу так", а так же промежуточным решение помещаю ниже.
KASTCHEI вне форума Ответить с цитированием
Старый 12.02.2010, 00:48   #8
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Dophin Посмотреть сообщение
=ИНДЕКС(A1:A4;МИН(ЕСЛИ(ABS(C3-A1:A4)=МИН(ABS(C3-A1:A4));СТРОКА(A1:A4))))

формула массива (вводится Ctrl+shift+enter)

A1:A4 - массив для поиска
С3 - искомое значение
ИДЕАЛЬНО
Работает так как надо. Но я пока не впёр логику. Если не трудно - объясните юродивому.

Я так же искал наименьшую по модулю разницу между расчитанным параметром и стандартными. Но не знал как потом выбрать соответствующее значение.
Пошёл таким путём:
А6 - рассчитывемый параметр
Писал формулу:
=A6+МИН(ABS(80-A6);ABS(90-A6);ABS(100-A6);ABS(125-A6);ABS(140-A6);ABS(150-A6);ABS(160-A6))

То есть к расчитанному параметру добавлял наименьшую по модулю разницу. Но это не срабатывало с теми наименьшими по модулю разницами, которые были до приведения по модулю отрицательными числами.
Их надо было прибавлять со заком "-", а как его запомнить и вернуть выбранному значению я не знал.
KASTCHEI вне форума Ответить с цитированием
Старый 12.02.2010, 01:05   #9
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Размещаю, как обещал, пример таблицы.
Но думаю, после того, как решение найдено (ещё раз спасибо Dophin), это вряд ли кого заинтерисует.

Ещё раз прошу Dophin (если не затруднит) дать пояснения.
Вложения
Тип файла: rar Расчёт.rar (4.0 Кб, 25 просмотров)
KASTCHEI вне форума Ответить с цитированием
Старый 12.02.2010, 01:06   #10
KASTCHEI
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 17
По умолчанию

Спасибо всем откликнувшимся.
KASTCHEI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод ко-ва элементов массива меньших заданного числа в C++ xnise Помощь студентам 2 30.11.2009 19:25
Создание подпрограм.Передача массива как параметра процедуре AbrahamLincoln Помощь студентам 5 20.09.2009 19:39
Выбор строки из заданного параметра Antoha21 Microsoft Office Excel 3 24.07.2009 12:21
EXSEL (VBA) найти элемент наиболее близкий к среднему значению элементов массива Lady_Deluxe Помощь студентам 0 16.06.2009 13:45