You can use the following basic syntax to calculate the minimum value in a range using VBA:
Sub MinValue()
Range("D2") = WorksheetFunction.Min(Range("B2:B11"))
End Sub
This particular example calculates the minimum value in the range B2:B11 and assigns the result to cell D2.
If you would instead like to display the minimum value in a message box, you can use the following syntax:
Sub MinValue()
'Create variable to store min value
Dim minValue As Single
'Calculate min value in range
minValue = WorksheetFunction.Min(Range("B2:B11"))
'Display the result
MsgBox "Min Value in Range: " & minValue
End Sub
The following examples shows how to use each of these methods in practice with the following dataset in Excel that contains information about various basketball players:
Related: How to Find Max Value in Range Using VBA
Example 1: Calculate Minimum Value of Range Using VBA and Display Results in Cell
Suppose we would like to calculate the minimum value in the points column and output the results in a specific cell.
We can create the following macro to do so:
Sub MinValue()
Range("D2") = WorksheetFunction.Min(Range("B2:B11"))
End Sub
When we run this macro, we receive the following output:
Notice that cell D2 contains a value of 10.
This tells us that the minimum value in the points column is 10.
Example 2: Calculate Minimum Value of Range Using VBA and Display Results in Message Box
Suppose we would instead like to calculate the minimum value in the points column and output the results in a message box.
We can create the following macro to do so:
Sub MinValue()
'Create variable to store min value
Dim minValue As Single
'Calculate min value in range
minValue = WorksheetFunction.Min(Range("B2:B11"))
'Display the result
MsgBox "Min Value in Range: " & minValue
End Sub
When we run this macro, we receive the following output:
The message box tells us that the minimum value in the range B2:B11 is 10.
Note that in this example we calculated the minimum value in the range B2:B11.
However, if you’d like to instead calculate the minimum value in an entire column you could type B:B instead.
This will calculate the minimum value in all of column B.
Additional Resources
The following tutorials explain how to perform other common tasks in VBA:
VBA: How to Calculate Average Value of Range
VBA: How to Count Number of Rows in Range
VBA: How to Sum Values in Range
For a list like:
Column1 Column2 Column3
DataA 1 1234
DataA 2 4678
DataA 3 8910
DataB 2 1112
DataB 4 1314
DataB 9 1516
How do I get a list like this:
Column4 Column5 Column6
DataA 1 1234
DataB 2 1112
The key is to only return the minimum value in column2 and its corresponding column3 value.
Ben McCormack
31.9k46 gold badges146 silver badges222 bronze badges
asked Dec 9, 2009 at 20:08
4
Sorry I misunderstood your Question First. Here is a working code that ended up more complex than I wanted it to be
Option Explicit
Private Function inCollection(ByRef myCollection As Collection, ByRef value As Variant) As Boolean
Dim i As Integer
inCollection = False
For i = 1 To myCollection.Count
If (myCollection(i) = value) Then
inCollection = True
Exit Function
End If
Next i
End Function
Sub listMinimums()
Dim source As Range
Dim target As Range
Dim row As Range
Dim i As Integer
Dim datas As New Collection
Dim minRows As New Collection
Set source = Range("A2:C5")
Set target = Range("D2")
target.value = source.value
For Each row In source.Rows
With row.Cells(1, 1)
If (inCollection(datas, .value) = False) Then
datas.Add .value
minRows.Add row.row, .value
End If
If (Me.Cells(minRows(.value), 2) > row.Cells(1, 2)) Then
minRows.Remove (.value)
minRows.Add row.row, .value
End If
End With
Next row
'output'
For i = 1 To minRows.Count
target(i, 1) = Me.Cells(minRows(i), 1)
target(i, 2) = Me.Cells(minRows(i), 2)
target(i, 3) = Me.Cells(minRows(i), 3)
Next i
Set datas = Nothing
Set minRows = Nothing
End Sub
Note: You might want to replace Me
with the name of your sheet.
answered Dec 9, 2009 at 21:01
margmarg
2,7871 gold badge30 silver badges33 bronze badges
An example using ADO.
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim i As Integer
''http://support.microsoft.com/kb/246335
strFile = ActiveWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
strSQL = "SELECT Column1, Min(Column3) As MinCol3 FROM [Sheet8$] GROUP BY Column1"
rs.Open strSQL, cn, 3, 3
For i = 0 To rs.fields.Count - 1
Sheets("Sheet7").Cells(1, i + 1) = rs.fields(i).Name
Next
Worksheets("Sheet7").Cells(2, 1).CopyFromRecordset rs
answered Dec 10, 2009 at 19:39
FionnualaFionnuala
90.2k7 gold badges112 silver badges151 bronze badges
2
Try this:
Public Sub MinList()
Const clColKey_c As Long = 1&
Const clColVal_c As Long = 3&
Dim ws As Excel.Worksheet, objDict As Object
Dim lRow As Long, dVal As Double, sKey As String
Dim lRowFrst As Long, lRowLast As Long, lColOut As Long
Set ws = Excel.ActiveSheet
Set objDict = CreateObject("Scripting.Dictionary")
lRowFrst = ws.UsedRange.Row
lRowLast = ws.UsedRange.Rows.Count
lColOut = ws.UsedRange.Columns.Count + 1&
For lRow = lRowFrst To lRowLast
dVal = Val(ws.Cells(lRow, clColVal_c).Value)
sKey = ws.Cells(lRow, clColKey_c).Value
If objDict.Exists(sKey) Then
If dVal > objDict.Item(sKey) Then objDict.Item(sKey) = dVal
Else
objDict.Add sKey, dVal
End If
Next
For lRow = lRowFrst To lRowLast
ws.Cells(lRow, lColOut).Value = objDict.Item(ws.Cells(lRow, clColKey_c).Value)
Next
ws.Cells(1&, lColOut).Value = "Min"
End Sub
answered Dec 11, 2009 at 13:35
OorangOorang
6,6201 gold badge35 silver badges52 bronze badges
all_angarsk, Вы меня не поняли. Я имел ввиду, что не нужно усложнять. Любой модуль/процедуру Вы легко отправите в экспорт на флэшку в формате *.bas. И так точно вытянете его оттуда в любом месте, на любом компе, в любой документ. А с модулем кнопки — тяжелее. Ну и с самой кнопкой — нарисуйте встроенными инстр-ми фигуру (или обьект WordArt) что Вам нравится, и назначьте ей нужную процедуру (правая кнопка > Назначить макрос (или как там у Вас по локализации)). Всего пару кликов. И практично, и веселее, и проще, а не унылая серость.
А про «…регулярные выражения…«. Что Вы имели ввиду? Я их там не вижу.
Добавлено через 25 минут
Кажется, я понял про регулярку. Смотрите, у Тoiai грамотный и лаконичный код. Лично я бы все-таки сгенерированный массив выгрузил на лист, чтоб было видно. I.e., после next я бы добавил строку:
[a1].resize(1, ubound(a)).value=a
Дальше он вызывает окно сообщения MsgBox, в котором использует фукции не VBA, а Excel — Min и Max. Поэтому его тяжелая жизнь заставила вызывать их такими фразами Application.Max(a), Application.Min(a)…
Кстати, что б, если не нужно, не выкладывать массив на лист, его тоже можно одним движение загнать в этот же MsgBox.
Поиск минимального элемента массива на VBA
Распространенной учебной задачей для тех, кто учится программировать, является программа поиска минимального элемента массива. Рассмотрим соответствующий алгоритм и его реализацию с помощью языка Visual Basic for Applications (VBA).
В качестве поставщика данных для работы программы будем использовать массив чисел, хранящихся на рабочем листе Excel в колонке А. То есть, в данном случае мы будем работать с одномерным массивом.
Алгоритм нахождения минимального элемента и его реализация на Visual Basic for Applications (VBA) подробно рассматривается в нашем видеоуроке. Также, комментарии ниже помогут вам в понимании изложенного материала.
Прежде чем переходить к программе, следует обговорить, какие действия нам необходимо будет выполнить.
Первое, с чего следует начать — это объявить одномерный массив А(10) с числом элементов, равным количеству чисел на рабочем листе Excel. В нашем случае, это 10. После создания такого массива, все его элементы хранят пустые значения, равносильные нулю.
Берем значение из ячейки «А1» рабочего листа и записываем его как элемент массива А(1), значение из ячейки «А2» записываем как элемент массива А(2). И так далее, пока не дойдем до последнего элемента «А10» -> А(10).
Сразу заметим, что заполнение массива числами — рутинная повторяющаяся операция, которую целесообразно оформить в виде циклической конструкции, которая бы автоматически выполнилась 10 раз.
Далее, давайте разберемся, что будет выступать в качестве результата работы программы? Как минимум, программа должна нам выдать наименьшее значение массива. Также неплохо было бы знать порядковый номер этого минимального элемента.
В переменной s_min = a(1) мы будем сохранять значение наименьшего элемента, а в переменной n = 1 — его порядковый номер. Что обозначают вот эти две строчки, идущие одна за другой?
s_min = a(1)
n = 1
Это означает, что программа запомнила первый элемент массива как минимальный и дальше будет его сравнивать со всеми остальными элементами. Кстати, в видеоуроке здесь допущена опечатка, обратите внимание. Вместо s_min = a(i) следует использовать команду s_min = a(1).
Переходим непосредственно к процедуре поиска наименьшего элемента массива. Для этого в программе также организуется цикл от 1 до 10 (с первого элемента, по последний).
Каждый i-ый элемент массива a(i) мы по-очереди сравниваем с тем, что хранится в переменной s_min. Если, вдруг, обнаруживается, что i-ый элемент массива меньше s_min, это означает, что мы нашли элемент, значение которого меньше того, что хранится у нас в памяти. Поэтому такой i-ый элемент следует запомнить как наименьший с помощью команд:
s_min = a(i)
n = i
По завершении работы цикла, необходимо не забыть вывести на экран найденное значение наименьшего элемента s_min, а также его порядковый номер.
Как сообщалось на нашем сайте ранее, с помощью встроенного в Microsoft Office языка программирования VBA вы можете реализовать арифметические операции.
Популярные сообщения из этого блога
Куда пропал редактор формул Microsoft Equation?
Работая в Microsoft Word , мне часто приходится набирать формулы. На протяжении многих лет, для этих целей я использовал встроенный в Word редактор формул Microsoft Equation . И даже, когда Microsoft добавил в свой Office новый инструмент » Формулы «, я все равно, по привычке, продолжал использовать Microsoft Equation . Для работы я использую два разных ноутбука с абсолютно одинаковым софтом. Microsoft Office 2010 у меня устанавливался на обоих компьютерах с одного дистрибутива. Каково же было мое удивление, когда однажды, открыв созданный ранее документ Word на втором ноутбуке, я не смог войти в режим редактирования формулы! То есть, документ открылся без проблем и все набранные ранее формулы отобразились корректно. Но когда мне понадобилось одну из них отредактировать, то оказалось, что Word этого сделать не может по причине отсутствия Microsoft Equation .
Что делать, если копируемый из Интернета текст не выравнивается по ширине
Каждый когда-либо сталкивался с ситуацией, когда скопированный из Интернета и вставленный в Word текст не удается выровнять по ширине: по левому краю выравнивает, по правому — тоже, а вот по ширине — ни в какую. Еще хуже обстоят дела, если вы захотите увеличить размер шрифта: выравнивание текста окончательно откажется работать. Разбираемся в причинах и ищем способ, как это исправить.
Скопированный в Word текст выходит за границы страницы
Скопировав текст в Word с Интернет-сайта или другого текстового документа, часто приходится сталкиваться с ситуацией, когда он выходит за границы страницы. Ситуация осложняется тем, что маркер » Отступ справа » на горизонтальной линейке, с помощью которого можно было бы все исправить, отсутствует. Как быть? Выход есть и он очень простой. Для этого необходимо выполнить несколько действий.
Egor M. Пользователь Сообщений: 21 |
Добрый день. Прикрепленные файлы
|
vikttur Пользователь Сообщений: 47199 |
Не макросом принимается? |
Egor M. Пользователь Сообщений: 21 |
Vikttur, спасибо, но мне нужен именно макрос, который будет срабатывать на событие в листе в столбцах F:K. |
МВТ Пользователь Сообщений: 1198 |
#4 11.07.2015 15:33:59 Как-то так (а подкрашивание через УФ сделайте)
|
||
JeyCi Пользователь Сообщений: 3387 |
#5 11.07.2015 17:17:07
а я думала, это только я ТАК подумала/поняла… vikttur ‘а, и попросил макрос…
вот и получилось у меня ТО ЖЕ САМОЕ (видимо, не совсем то —
МОРАЛЬ: ветку вести аккуратно, головой отвечать за каждое слово, ТЗ описывать последовательно (!), не ссылаясь на файл, который ещё не открыли и среди кучи цифр не выискивали не то — что бы хотелось ТСу!? переписывать не буду МВТ ответил за всех Изменено: JeyCi — 11.07.2015 17:32:15 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
|||||
МВТ Пользователь Сообщений: 1198 |
JeyCi, осталось дождаться ответа ТС, чтобы понять, что он имел в виду на самом деле |
Egor M. Пользователь Сообщений: 21 |
Вобщем-то вы почти все и сделали, что ТС имел ввиду (не знаю только Тэ эС или ТиСи — я не в тренде). |
JeyCi Пользователь Сообщений: 3387 |
#8 12.07.2015 09:21:04
он же Private Sub Worksheet_Change
а у Вас Событие Изменения на Листе произошло? чтобы так заявлять… т е войдите в любую ячейку и нажмите Enter… подсветит значение по формуле от vikttur
может вам вообще не то событие надо и надо ли вообще?..
переписывать не буду (т к формулу от vikttur можете сами адаптировать под каждую конкретную строку)… да и вообще без событий, похоже, хотите — чтобы само всё работало (и подправлялось кем-то) — не бывает так — если хотите, чтобы работало так, как надо ! вам — приложите усилия (кроме фразы «я хочу») МВТ вроде бы натворили — если соединить наши 2 кода… Изменено: JeyCi — 12.07.2015 11:09:15 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||||||||
Egor M. Пользователь Сообщений: 21 |
Прошу прощения, но я совершенно не хотел отнять Ваше время. Просто на входе в форум написано, |
JeyCi Пользователь Сообщений: 3387 |
#10 12.07.2015 14:08:59
вам в помощь
как вопрос поставлен, такая задача и решалась
пошла подмена понятий… в программировании это не проходит
теперь после всего написанного — уже в одну строчку и один нюанс… как из одного макроса выйти в др макрос…
… вы уверены, что верно рассчитываете?.. программисты Microsoft тоже рассчитывают, что их функционал даст людям больше возможностей для оптимальной автоматизации работы — если в полном объёме использовать те возможности, которые даёт Excel, а не создавать Америку с нуля… и добровольная помощь рассчитывает, что если вы задаёте вопрос — то имеете потенциал или хотя бы приложите усилия, чтобы понять ответ… p.s. вам помогли задуматься о возможностях эффективного использования имеющихся ресурсов для разработки наилучшего решения, а вы даже не подумали, что вопрос может быть решён намного лучше, чем вам кажется… вы написали
— вам даже подправили его… хотя место «хотеть» находится ЗДЕСЬ …
что ещё не сделали за вас? что сделали вы? на добровольной основе
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||||||||||||||
МВТ Пользователь Сообщений: 1198 |
#11 12.07.2015 15:37:05 Переделал на привязку к событию, оставил без покраски (остаюсь при своем мнении, что через УФ проще и лучше)
P.S. а чем Вас все-таки не устраивает УФ — просто любопытно? Изменено: МВТ — 12.07.2015 15:42:10 |
||
sv2013 Пользователь Сообщений: 657 |
#12 12.07.2015 17:00:13 EgorM,могу предложить два макроса,первый макрос решает ваш вопрос,
|
||||
Sanja Пользователь Сообщений: 14849 |
#13 12.07.2015 18:59:44 Вариант со словарем.
Согласие есть продукт при полном непротивлении сторон. |
||
Юрий М Модератор Сообщений: 60750 Контакты см. в профиле |
sv2013, а зачем во втором макросе цикл? |
sv2013 Пользователь Сообщений: 657 |
#15 12.07.2015 22:39:05 Добрый вечер,можно ,конечно, без цикла обойтись,во вспомогательном втором макросе.
|
||
Sanja Пользователь Сообщений: 14849 |
#16 12.07.2015 22:53:47 Я, похоже, то-же подумал/понял как vikttur, а ТС продолжает интриговать
так решен вопрос или нет?
Согласие есть продукт при полном непротивлении сторон. |
||||
Egor M. Пользователь Сообщений: 21 |
Ничего общего с интригой. Просто столько вариантов дали. Надо ж было потестировать. В итоге я из каждого макроса понадергал по чуть-чуть (включая макрос от JeyCi) и у меня теперь все работает, как я и просил. |
Юрий М Модератор Сообщений: 60750 Контакты см. в профиле |
#18 13.07.2015 08:09:26
А Вы куда скопировали код? Подозреваю, что в стандартный модуль, а нужно в модуль листа. |
||
SAS888 Пользователь Сообщений: 757 |
#19 13.07.2015 08:59:36 Предложу еще один вариант. Вообще без циклов.
Пример во вложении. Прикрепленные файлы
Чем шире угол зрения, тем он тупее. |
||
Sanja Пользователь Сообщений: 14849 |
#20 13.07.2015 09:45:56
Egor M., что Вам мешало в стартовом сообщении указать что изменение ячеек происходит копи-пастом, причем оптом? Согласие есть продукт при полном непротивлении сторон. |
||
Egor M. Пользователь Сообщений: 21 |
#21 13.07.2015 09:59:08
Чесслово вставил , куда следовало. В лист, в самую его нежную часть. Сейчас перепроверил — нет, не работает. |
||
sv2013 Пользователь Сообщений: 657 |
#22 13.07.2015 10:15:06 Egor M,попробуйте на вашем другом файле:
|
||
Egor M. Пользователь Сообщений: 21 |
#23 13.07.2015 10:33:30
Помешало отсутствие кругозора. Я считал, что если есть на свете копи-паст, то руками заносить данные никто не станет. Ошибался. А ТС оказалось вовсе не обидно, как могло показаться в начале. Обязательно сегодня вечером проверю все новые макросы. |
||
JeyCi Пользователь Сообщений: 3387 |
#24 13.07.2015 10:40:32
— так лучше, чем было у меня… в код поста №8 точно лучше вставить в строку14
p.s. sv2013
Изменено: JeyCi — 13.07.2015 10:51:15 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
sv2013 Пользователь Сообщений: 657 |
#25 13.07.2015 11:53:58 Jeyci,добрый день,с учетом вашей корректировки:
Прикрепленные файлы
Изменено: sv2013 — 13.07.2015 12:30:43 |
||||
Egor M. Пользователь Сообщений: 21 |
SAS888, на копи-пейст макрос перестает трудиться. А если по каждой ячейке пройтись, то все отлично работает. Спасибо. |
SAS888 Пользователь Сообщений: 757 |
Речь о том, что требуется обрабатывать множество ячеек зашла лишь после того, как я опубликовал свой пример. Чем шире угол зрения, тем он тупее. |
Egor M. Пользователь Сообщений: 21 |
sv2013: все-равно ругается на строчку: addr = Range(«F» & J & «:K» & J).Find(s).Address. |
Egor M. Пользователь Сообщений: 21 |
SAS888, Вот теперь самое оно. Благодарю Вас. |
Egor M. Пользователь Сообщений: 21 |
#30 14.07.2015 07:28:41 JeyCi, Ваша добавка пришлась к месту. Стало выглядеть эстетичнее. Спасибо. |