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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2009, 22:31   #1
Tidus
Форумчанин
 
Регистрация: 08.09.2009
Сообщений: 133
По умолчанию Выбор и перенос максимальных значений из столбца с учетом временного интервала.

Имеем два столбца - столбец А - время, и столбец B - значения. Cтолбцу А соответствуют значения в столбце B:
А............B
00:00 1,6551
00:05 1,6552
00:10 1,6553
00:15 1,6554
00:20 1,6555

00:25 1,6556
00:30 1,6557
00:00 1,6558
00:05 1,6559
00:10 1,6560
00:15 1,6564
00:20 1,6550

00:25 1,6580
00:30 1,6530
00:40 1,6535
00:00 1,6545
00:05 1,6561
00:10 1,6530
00:15 1,6522
00:20 1,6541

00:25 1,6600
00:30 1,6530
00:35 1,6500

Обратите внимание, что в первом столбце временной интервал от 00:00 до 00:20 повторяется ТРИ раза.
Задача. Как ДЛЯ КАЖДОГО из трёх временных интервалов выбрать НАИБОЛЬШЕЕ значение из интервала 00:00-00:20 и вывести в отдельную строчку результат, который должен быть таким:
1,6555 - наибольшее значение в первом интервале 00:00-00:20
1,6564 - наибольшее значение во втором интервале 00:00-00:20
1,6561 - наибольшее значение в третьем интервале 00:00-00:20

Пробовал решить проблему через формулу: =МАКС(диапазон) - решается неплохо, НО что делать, когда миллион строчек?))))) Не каждый же раз вводить эту формулу и выбирать диапазон, замучаешься.
Я так понял, что без макроса здесь не обойтись. Буду очень признателен, если кто-нибудь поможет.
С Уважением, Владимир.

Последний раз редактировалось Tidus; 08.09.2009 в 22:34.
Tidus вне форума Ответить с цитированием
Старый 09.09.2009, 00:37   #2
DJOV
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 5
По умолчанию

А значения временных интервалов всегда находится в указанных вами строчках, то есть в одном и том же месте таблицы? Если да, то я знаю как решить данную проблему по крайней мере в 2007 офисе.
DJOV вне форума Ответить с цитированием
Старый 09.09.2009, 01:06   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Владимир, попробуйте следующий файл. Макрос запускается при нажатии на кнопку и ищет в нужных диапазонах максимумы и выводит их в 3 ячейки C1-C3.
Вложения
Тип файла: rar test3.rar (16.1 Кб, 44 просмотров)
motorway вне форума Ответить с цитированием
Старый 09.09.2009, 01:53   #4
Tidus
Форумчанин
 
Регистрация: 08.09.2009
Сообщений: 133
По умолчанию

Range("C1").Formula = "=MAX(B" & Cells(1, 9) & ":B" & Cells(1, 8) & ")"
'Range("C1").Calculate
Range("C2").Formula = "=MAX(B" & Cells(2, 9) & ":B" & Cells(2, 8) & ")"
Range("C3").Formula = "=MAX(B" & Cells(3, 9) & ":B" & Cells(3, 8) & ")"
Range("H1:J3").Value = ""
End Sub

Спасибо за код. Но есть недостаток. Здесь видно, что вы для каждой строки расписываете в какую ячейку она будет выгружаться, благо - строк всего 3. А если таких строк миллион...Может лучше сделать, чтобы макрос рядом выгружал справа в столбец найденные данные по-порядку, чтобы в коде макроса не указывать каждую строчку по отдельности. Я конечно не программист, просто так подумал, если что поправьте...Если не затруднит, выложите пожалуйста второй вариант.

Последний раз редактировалось Tidus; 09.09.2009 в 01:56.
Tidus вне форума Ответить с цитированием
Старый 09.09.2009, 01:59   #5
Tidus
Форумчанин
 
Регистрация: 08.09.2009
Сообщений: 133
По умолчанию

Цитата:
Сообщение от DJOV Посмотреть сообщение
А значения временных интервалов всегда находится в указанных вами строчках, то есть в одном и том же месте таблицы? Если да, то я знаю как решить данную проблему по крайней мере в 2007 офисе.
Значения временных интервалов находятся всегда в 1 столбце, НО не на равных равных расстояниях между друг другом. Например между 1 и вторым временным интервалом 2 строчки, а между вторым и третьим временным интервалом этих строчек уже 3, как показано в моем 1 посте. Если есть варианты, выкладывайте, интересно будет посмотреть, что получится.
Tidus вне форума Ответить с цитированием
Старый 09.09.2009, 02:06   #6
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

То есть нужных к определению максимумов необяз. 3? Сколько должно быть найдено максимумов?
Мой код работает для любого кол-ва строк в интервалах, т.е. между 00:00 и 00:20 может быть разное кол-во строк.

Последний раз редактировалось motorway; 09.09.2009 в 02:24.
motorway вне форума Ответить с цитированием
Старый 09.09.2009, 02:29   #7
Tidus
Форумчанин
 
Регистрация: 08.09.2009
Сообщений: 133
По умолчанию

