Excel: найти последнее значение в массиве - PullRequest
1 голос
/ 21 февраля 2011

У меня есть набор данных с

> A b c d...AA,BB
>1,2,3,4 
> apple apple apple
> orange pear pear apple pear
> grapefruit,grape, grape,grape

Есть ли способ автоматически найти формулу в Excel для окончательного вхождения конкретного фрукта в массив?

Ответы [ 5 ]

6 голосов
/ 21 февраля 2011

Вам нужно использовать counta, чтобы указать количество элементов в массиве, и index, чтобы получить значение последнего элемента.

Вы можете попробовать

=INDEX(1:1,0,COUNTA(1:1))

Это найдет последнее значение в массиве 1: 1.

0 голосов
/ 06 ноября 2013

Предположим, у нас есть горизонтальный массив названий фруктов в A1: J1.Номер столбца для последнего вхождения «apple» будет:

{=MAX(COLUMN(A1:J1)*(A1:J1="apple"))}

Не забудьте нажать Ctrl + Shift + Enter , это формула массива.

Это та же идея, что и в концепции PPC о битовой маске и последовательных числах, но она придумана независимо и выражена в гораздо более компактном виде.:) Я не давал ему большого стресс-теста, но не видел проблем с использованием более сложных формул в нескольких местах по сотням элементов в каждом случае, чего мне вполне достаточно.

0 голосов
/ 28 июня 2012

Еще одно совершенно другое решение, которое понравится очень немногим: цель состоит в том, чтобы использовать огромное количество, содержащее все совпадения, в качестве битовой маски. Затем, используя арифметику, вы можете найти последнее совпадение.

Отказ от ответственности: это решение

  • Неэлегант
  • вычислительно тяжелый
  • переполнится умеренно большими записями (для меня ~ 1015). Переполнение может привести к чистым ошибкам (#NUM) и может также дать неправильный номер из-за чрезмерного округления числа с плавающей запятой (я не наблюдал, но это все еще возможно)

Вам нужно иметь массив последовательных чисел того же размера, что и ваш набор данных (хотя не обязательно должен быть близко). Если ваши фрукты находятся в A1: A10, вы можете поместить значения (1..10) в Z1: Z10.

= FLOOR(IMLOG2( 
    SUMPRODUCT( (A1:A10 = "orange")*1 ; Z1:Z10
  ) ; 1)

Давайте посмотрим на это:

  • SUMPRODUCT создаст битовую маску, содержащую 1, где у вас есть оранжевое слово
  • IMLOG2 (Почему в Excel нет log2 с действительными числами?) Вы получите (float) log2 маски
  • FLOOR урезает его, в результате получается «самый большой индекс» из 1 с в битовой маске

Надеюсь, вы найдете другие арифметические операции для поиска других совпадений

0 голосов
/ 28 июня 2012

Возможно, вы захотите попробовать это, хотя это заставляет вас сделать один дополнительный массив, оно ищет первое вхождение: поместите данные о фруктах в A1: A10 и добавьте дополнительный столбец рядом с ним в B1: B10 (этоважно и увы обязательно (см. описание VLOOKUP: должно быть? 1:? 10)) с числами от 1 до 10

Для заполнения столбца B вы можете использовать, в зависимости от ваших потребностей, формулы типа

= ROWS($B$1:B1)
= ROW() + offset

Тогда формула, которая получит вашу информацию: VLOOKUP (HLookup, если ваш массив данных горизонтален).Он будет искать значение в крайнем левом столбце матрицы аргументов и вернет совпадающее значение во 2-м столбце (3-й аргумент, столбец B в нашем случае).ЛОЖЬ - для точного соответствия.

= VLOOKUP("orange", A1:B10, 2, FALSE)

Помните о недостатках: * Вы должны добавить один дополнительный столбец данных, будь это удобно или нет * Он будет искать первый результат.period.

(Я все еще ищу лучший способ действительно найти MIN и MAX массива результатов, но пока безуспешно, за исключением формул Ctrl-Shift-Enter, которые не нужныПожалуйста, напишите обратно, если найдете)

0 голосов
/ 21 февраля 2011

Напишите пользовательскую функцию для поиска данных в обратном направлении от последней ячейки

Function LastFruit(r As Range, Fruit As String) As Range
    Dim rw As Long, col As Long
    For rw = r.Rows.Count To 1 Step -1
        For col = r.Cells.Count To 1 Step -1
            If r.Cells(rw, col) = Fruit Then
                Set LastFruit = r.Cells(rw, col)
            End If
        Next
    Next

End Function
...