Страницы: 1
RSS
[ Закрыто ] Найти минимальное значение с помощью VBA (Тема закрыта - автор игнорирует Правила)
 
Добрый день!  
[Чтоб лишний раз не беспокоить, Искал в коллекций и в яндексе, что то в случае VBA что то нет!, для других начинающих тоже было бы полезно в будущем]
 
Как будет в VBA код чтоб найти минимальное/максимальное значение (и в случае дату) в определенном столбце листа.  
С уважением
With my best regards,      Inter_E
 
Да те же формулы Экселя можно привлечь:  
 
Sub tt()  
x = Application.Max([a:a])
y = Application.Min([a:a])
End Sub  
 
А без них вероятно перебором...
 
{quote}{login=}{date=01.01.1970 03:00}{thema=}{post}{/post}{/quote}  
 
Кстати еще в коллекций копилки посмотрел там тоже не нашел!  
 
Как его применить та, у меня не получается!  
   
Sub tt()  
y = Min(ActiveSheet(Range("A:A"))).Value  
'x = Application.Max([n:n])
MsgBox (y)  
'MsgBox (x)  
End Sub
With my best regards,      Inter_E
 
Sub ttt()  
y = Application.Min(ActiveSheet.Range("A:A"))  
'x = Application.Max([n:n])
MsgBox (y)  
'MsgBox (x)  
End Sub
 
Можно так:  
MsgBox Application.WorksheetFunction.Max(Range("A1:A10"))
 
{quote}{login=Юрий М}{date=20.08.2010 11:37}{thema=}{post}Можно так:  
MsgBox Application.WorksheetFunction.Max(Range("A1:A10")){/post}{/quote}  
 
Спасибо работает, но возникла еще одна проблемка  
Прикрепил файл  
Данные выгружается с 1С и формула его даже как дата не видит, как можно эту область в нормальный вид привести с помощью VBA?
With my best regards,      Inter_E
 
Извиняюсь вот файл
With my best regards,      Inter_E
 
Inter_E, это уже не смешно: исправление даты "от 1С" неоднократно обсуждалось. <BR>Вот одна из ссылок: http://www.planetaexcel.ru/forum.php?thread_id=15142
 
Так там дата - не дата, а текст.  
Например сформировать из этого текста числа ггггммдд и затем в них искать. Можно виртуально в памяти в массиве.  
Но кода много.
 
В свете новой ссылки:  
 
Sub Min_Max()  
 
For Each c In Range("B4:B30") 'Selection.Cells  
c.Value = CDate(c.Value)  
Next  
 
x = CDate(Application.WorksheetFunction.Min(Range("B4:B30")))  
y = CDate(Application.WorksheetFunction.Max(Range("B4:B30")))  
 
MsgBox ("min-" & x & "   MAX-" & y)  
 
End Sub
 
Спасибо большое !    
Я тоже в точь-в точь как вы сделал оказывается!  
Но тепер т.к у меня область ("B4:B19000"), и когда данные обрабатываються с "CDate" то времи достаточно уходит оказывается. Вот как раз использую этот случай не поставите ли мне простой "ПрогрессБар", а то 19000 это данные за два дня только скоро за месяц очень много будет.... (Думаю очень удобный момент для прогресс бара, я давно хотел его научиться но удобной ситуаций как это не было)  
Заранее буду благодарен....  
С уважением !
With my best regards,      Inter_E
 
Так вот как раз надо мой первый подход использовать - берём весь диапазон в массив, преобразуем в число и сразу анализируем величину. В конце имеен бОльшее и меньшее.  
И за доли секунды.
 
{quote}{login=Hugo}{date=20.08.2010 01:35}{thema=}{post}Так вот как раз надо мой первый подход использовать - берём весь диапазон в массив, преобразуем в число и сразу анализируем величину. В конце имеен бОльшее и меньшее.  
И за доли секунды.{/post}{/quote}  
 