Цитата:
Сообщение от motorway Посмотреть сообщение
То есть нужных к определению максимумов необяз. 3?
Количество максимумов определяется количеством временных интервалов, в которых производится поиск, в вашем файле их 3 - это верно. У меня в 1 посте тоже выделено 3 временных интервала жирным цветом для упрощения задачи.
Цитата:
Мой код работает для любого кол-ва строк в интервалах, т.е. между 00:00 и 00:20 может быть разное кол-во строк.
Да, это понятно.

Я хотел сказать, что временных интервалов в столбце (от 00:00 до 00:20) может быть около тысячи (в вашем файле их всего ТРИ). Если временных интервалов около тысячи, то как тогда вы будете выгружать максимальные значения в ячейки? Вам придётся в макросе указывать С4....С1000.

Последний раз редактировалось Tidus; 09.09.2009 в 02:33.
Tidus вне форума Ответить с цитированием
Старый 09.09.2009, 02:30   #8
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Вот, наверно, такой вариант будет как нужно. Сколько угодно интервалов, и максимумы вставляются в соотв. место справа.
Вложения
Тип файла: rar test3.rar (15.9 Кб, 53 просмотров)
motorway вне форума Ответить с цитированием
Старый 09.09.2009, 02:38   #9
Tidus
Форумчанин
 
Регистрация: 08.09.2009
Сообщений: 133
По умолчанию

Цитата:
Сообщение от motorway Посмотреть сообщение
Вот, наверно, такой вариант будет как нужно. Сколько угодно интервалов, и максимумы вставляются в соотв. место справа.
Спасибо огромное, это именно то, что нужно!!!Буду теперь разбираться с кодом. Я наверное покажусь очень наглым, хотя может здесь читающим будет полезно, если вы выполните небольшую мою просьбу. Не могли бы расписать перед каждой строчкой кода прямо в этой теме, что каждая строчка выполняет и какое действие делает, что бы в будущем уже можно было самому совершенствовать этот код.
Tidus вне форума Ответить с цитированием
Старый 09.09.2009, 02:51   #10
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Надеюсь, будет понятно. Возможно, код можно оптимизировать - писал быстро.

Код:
Sub Кнопка1_Щелчок()
'обновление экрана пока убираем
Application.ScreenUpdating = False

'задаем начальные значения счетчиков числа максимумов - 1, чтобы добавлять в 1 строку найденные значения. (Можно было бы и 0, но тогда в других местах +1)
k = 1
l = 1
' определение числа используемых строк на листе
r = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1

' цикл по всем строкам от 1 до последней
For i = 1 To r
' проверяем, если время равно 0:20, то во временную ячейку H1 записываем найденный номер строки со значением 0:20 и увеличиваем счетчик следующей строки k,
' чтобы следующая временная ячейка была ниже этой (можно использовать не временные ячейки, а массивы и т.п. - просто так сделал)
If (Cells(i, 1).Text = "0:20") Then

'записываем найденный номер строки со значением 0:20
Cells(k, 8) = i
'и увеличиваем счетчик следующей строки k,
k = k + 1
'конец проверки на 0:20
End If

'то же самое делается для 0:00 - в случае успеха проверки номер строки будет записываться во врем. ячейку I1 и так далее I2, I3...

If (Cells(i, 1).Text = "0:00") Then
'записываем найденный номер строки со значением 0:00
Cells(l, 9) = i
'и увеличиваем счетчик следующей строки l,
l = l + 1
'конец проверки на 0:00
End If
'переход к следующей строке в цикле (здесь кончается тело цикла)
Next i

'''''''''''''''''''''''''
'теперь цикл от 1 до числа найденных максимумов - то есть столько у нас интервалов получилось, и мы теперь нашли НАЧАЛО и КОНЕЦ интервалов (номера соотв. им строк).
'теперь это легко подставить в формулу МАКС, напр. если интервал начинается на 3 строке, а кончается на 11, то будет так: МАКС(B3:B11) - формулу такого вида мы и сформируем

For i = 1 To k - 1
' в столбце C и строке с номером i мы пишем формулу - максимум из значений, ограниченных НАЙДЕННЫМИ ИНТЕРВАЛАМИ

Range("C" & i).Formula = "=MAX(B" & Cells(i, 9) & ":B" & Cells(i, 8) & ")"

Next i

'очищаем временные ячейки, где хранились найденные интервалы

Range("H1:J" & k - 1).Value = ""

'обновление экрана можно включить
Application.ScreenUpdating = True


End Sub
В общем, суть такая, что мы находим с помощью проверок номера строк с 0:00 и 0:20. Следовательно, между ними и находится нужный диапазон для формулы МАКС.
Потом мы формируем эти формулы, используя найденные переменные - начало интервала и конец.

Последний раз редактировалось motorway; 09.09.2009 в 03:01.
motorway вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
5 максимальных значений в сводной таблице в новом Excel Катик7 Microsoft Office Excel 2 03.09.2009 17:26
Случайный выбор значений из списка Stoodentka Microsoft Office Excel 4 14.07.2009 07:56
Выбор значений по отдельной группе michi SQL, базы данных 2 15.10.2008 22:35
Запись файлов в *.тхт с учетом повторяющихся значений Arteom Общие вопросы Delphi 3 03.04.2008 17:26
выбор значений в цикле Melok Паскаль, Turbo Pascal, PascalABC.NET 3 15.12.2007 22:56