Добрый день, товарищи. Столкнулся с проблемой, которую не могу решить своими силами. Смысл функции: необходимо из реестра за определённую дату выбрать минимальное цифровое значение, которое соответствует определённым условиям. Вот формула:
Лист называется БУОС №4 КП-63; В Н5 находится дата; На листе БУОС №4 КП-63 в столбце В находятся даты; В столбце Е находятся название типа "КП-63 ВтЛУ / КДМНУ" и "КП-63 ВтЛУ / РГС-3" (номера РГС меняются); В столбце F находятся искомые данные в числовом виде Нужно минимальное значение из 4-5 штук, которые находятся в столбце F. Данные нужно брать при условии, что в столбце Е будет "КП-63 ВтЛУ / КДМНУ". В данный момент берёт минимальное значение за определённую дату из всех, находящихся в столбце F. И вот что интересно - в другой таблице работает правильно, хотя условия похожие. В столбце В пустых ячеек нет. В другом месте эта формула работает правильно, но в том случае вместо слова "КДМНУ" стоит слово "нефть". В прилагаемом файле рабочее выделено зелёным цветом, а не рабочее желтым. Это прямо загадка Вселенной - слово изменилось и формула работать перестала... Любое изменение кода приводит к тому, что работать перестаёт. Вообще.
Добрый день, товарищи. Столкнулся с проблемой, которую не могу решить своими силами. Смысл функции: необходимо из реестра за определённую дату выбрать минимальное цифровое значение, которое соответствует определённым условиям. Вот формула:
Лист называется БУОС №4 КП-63; В Н5 находится дата; На листе БУОС №4 КП-63 в столбце В находятся даты; В столбце Е находятся название типа "КП-63 ВтЛУ / КДМНУ" и "КП-63 ВтЛУ / РГС-3" (номера РГС меняются); В столбце F находятся искомые данные в числовом виде Нужно минимальное значение из 4-5 штук, которые находятся в столбце F. Данные нужно брать при условии, что в столбце Е будет "КП-63 ВтЛУ / КДМНУ". В данный момент берёт минимальное значение за определённую дату из всех, находящихся в столбце F. И вот что интересно - в другой таблице работает правильно, хотя условия похожие. В столбце В пустых ячеек нет. В другом месте эта формула работает правильно, но в том случае вместо слова "КДМНУ" стоит слово "нефть". В прилагаемом файле рабочее выделено зелёным цветом, а не рабочее желтым. Это прямо загадка Вселенной - слово изменилось и формула работать перестала... Любое изменение кода приводит к тому, что работать перестаёт. Вообще.MaMSo
Данные нужно брать при условии, что в столбце Е будет "КП-63 ВтЛУ / КДМНУ"
Проблема в том, что функция берет непрерывный диапазон с этими значениями от первой найденной до последней ячейки. В данном случае для 02.04 с 263 до 277 строки. А в этом диапазоне попадаются и другие значения резервуаров. Решение: либо отсортировать столбец Е по возрастанию (или убыванию), либо менять алгоритм функции, чтобы брались только нужные значения
Данные нужно брать при условии, что в столбце Е будет "КП-63 ВтЛУ / КДМНУ"
Проблема в том, что функция берет непрерывный диапазон с этими значениями от первой найденной до последней ячейки. В данном случае для 02.04 с 263 до 277 строки. А в этом диапазоне попадаются и другие значения резервуаров. Решение: либо отсортировать столбец Е по возрастанию (или убыванию), либо менять алгоритм функции, чтобы брались только нужные значенияPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
"либо менять алгоритм функции, чтобы брались только нужные значения" Буду благодарен, если подскажите как. Любое изменение нашего "корявого" кода приводит к тому, что функция работать перестаёт. Но, возникает вопрос: на листе "Готовый результат" в столбце С эта функция работает и почему она перестаёт работать, если задаёшь другие условия? Формула-то одинаковая, за исключением вводных.
"либо менять алгоритм функции, чтобы брались только нужные значения" Буду благодарен, если подскажите как. Любое изменение нашего "корявого" кода приводит к тому, что функция работать перестаёт. Но, возникает вопрос: на листе "Готовый результат" в столбце С эта функция работает и почему она перестаёт работать, если задаёшь другие условия? Формула-то одинаковая, за исключением вводных.MaMSo
например, вместо функции min использовать minifs и добавить условие по резервуарам. Где-то часа через два смогу сделать, если кто-то другой не подключится
например, вместо функции min использовать minifs и добавить условие по резервуарам. Где-то часа через два смогу сделать, если кто-то другой не подключитсяPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
MaMSo, Добрый день. Можно UDF упростить, ну и не ограничиваться 100...
[vba]
Код
Function define_stat2(dd As Date, dta_rng, pls_tank As Long, pls_salt As Long, option1 As String, def_ As String) ' H5; 'БУОС №4 КП-63'!B:F; 4; 5; "КДМНУ"; "min" 'пример ввода в ячейку =define_stat2(H5;'БУОС №4 КП-63'!B:F;4;5;"КДМНУ";"min")
For i = 1 To UBound(dta_rng) If IsDate(dta_rng(i, 1)) Then d = dta_rng(i, 1) d = Fix(d) If d = dd Then If InStr(dta_rng(i, pls_tank), option1) Then If dta_rng(i, pls_salt) <> Empty Then col.Add dta_rng(i, pls_salt) End If End If End If Next
'копируем собранное в массив ReDim out(1 To col.Count) For i = 1 To col.Count out(i) = col(i) Next Set col = Nothing
'Здесь можно задать дополнительные функции для вывода данных, например Average If def_ = "max" Then result_ = WorksheetFunction.Max(out) If def_ = "aver" Then result_ = WorksheetFunction.Average(out) If def_ = "min" Then result_ = WorksheetFunction.Min(out)
define_stat2 = result_ 'вывод результата функции
End Function
[/vba]
Вообще лучше бы всегда даты были датами, но в данном случае моему коду не важно, работает и если сперва даты привести к нормальному виду, и с такими текстом. Над решением по фильтрации можно подумать, может Instr() может наврать, может правильнее всегда критерий брать с конца строки, может нужно учитывать слэш, это зависит от данных. Для этого примера достаточно определить наличие в строке.
MaMSo, Добрый день. Можно UDF упростить, ну и не ограничиваться 100...
[vba]
Код
Function define_stat2(dd As Date, dta_rng, pls_tank As Long, pls_salt As Long, option1 As String, def_ As String) ' H5; 'БУОС №4 КП-63'!B:F; 4; 5; "КДМНУ"; "min" 'пример ввода в ячейку =define_stat2(H5;'БУОС №4 КП-63'!B:F;4;5;"КДМНУ";"min")
For i = 1 To UBound(dta_rng) If IsDate(dta_rng(i, 1)) Then d = dta_rng(i, 1) d = Fix(d) If d = dd Then If InStr(dta_rng(i, pls_tank), option1) Then If dta_rng(i, pls_salt) <> Empty Then col.Add dta_rng(i, pls_salt) End If End If End If Next
'копируем собранное в массив ReDim out(1 To col.Count) For i = 1 To col.Count out(i) = col(i) Next Set col = Nothing
'Здесь можно задать дополнительные функции для вывода данных, например Average If def_ = "max" Then result_ = WorksheetFunction.Max(out) If def_ = "aver" Then result_ = WorksheetFunction.Average(out) If def_ = "min" Then result_ = WorksheetFunction.Min(out)
define_stat2 = result_ 'вывод результата функции
End Function
[/vba]
Вообще лучше бы всегда даты были датами, но в данном случае моему коду не важно, работает и если сперва даты привести к нормальному виду, и с такими текстом. Над решением по фильтрации можно подумать, может Instr() может наврать, может правильнее всегда критерий брать с конца строки, может нужно учитывать слэш, это зависит от данных. Для этого примера достаточно определить наличие в строке.Hugo