Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/найти три минимальных значения по условию - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » найти три минимальных значения по условию (Макросы/Sub)
найти три минимальных значения по условию
eneycheva Дата: Вторник, 11.03.2014, 18:15 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток.
Сегодня озадачилась, и задачка оказалась не по зубам. Есть 2 листа, на первом находятся "Номер поставки","код товара", и прочее. На втором 2 столбца "код товара" и "цена", на один "код товара" около 5 и более цен. Задача в том что бы в листе2 по "коду товара" найти в столбце "цена" 3 минимальных значения и вставить на первый лист в столбцы W(самое минимальное) X(второе) Y(третье) соответственно. В примере наверное понятнее :) Если есть идеи, буду рада. А пока буду продолжать ломать голову.
К сообщению приложен файл: 2945761.xls (23.5 Kb)
 
Ответить
СообщениеДоброго времени суток.
Сегодня озадачилась, и задачка оказалась не по зубам. Есть 2 листа, на первом находятся "Номер поставки","код товара", и прочее. На втором 2 столбца "код товара" и "цена", на один "код товара" около 5 и более цен. Задача в том что бы в листе2 по "коду товара" найти в столбце "цена" 3 минимальных значения и вставить на первый лист в столбцы W(самое минимальное) X(второе) Y(третье) соответственно. В примере наверное понятнее :) Если есть идеи, буду рада. А пока буду продолжать ломать голову.

Автор - eneycheva
Дата добавления - 11.03.2014 в 18:15
Hugo Дата: Вторник, 11.03.2014, 18:47 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

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


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеПервым делом желательно цены преобразовать из текста в числа.
Далее получить массив значений соотв. коду товара, из массива выбрать наименьшие. Вот у меня с вторым пунктом загвоздка, не формулист я...

Автор - Hugo
Дата добавления - 11.03.2014 в 18:47
eneycheva Дата: Вторник, 11.03.2014, 18:57 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Hugo, Ой и точно, это я видимо на ночь глядя, упустила . Я первое минимальное нахожу, загвоздка со вторым и третьим
 
Ответить
СообщениеHugo, Ой и точно, это я видимо на ночь глядя, упустила . Я первое минимальное нахожу, загвоздка со вторым и третьим

Автор - eneycheva
Дата добавления - 11.03.2014 в 18:57
ikki Дата: Вторник, 11.03.2014, 19:02 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
для яч. C2, формула массива (вводится ctrl+shift+enter), протянуть вправо на 3 ячейки и вниз до конца списка.
для цен "как есть":
Код
=НАИМЕНЬШИЙ(ЕСЛИ($B2=Лист2!$B$2:$B$1000;--ПОДСТАВИТЬ(Лист2!$A$2:$A$1000;".";","));СТОЛБЕЦ(A1))

для цен, замененных на числа (см. совет Hugo):
Код
=НАИМЕНЬШИЙ(ЕСЛИ($B2=Лист2!$B$2:$B$1000;Лист2!$A$2:$A$1000);СТОЛБЕЦ(A1))


пс. если данных оч.много - пересчёт будет притормаживать.
тогда можно макросом. наверное :)


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Вторник, 11.03.2014, 19:03
 
Ответить
Сообщениедля яч. C2, формула массива (вводится ctrl+shift+enter), протянуть вправо на 3 ячейки и вниз до конца списка.
для цен "как есть":
Код
=НАИМЕНЬШИЙ(ЕСЛИ($B2=Лист2!$B$2:$B$1000;--ПОДСТАВИТЬ(Лист2!$A$2:$A$1000;".";","));СТОЛБЕЦ(A1))

для цен, замененных на числа (см. совет Hugo):
Код
=НАИМЕНЬШИЙ(ЕСЛИ($B2=Лист2!$B$2:$B$1000;Лист2!$A$2:$A$1000);СТОЛБЕЦ(A1))


пс. если данных оч.много - пересчёт будет притормаживать.
тогда можно макросом. наверное :)

