Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли упростить выражение? 
:(
    Опции темы
PILOT
Дата 9.6.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Код

=(ЕСЛИ(((B10*Лист2!B7)>Лист2!C7);Лист2!E7;Лист2!D7)+ЕСЛИ(((B10*Лист2!B8)>Лист2!C8);Лист2!E8;Лист2!D8)+ЕСЛИ(((B10*Лист2!B8)>Лист2!C9);Лист2!E9;Лист2!D9)+ЕСЛИ(((B10*Лист2!B9)>Лист2!C9);Лист2!E9;Лист2!D9)+ЕСЛИ(((B10*Лист2!B10)>Лист2!C10);Лист2!E10;Лист2!D10)+ЕСЛИ(((B10*Лист2!B11)>Лист2!C11);Лист2!E11;Лист2!D11)+ЕСЛИ(((B10*Лист2!B12)>Лист2!C12);Лист2!E12;Лист2!D12)+ЕСЛИ(((B10*Лист2!B13)>Лист2!C13);Лист2!E13;Лист2!D13)+ЕСЛИ(((B10*Лист2!B14)>Лист2!C14);Лист2!E14;Лист2!D14)+ЕСЛИ(((B10*Лист2!B15)>Лист2!C15);Лист2!E15;Лист2!D15)+ЕСЛИ(((B10*Лист2!B16)>Лист2!C16);Лист2!E16;Лист2!D16)+ЕСЛИ(((B10*Лист2!B17)>Лист2!C17);Лист2!E17;Лист2!D17)+ЕСЛИ(((B10*Лист2!B18)>Лист2!C18);Лист2!E18;Лист2!D18)+ЕСЛИ(((B10*Лист2!B19)>Лист2!C19);Лист2!E19;Лист2!D19)+ЕСЛИ(((B10*Лист2!B20)>Лист2!C20);Лист2!E20;Лист2!D20))*B10


А то ужас какой-то получается smile редактировать это все.

СУВ. 


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
2man
Дата 9.6.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: 1
Всего: 71



Ты можешь необходимые данные для расчета вывести в таблицу на том листе, где считаешь данную формулу. Так ты сэкономишь время и например запись:
Код

=(ЕСЛИ(((B10*Лист2!B7)>Лист2!C7);

будет выглядеть как:
Код

=(ЕСЛИ(((B10*В7)>В4);

 


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
PILOT
Дата 9.6.2006, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Это понятно. Но все равно приходится каждую строку править.
Суть вот в чем, есть некая таблица:

      Наименование    Кол-во на 10 м2    Опт.    Цена (розница)    Цена (оптовая)
1    Краска синяя            1          100          6.60              4.13
2    Краска голубая          1          20           12.68             12.68
3    Краска голубая (мет)    2          30           0.70              0.50
4    Краска красная          1          40           5.50              4.50
5    Краска красная (мет)    1          50           16.80             13.00
6    Краска зеленая          1          100          34.72             31.92
7    Краска зеленая (мет)    1          500          14.86             10.73
8    Лак акриловый (ТИП1)    1          80           6.60              4.13
9    Лак акриловый (ТИП3)    3          20           0.55              0.45
10   Лак акриловый (ЛА4)     2          100          0.55              0.45
11   Цемент (Ц-311)          3          250          0.55              0.45
12   Цемент (Ц-311А)         0          30           8.12              7.00


Хочется иметь функцию, которая на входе имея кол-во квадратных метров считала стоимость в зав-ти от цены поставщика, с учетом того, попадает ли кол-во закупаемого материала в Оптовую или в Розничную цены.
Т.е. выполняла бы функцию:
Код

function(MaterialMaxNum,InputSquareMeters)
begin
 for i:=1 to MaterialMaxNum do begin
  if MaterialCount*InputSquareMeters>MaterialOptCount[i] then begin
   AllMaterialsPrice:=AllMaterialsPrice+MaterialOptPrice[i]
  end
  else begin
   AllMaterialsPrice:=AllMaterialsPrice+MaterialRoznPrice[i]
  end;
 end;
end;


СУВ.  


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Aloha
Дата 10.6.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 16
Всего: 165



PILOT
Думается, можно создать пользовательскую функцию вида:
Код
Function AllMaterialsPrice(MaterialCount As Range, _
                           InputSquareMeters As Range, _
                           MaterialOptCount As Range, _
                           MaterialRoznPrice As Range, _
                           MaterialOptPrice As Range) 
  RowsCount = InputSquareMeters.Rows.Count 
  For i = 1 To RowsCount
    If MaterialCount * InputSquareMeters.Rows(i) > MaterialOptCount.Rows(i) Then
      AllMaterialsPrice = AllMaterialsPrice + MaterialOptPrice.Rows(i)
    Else
      AllMaterialsPrice = AllMaterialsPrice + MaterialRoznPrice.Rows(i)
    End If
  Next i
  AllMaterialsPrice = AllMaterialsPrice * MaterialCount
End Function
(если поместить ее в стандартный модуль, она будет доступна в "Мастере функций" в категории "Определенные пользователем")

Примечание: в длинной формуле конечный результат суммирования умножается на значение MaterialCount:
... ;Лист2!D20))*B10
а в "дельфийской" функции этого нет. В общем я подумал, что правильный вариант подразумевает умножение на MaterialCount.

Если же использование пользовательской функции по каким-либо причинам неудобно, то, как мне кажется, самый простой вариант – добавить в итоговую таблицу столбец для расчета промежуточных значений с формулой типа:
= ЕСЛИ(Лист1!$B$10 * B7 > C7; E7; D7)
а потом просто считать сумму по этому столбцу и умножать ее на Лист1!$B$10

P.S.    В исходной формуле есть фрагмент
ЕСЛИ(((B10*Лист2!B8)>Лист2!C9);Лист2!E9;Лист2!D9)
и следом идет
ЕСЛИ(((B10*Лист2!B9)>Лист2!C9);Лист2!E9;Лист2!D9)
Мне кажется, первый фрагмент - лишний.  

P.S.2    Если в исходной формуле, например в Word’е, заменить   +   на   +^p   или на   +^l  (т.е. разбить на абзацы или на строки), затем скопировать и вставить в Excel’е в "Сроку формул", то разбиение формулы на строки сохраниться. Это, конечно, не решит поставленную задачу, но длинные формулы читать будет легче.      

Это сообщение отредактировал(а) Aloha - 10.6.2006, 23:28
PM   Вверх
PILOT
Дата 11.6.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



За время пока ответов не было написал вот такой ужас:
Код

Public Function СтоимостьЭРИ(МК, КоличествоИзделий) As Double
Set МассивКомпонентов = Range("Компоненты")
ОбщаяСтоимость = 0
КоличествоИзделий = МассивКомпонентов.Cells(1, 1) * КоличествоИзделий
For i = 1 To 70
 Tmp1 = КоличествоИзделий * МассивКомпонентов.Cells(i, 1)
 Tmp2 = МассивКомпонентов.Cells(i, 2)
 If (Tmp1 >= Tmp2) Then
  ОбщаяСтоимость = ОбщаяСтоимость + (МассивКомпонентов.Cells(i, 1) * КоличествоИзделий * МассивКомпонентов.Cells(i, 6))
 Else
  ОбщаяСтоимость = ОбщаяСтоимость + (МассивКомпонентов.Cells(i, 1) * КоличествоИзделий * МассивКомпонентов.Cells(i, 5))
 End If
Next
СтоимостьЭРИ = ОбщаяСтоимость
End Function

Теперь хочется Aloha's код запиндюрить, уж больно хорош. Только проблема в определении размера таблицы (у меня от безысходности сделано фиксированное число строк).

Спасибо!

СУВ.   


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Staruha
Дата 11.6.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 6
Всего: 27





--------------------
Возмездие настигнет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Работа с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Работа с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.