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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2014, 15:23   #1
Seraf01
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 10
Радость Определение max значения при условии

Всем привет! Помогите реализовать следующую формулу программным кодом: ячейка Ci {=max(if($A$1:$A$100=Ai;$B$1:$B$100 ))}, i = 1,...,20 000. Прилагаю пример. Всем заранее большущие спасибо!
Вложения
Тип файла: zip Primer.zip (7.2 Кб, 13 просмотров)
Seraf01 вне форума Ответить с цитированием
Старый 08.10.2014, 19:22   #2
Ves67
 
Регистрация: 05.10.2014
Сообщений: 7
По умолчанию

Код:
Sub pMax()
Dim dic As Object
Dim i As Long
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 11
If dic.Exists(Cells(i, 1).Value) Then
If dic.Item(Cells(i, 1).Value) < Cells(i, 2) Then
dic.Item(Cells(i, 1).Value) = Cells(i, 2)
End If
Else
dic.Add Cells(i, 1).Value, Cells(i, 2).Value
End If
Next
For i = 2 To 11
Cells(i, 3) = dic.Item(Cells(i, 1).Value)
Next
End Sub
Ves67 вне форума Ответить с цитированием
Старый 08.10.2014, 23:54   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub SetMaxVal()
  Dim r As Long
  For r = 2 To 11
    Cells(r, 3) = MaxBEqA(Range("A2:A11"), Cells(r, 1))
  Next
End Sub


Function MaxBEqA(Rg As Range, V)
  Dim r As Long, m As Double
  m = Application.Min(Rg.Offset(0, 1))
  For r = Rg.Row To Rg.Row + Rg.Rows.Count - 1
    If Rg.Cells(1 + r - Rg.Row) = V And Rg.Cells(1 + r - Rg.Row).Offset(0, 1) > m Then m = Rg.Cells(1 + r - Rg.Row).Offset(0, 1)
  Next
  MaxBEqA = m
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.10.2014, 10:20   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

"До кучи" предложу еще один вариант. Это существенно проще, но есть условие: рабочая таблица должна иметь заголовки. Думаю, это не критично.
Код:
Sub qq()
    Dim i As Integer, j As Integer: Application.ScreenUpdating = False
    j = Cells(Rows.Count, 1).End(xlUp).Row + 1: Cells(j, 1) = [A1]
    For i = 2 To 11
        Cells(j + 1, 1) = Cells(i, 1)
        Cells(i, 3) = Application.DMax([A1:B11], 2, Cells(j, 1).Resize(2))
    Next
    Cells(j, 1).Resize(2).ClearContents