Автор - ikki
Дата добавления - 11.03.2014 в 19:02
eneycheva Дата: Вторник, 11.03.2014, 19:16 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ikki, спасибо :) Данных действительно много, так что, буду усердствовать над макросом
 
Ответить
Сообщениеikki, спасибо :) Данных действительно много, так что, буду усердствовать над макросом

Автор - eneycheva
Дата добавления - 11.03.2014 в 19:16
ikki Дата: Вторник, 11.03.2014, 20:01 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
вот, родился какой-никакой вариант.
уверен, что не оптимальный по скорости.
но вполне рабочий.
[vba]
Код
Sub t()
     Dim y#(), e()
     a = Range(Sheets(1).[b2], Sheets(1).Cells(Rows.Count, 2).End(xlUp)).Value
     ReDim b(1 To UBound(a), 1 To 4): Set d = CreateObject("scripting.dictionary")
     For Each x In a
         If Not d.exists(x) Then j = j + 1: d.Item(x) = j
     Next
     c = Range(Sheets(2).[a2], Sheets(2).Cells(Rows.Count, 2).End(xlUp)).Value
     For i = 1 To UBound(c)
         If d.exists(c(i, 2)) Then b(d.Item(c(i, 2)), 1) = b(d.Item(c(i, 2)), 1) & "|" & c(i, 1)
     Next
     For i = 1 To j
         x = Split(Mid(b(i, 1), 2), "|"): ReDim y(0 To UBound(x))
         For k = 0 To UBound(x): y(k) = CDbl(x(k)): Next
         For k = 1 To 3: b(i, k + 1) = Application.Small(y, k): Next
     Next
     ReDim e(1 To UBound(a), 1 To 3)
     For i = 1 To UBound(a)
         x = d.Item(a(i, 1)): e(i, 1) = b(x, 2): e(i, 2) = b(x, 3): e(i, 3) = b(x, 4)
     Next
     Sheets(1).[c2].Resize(UBound(a), 3).Value = e
End Sub
[/vba]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениевот, родился какой-никакой вариант.
уверен, что не оптимальный по скорости.
но вполне рабочий.
[vba]
Код
Sub t()
     Dim y#(), e()
     a = Range(Sheets(1).[b2], Sheets(1).Cells(Rows.Count, 2).End(xlUp)).Value
     ReDim b(1 To UBound(a), 1 To 4): Set d = CreateObject("scripting.dictionary")
     For Each x In a
         If Not d.exists(x) Then j = j + 1: d.Item(x) = j
     Next
     c = Range(Sheets(2).[a2], Sheets(2).Cells(Rows.Count, 2).End(xlUp)).Value
     For i = 1 To UBound(c)
         If d.exists(c(i, 2)) Then b(d.Item(c(i, 2)), 1) = b(d.Item(c(i, 2)), 1) & "|" & c(i, 1)
     Next
     For i = 1 To j
         x = Split(Mid(b(i, 1), 2), "|"): ReDim y(0 To UBound(x))
         For k = 0 To UBound(x): y(k) = CDbl(x(k)): Next
         For k = 1 To 3: b(i, k + 1) = Application.Small(y, k): Next
     Next
     ReDim e(1 To UBound(a), 1 To 3)
     For i = 1 To UBound(a)
         x = d.Item(a(i, 1)): e(i, 1) = b(x, 2): e(i, 2) = b(x, 3): e(i, 3) = b(x, 4)
     Next
     Sheets(1).[c2].Resize(UBound(a), 3).Value = e
End Sub
[/vba]

Автор - ikki
Дата добавления - 11.03.2014 в 20:01
eneycheva Дата: Вторник, 11.03.2014, 21:08 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ikki, Огромное спасибо, все работает. Сейчас буду разбираться, что бы в следующий раз уже без помощи обходиться :)
 
Ответить
Сообщениеikki, Огромное спасибо, все работает. Сейчас буду разбираться, что бы в следующий раз уже без помощи обходиться :)

Автор - eneycheva
Дата добавления - 11.03.2014 в 21:08
Мир MS Excel » Вопросы и решения » Вопросы по VBA » найти три минимальных значения по условию (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!