Страницы: 1
RSS
Поиск в двухмерном массиве с повторяющимися значениями по оси Y
 
Добрый день,
к сожалению поиск не помог мне в решении моей задачи. Вся надежда на вас.

Существует двухмерный массив данных,
по оси Y значения повторяются в произвольном порядке и постоянно добавляются,
по оси Х количество столбцов фиксировано и значения уникальны,
сама матрица данных наполненная частично и произвольно.

При этом примем за аксиому что не зависимо от количество повторений по оси Y, существует только одно уникальное значение в массиве удовлетворяющее условию с заданными значениями X и Y.
во вложении небольшой пример.

основная задача: необходимо найти данные в массиве по заданным X и Y.

Заранее благодарю за любую помощь.

P.S. Также интересна более сложная версия, если при заданных X и Y существует несколько удовлетворяющих условию ячеек, можно ли их тогда сцепить в один полученный результат?
 
Этот массив всегда на листе? По первому вопросу думаю помогут index+match, но я не формулист, поэтому пас. Тут есть формулистов...
Вот по второму думаю нужно UDF писать. А я бы и по первому UDF сочинил - мне так проще :)
 
Цитата
Hugo пишет:
Этот массив всегда на листе? По первому вопросу думаю помогут index+match, но я не формулист, поэтому пас. Тут есть формулистов...
Массив сам на одном листе, а поиск может и с другой вкладки задаваться.

Цитата
Hugo пишет:
Вот по второму думаю нужно UDF писать. А я бы и по первому UDF сочинил - мне так проще :)
к сожалению мне всегда хватало стандартных формул, это первый раз когда я столкнулся с тем, что их мне не достаточно, поэтому я с UDF просто ноль (
 
для начала
какое из нескольких значений нужно: первое, последнее, все?
 
Вот:
Код
Function digga(pak, srok, table, kpak, ksrok, sep$)
    Dim i&, ii&, s$
    pak = Intersect(pak.Parent.UsedRange, pak).Value
    srok = Intersect(srok.Parent.UsedRange, srok).Value
    table = Intersect(table.Parent.UsedRange, table).Value
    For i = 1 To UBound(pak)
        If pak(i, 1) = kpak Then
            For ii = 1 To UBound(srok, 2)
                If srok(1, ii) = ksrok Then
                    If Len(Trim(table(i, ii))) Then s = s & sep & table(i, ii)
                End If
            Next
        End If
    Next
    digga = Mid(s, Len(sep) + 1)
End Function


Код в модуль, на листе:
=digga(D7:D17,F6:J6,F7:J17,D20,E20,", ")
В русском Экселе вероятно вместо "," писать ";".
Изменено: Hugo - 05.06.2013 16:59:32
 
Цитата
dude пишет:
для начала
какое из нескольких значений нужно: первое, последнее, все?

Я наверно не корректно сформулировал.
Пример: Допустим ищем данные для аргументов Х,Y = "срок 4" "p1"  соответственно.
В результате должны быть данные из ячейки с ненулевым значением ("изм. 3.06") и при этом  X, Y будут удовлетворять условиям.
Т.е. как я понимаю, в колонке заданной параметром "Х" должны проверяться все ячейки на соответствие параметру "Y", и из них уже ищется тот единственный вариант с ненулевым значением.
Предполагаю что на VBA это бы решил цикл, но я о VBA знаю только название, да и  запросов на поиск с разных мест в документе может быть несколько, что несколько ставит меня в тупик.

Для усложнённой версии может оказаться две и более ячеек с ненулевым значением, тогда они должны выдаваться как один блок (как если бы из сцепили). Хотя я сомневаюсь что усложнённый вариант можно исполнить без VBA.
 
Цитата
Function digga(pak, srok, table, kpak, ksrok, sep$)  
Спасибо большое, теперь попробую поковыряться со сложным вариантом. База для этого есть, можно рваться в перёд. Ещё раз благодарю.
 
Так это уже сложный вариант  :)  
Там приписку правильно поймите - не ту запятую менять, что в конце, а те, что между  :)

P.S. можете ещё усложнить - искать сразу несколько паков и сроков, возможно в паре.
Изменено: Hugo - 05.06.2013 17:15:01
 
Цитата
Hugo пишет:
Так это уже сложный вариант  :)
Там приписку правильно поймите - не ту запятую менять, что в конце, а те, что между :)
Я понял, спасибо, просто мне этой функции не хватало чтобы более сложную манипуляцию с массивом сделать.
Страницы: 1
Читают тему
Наверх