End Sub
Пример во вложении.
Вложения
Тип файла: rar Primer.rar (15.7 Кб, 8 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 09.10.2014, 16:54   #5
Seraf01
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 10
По умолчанию

Всем большое спасибо, выручили!!!
Seraf01 вне форума Ответить с цитированием
Старый 09.10.2014, 17:46   #6
Seraf01
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 10
По умолчанию

Отдельное спасибо, всего за 3 мин. макрос обработал 20 000 строк, пока это рекорд по времени!
Seraf01 вне форума Ответить с цитированием
Старый 09.10.2014, 17:47   #7
Seraf01
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 10
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
"До кучи" предложу еще один вариант. Это существенно проще, но есть условие: рабочая таблица должна иметь заголовки. Думаю, это не критично.
Код:
Sub qq()
    Dim i As Integer, j As Integer: Application.ScreenUpdating = False
    j = Cells(Rows.Count, 1).End(xlUp).Row + 1: Cells(j, 1) = [A1]
    For i = 2 To 11
        Cells(j + 1, 1) = Cells(i, 1)
        Cells(i, 3) = Application.DMax([A1:B11], 2, Cells(j, 1).Resize(2))
    Next
    Cells(j, 1).Resize(2).ClearContents
End Sub
Пример во вложении.
Всего за 3 мин. макрос обработал 20 000 строк, пока это рекорд по времени!
Seraf01 вне форума Ответить с цитированием
Старый 09.10.2014, 20:30   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ну, если реальные данные и со временем побороться...
Код:
Sub SetMax()
  Dim lr As Long, r As Long, c As Long, tm As Double
  tm = Timer
  Application.EnableEvents = False:  Application.ScreenUpdating = False:
  Columns(1).Insert
  lr = Cells(Rows.Count, 2).End(xlUp).Row
  Range(Cells(2, 1), Cells(lr, 1)).Formula = "=row()"
  Range(Cells(2, 1), Cells(lr, 1)).Copy
  Cells(2, 1).PasteSpecial Paste:=xlPasteValues
  With ActiveSheet.Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("B2:B" & lr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("C2:C" & lr), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    .SetRange Range("A1:C" & lr): .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
    r = 2
    Do While r < lr
      c = WorksheetFunction.CountIf(Range(Cells(r, 2), Cells(lr, 2)), Cells(r, 2))
      Range(Cells(r, 4), Cells(r + c - 1, 4)) = Cells(r, 3)
      r = r + c
    Loop
    .SortFields.Clear
    .SortFields.Add Key:=Range("A2:A" & lr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A1:D" & lr): .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
  End With
  Columns(1).Delete:  Application.EnableEvents = True:  Application.ScreenUpdating = True
  Cells(1, 1) = Timer - tm
End Sub
в ячейке А1 - время в секундах, зависит от данных но может быть и меньше 1 сек.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.10.2014, 11:26   #9
Seraf01
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 10
По умолчанию

IgorGO, макрос обработал 19591 строчку за 63 сек., это то что надо, вам огромное спасибо!) Но к сожалению, я не смог настроить макрос под необходимую форму, помогите плиз!)
Вложения
Тип файла: zip Primer.zip (14.6 Кб, 11 просмотров)
Seraf01 вне форума Ответить с цитированием
Старый 12.10.2014, 12:14   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub SetMax()
  Dim lr As Long, r As Long, c As Long, tm As Double
  tm = Timer
  Application.EnableEvents = False:  Application.ScreenUpdating = False:
  Columns(1).Insert
  lr = Cells(Rows.Count, 5).End(xlUp).Row
  Range(Cells(12, 1), Cells(lr, 1)).Formula = "=row()"
  Range(Cells(12, 1), Cells(lr, 1)).Copy
  Cells(12, 1).PasteSpecial Paste:=xlPasteValues
  With ActiveSheet.Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("E11:E" & lr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("AS11:AS" & lr), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    .SetRange Range("A11:AT" & lr): .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
    r = 12
    Do While r < lr
      c = WorksheetFunction.CountIf(Range(Cells(r, 5), Cells(lr, 5)), Cells(r, 5))
      Range(Cells(r, 46), Cells(r + c - 1, 46)) = Cells(r, 45)
      r = r + c
    Loop
    .SortFields.Clear
    .SortFields.Add Key:=Range("A11:A" & lr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A11:AT" & lr): .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
  End With
  Columns(1).Delete:  Application.EnableEvents = True:  Application.ScreenUpdating = True
  MsgBox Timer - tm
End Sub
20 тыс.строк при 64 разных значениях в колонке Д, процедура сделала за 2.5 сек.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена значения при условии dariya92 Microsoft Office Excel 0 21.07.2012 15:34
Определение позиции значения (номер столбца) при повторениях Exel 2003 Ирина Розанова Microsoft Office Excel 5 17.02.2012 23:37
Определение табличного значения имея изначально 2 исходных значения? Михаил К. Общие вопросы Delphi 2 18.06.2011 21:32
определить значения выражения z=max (a,2b)*max(2a-b,b)(алгоритм функция) анжелка Паскаль, Turbo Pascal, PascalABC.NET 2 04.04.2011 08:53
Копирование значения в другой столбец при определенном условии stasbz Microsoft Office Excel 1 01.07.2009 23:55