Можете мне это сделать, я честно с массивами еще не работал  
Сейчас файлик прикреплю...
With my best regards,      Inter_E
 
Вот:  
 
Sub Min_Max()  
tm = Timer  
x = Range("B4:B20414").Value  
mn = 22222222  
For i = 1 To UBound(x)  
tmp = Val(Right(x(i, 1), 4) & Mid(x(i, 1), 4, 2) & Left(x(i, 1), 2))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
Debug.Print Timer - tm  
MsgBox ("min-" & mn & "   MAX-" & mx)  
 
End Sub  
 
Таймер показал  0.078125 сек. В рабочем коде уберите связанное с tm, timer.
 
Если использовать  
tmp = CDate(x(i, 1))    
то время в 2 раза больше, но зато выводит в формате даты.  
Ну я думаю 0,07 секунды не критично...
 
Inter_E, не нужно вместо ника писать Inter_E ответ > Hugo. Пишите это в поле "Тема", если уж сильно хочется так обращаться.
 
{quote}{login=Hugo}{date=20.08.2010 01:48}{thema=}{post}Вот:  
 
Sub Min_Max()  
tm = Timer  
x = Range("B4:B20414").Value  
mn = 22222222  
For i = 1 To UBound(x)  
tmp = Val(Right(x(i, 1), 4) & Mid(x(i, 1), 4, 2) & Left(x(i, 1), 2))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
Debug.Print Timer - tm  
MsgBox ("min-" & mn & "   MAX-" & mx)  
 
End Sub  
 
Таймер показал  0.078125 сек. В рабочем коде уберите связанное с tm, timer.{/post}{/quote}  
 
1)А что здесь mn = 22222222  это предел памяти для массива?  
2) Hugo ты прогресс бар-ах разбираещься?
With my best regards,      Inter_E
 
Извиниюсь брат теперь не буду :)))  
А то 2 года так писал, никто ни чего не говорил вроде???
With my best regards,      Inter_E
 
1.А что здесь mn = 22222222 - это заведомо большая дата :)  
2.Нет. А зачем теперь? :) Но примеры в копилке есть...
 
{quote}{login=Hugo}{date=20.08.2010 02:00}{thema=}{post}1.А что здесь mn = 22222222 - это заведомо большая дата :)  
2.Нет. А зачем теперь? :) Но примеры в копилке есть...{/post}{/quote}  
 
1) да так и понял что заведомо большая дата....  
2) Прикрепляю очень простой файлик для проекта ПрогрессБар, можешь мне самый дешевый ПГ поставить (А то боюсь, 2 года назад вроде вникал на ПГ потом как то сложно с моим файлм было, времени не было, итд, короче тогда запутался)  
Заранее благодарен...  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
With my best regards,      Inter_E
 
Очень простой файлик весит 1,3М!!! Два года на Форуме...
 
{quote}{login=Юрий М}{date=20.08.2010 02:33}{thema=}{post}Очень простой файлик весит 1,3М!!! Два года на Форуме...{/post}{/quote}  
 
Просто там данные и все, там только идин столбец был на 35000 заканчивался, больше данных нет.
With my best regards,      Inter_E
 
{quote}{login=Hugo}{date=20.08.2010 01:48}{thema=}{post}Вот:  
 
Sub Min_Max()  
tm = Timer  
x = Range("B4:B20414").Value  
mn = 22222222  
For i = 1 To UBound(x)  
tmp = Val(Right(x(i, 1), 4) & Mid(x(i, 1), 4, 2) & Left(x(i, 1), 2))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
Debug.Print Timer - tm  
MsgBox ("min-" & mn & "   MAX-" & mx)  
 
End Sub  
 
Таймер показал  0.078125 сек. В рабочем коде уберите связанное с tm, timer.{/post}{/quote}  
 
a как здесь использовать  
tmp = CDate(x(i, 1)) -?
With my best regards,      Inter_E
 
