Сразу оговорюсь, что с VBA мое знакомство длится чуть более 2-х недель, поэтому каких-то (пусть даже самых элементарных) вещей могу не знать
Есть задача, которую при помощи формул я решил. Подробное описание задачи и решение во вложенном файле.
Возникло желание реализовать это решение в VBA.
Аналог "МАКС_ЕСЛИ" я вроде был написал:
[vba]
Код
Function vlookup_maxdate(svalue As Variant, table As Range, scolumn As Integer, scolumn_maxdate As Integer)
'svalue – искомое значение 'table – таблица с данными 'scolumn – столбец таблицы данных, в котором осуществляется поиск svalue 'scolumn_maxdate – столбец таблицы данных, где по искомому значению осуществляется поиск 'максимальной (последней) даты
'scolumn_result – столбец таблицы данных, из которого функция должна вернуть значение в соответсвтии с искомым значением и максимальной (последней) датой. Не знаю, как вытащить из этого столбца значение. Пробовал через получение адреса ячейки с максимальной датой (.address) и ее смещения (.offset) на нужный столбец. Но при использовании .address перестает считаться максимальная дата.
Dim i As Long vlookup_maxdate = Empty
For i = 1 To table.Rows.Count 'цикл поиска максимальной даты по искомому значению If table.Cells(i, scolumn) = svalue Then If table.Cells(i, scolumn_maxdate) = Empty Then vlookup_maxdate = table.Cells(i, scolumn_maxdate) Else If table.Cells(i, scolumn_maxdate) > vlookup_maxdate Then vlookup_maxdate = table.Cells(i, scolumn_maxdate) End If End If End If Next i
'получение значения из столбца scolumn_result? End Function
[/vba]
А вот что делать дальше - не понятно.
P.S. Предвосхищая вопросы типа "а зачем тебе это вообще надо в VBA, когда это можно сделать средствами самого excel?!" скажу, что интересно разобраться.
Добрый день.
Сразу оговорюсь, что с VBA мое знакомство длится чуть более 2-х недель, поэтому каких-то (пусть даже самых элементарных) вещей могу не знать
Есть задача, которую при помощи формул я решил. Подробное описание задачи и решение во вложенном файле.
Возникло желание реализовать это решение в VBA.
Аналог "МАКС_ЕСЛИ" я вроде был написал:
[vba]
Код
Function vlookup_maxdate(svalue As Variant, table As Range, scolumn As Integer, scolumn_maxdate As Integer)
'svalue – искомое значение 'table – таблица с данными 'scolumn – столбец таблицы данных, в котором осуществляется поиск svalue 'scolumn_maxdate – столбец таблицы данных, где по искомому значению осуществляется поиск 'максимальной (последней) даты
'scolumn_result – столбец таблицы данных, из которого функция должна вернуть значение в соответсвтии с искомым значением и максимальной (последней) датой. Не знаю, как вытащить из этого столбца значение. Пробовал через получение адреса ячейки с максимальной датой (.address) и ее смещения (.offset) на нужный столбец. Но при использовании .address перестает считаться максимальная дата.
Dim i As Long vlookup_maxdate = Empty
For i = 1 To table.Rows.Count 'цикл поиска максимальной даты по искомому значению If table.Cells(i, scolumn) = svalue Then If table.Cells(i, scolumn_maxdate) = Empty Then vlookup_maxdate = table.Cells(i, scolumn_maxdate) Else If table.Cells(i, scolumn_maxdate) > vlookup_maxdate Then vlookup_maxdate = table.Cells(i, scolumn_maxdate) End If End If End If Next i
'получение значения из столбца scolumn_result? End Function
[/vba]
А вот что делать дальше - не понятно.
P.S. Предвосхищая вопросы типа "а зачем тебе это вообще надо в VBA, когда это можно сделать средствами самого excel?!" скажу, что интересно разобраться.Allock
Попробуйте так Макрос в модуль листа Задание, при изменении культуры в ячейке С17 подставляется значение урожайности, интересно - разбирайтесь [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim Kultura As String Dim FoundKultura As Range Dim FirstAdr As String Dim iRow As Long Dim iDate As Date Dim MaxDate As Date If Target.Cells.Count > 1 Then Exit Sub 'выделено больше одной ячейки If Not Intersect(Target, Range("C17")) Is Nothing Then Application.EnableEvents = False Kultura = Target Set FoundKultura = Columns("B").Find(Kultura, , xlValues, xlWhole) If Not FoundKultura Is Nothing Then FirstAdr = FoundKultura.Address iRow = FoundKultura.Row Do iDate = Cells(FoundKultura.Row, 1) If iDate > MaxDate Then MaxDate = iDate: iRow = FoundKultura.Row Set FoundKultura = Columns("B").FindNext(FoundKultura) Loop While FoundKultura.Address <> FirstAdr End If End If Range("D17") = Cells(iRow, 3) Application.EnableEvents = True End Sub
[/vba]
Цитата
реализовать это решение в VBA
Попробуйте так Макрос в модуль листа Задание, при изменении культуры в ячейке С17 подставляется значение урожайности, интересно - разбирайтесь [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim Kultura As String Dim FoundKultura As Range Dim FirstAdr As String Dim iRow As Long Dim iDate As Date Dim MaxDate As Date If Target.Cells.Count > 1 Then Exit Sub 'выделено больше одной ячейки If Not Intersect(Target, Range("C17")) Is Nothing Then Application.EnableEvents = False Kultura = Target Set FoundKultura = Columns("B").Find(Kultura, , xlValues, xlWhole) If Not FoundKultura Is Nothing Then FirstAdr = FoundKultura.Address iRow = FoundKultura.Row Do iDate = Cells(FoundKultura.Row, 1) If iDate > MaxDate Then MaxDate = iDate: iRow = FoundKultura.Row Set FoundKultura = Columns("B").FindNext(FoundKultura) Loop While FoundKultura.Address <> FirstAdr End If End If Range("D17") = Cells(iRow, 3) Application.EnableEvents = True End Sub