For i = 1 To UBound(x)  
tmp = CDate(x(i, 1))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
 
Можно CDate() в конце только использовать, когда результат показываем - так будет по скорости почти как без CDate().  
 
А прогрессбары сложная штука, см. пример. В них EducatedFool дока.  
Мне лично всегда хватало Application.Statusbar.
 
{quote}{login=Hugo}{date=20.08.2010 03:01}{thema=}{post}For i = 1 To UBound(x)  
tmp = CDate(x(i, 1))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
 
Можно CDate() в конце только использовать, когда результат показываем - так будет по скорости почти как без CDate().  
 
А прогрессбары сложная штука, см. пример. В них EducatedFool дока.  
Мне лично всегда хватало Application.Statusbar.{/post}{/quote}  
 
Ой ой ой, ПГ хороший, но чувствую как раньше не смогу внедрить на свой файл!  
А что за Статус Бар, я такого вроде не видел?
With my best regards,      Inter_E
 
Offtop :)  
 
Хотите проще - получайте:  
 
Sub test()  
For i = 1 To 10000  
p = i \ 100  
Application.StatusBar = "Выполнено: " & p & "% " & String(p \ 10 + 1, ChrW(8700))  
DoEvents  
Next  
Application.StatusBar = False  
End Sub  
 
Кстати, вместо квадратиков можно использовать всякие другие прикольные символы.  
 
К примеру, попробуйте такой вариант макроса:  
 
Sub test()  
For i = 1 To 10000  
p = i \ 100  
Application.StatusBar = "Выполнено: " & p & "% " & String(p \ 10 + 1, ChrW(10000 + p \ 2))  
DoEvents  
Next  
Application.StatusBar = False  
End Sub  
 
Вот ещё пара вариаций на ту же тему: (обязательно попробуйте - вдруг понравится)  
 
Sub test()  
For i = 1 To 10000  
p = i \ 100: s = "": For j = 10102 To 10102 + p \ 10: s = s & ChrW(j): Next  
Application.StatusBar = "Выполнено: " & p & "% " & s: DoEvents  
Next  
Application.StatusBar = False  
End Sub  
 
 
Sub test2()  
For i = 1 To 10000  
p = i \ 100: s = String(p \ 10, ChrW(10152)) & String(11 - p \ 10, ChrW(8700))  
Application.StatusBar = "Выполнено: " & p & "% " & s: DoEvents  
Next  
Application.StatusBar = False  
End Sub  
_  
очень круто)    
Sub test()  
For i = 1 To 100000  
p = i \ 1000  
s = String(p \ 10, ChrW(9632)) & String(10 - p \ 10, ChrW(9633))  
Application.StatusBar = "Выполнено: " & p & "% " & s  
DoEvents  
Next  
Application.StatusBar = False  
End Sub
 
Это была цитата.  
Эта штука выводится туда, где изначально написано "Готово" или "Ready" - чуть выше кнопки Start в левом нижнем углу, но на Экселе.
 
Спасибо огромное за СтатусБары. Это проще чем ПБ.
With my best regards,      Inter_E
 
{quote}{login=Hugo}{date=20.08.2010 03:01}{thema=}{post}For i = 1 To UBound(x)  
tmp = CDate(x(i, 1))  
If mx <= tmp Then mx = tmp  
If mn >= tmp Then mn = tmp  
Next  
 
Можно CDate() в конце только использовать, когда результат показываем - так будет по скорости почти как без CDate().  
 
А прогрессбары сложная штука, см. пример. В них EducatedFool дока.  
Мне лично всегда хватало Application.Statusbar.{/post}{/quote}  
 
Ваш метод Формат даты с 1С в нормальные не переводит, после вашего метода я своим методом проверяю ,но не переводит. Прикепляю файл может с моим методом сравнить (но у меня много времени уходит на обработку).  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
With my best regards,      Inter_E
Страницы: 1
Читают тему
Наверх