Поиск ссылки на ячейку для значения в случайном массиве 5x5 - PullRequest
1 голос
/ 18 апреля 2019

У меня есть массив 5x5 с буквами A-Y в случайных местах. Мне нужно найти, где конкретное письмо находится в массиве. Мне удалось получить матрицу 1x25 с помощью функции поиска, сопоставления и номера, в которой было 1 в месте желаемого значения, но я не знаю, как извлечь эту позицию из массива.

{a, b, c, d, e; f, g, h, i, j; k, l, m, n, o; p, q, r, s, t; у, у, у, х, у}

если я ищу "d" вернется

{0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}

Как мне извлечь, что 'd' было на четвертой позиции или [1,4] исходного массива? В исходной задаче персонажи расположены не в определенном порядке. Они абсолютно случайны.

Я делаю это в таблице Excel, поэтому пытаюсь найти формулу, которая будет работать, а не код VBA. количество вокруг поиска, чтобы получить матрицу 1x25

Ответы [ 4 ]

1 голос
/ 18 апреля 2019

Просто ради альтернативы:

enter image description here

Чтобы получить строку: =SUMPRODUCT((A1:E5=B7)*ROW(A1:E5))

Чтобы получить столбец: =SUMPRODUCT((A1:E5=B7)*COLUMN(A1:E5))

1 голос
/ 18 апреля 2019

Вложенный For Next кажется подходящим. Комментарии в коде.

Sub finInArray()

    Dim i As Long, j As Long, arr As Variant, z As String, bFoundIt As Boolean

    'dimmension array
    ReDim arr(0 To 4, 0 To 4)

    'populate array
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            arr(i, j) = Chr(65 + i + j)
        Next j
    Next i

    'designate char to find
    z = "H"

    'find in array
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            If z = arr(i, j) Then
                bFoundIt = True
                'stop looping j
                Exit For
            End If
        Next j
        'if found, stop looping i
        If bFoundIt Then Exit For
    Next i

    'was it found?
    If i <= UBound(arr, 1) And j <= UBound(arr, 2) Then
        Debug.Print z & " found at arr(" & i & ", " & j & ")"
    End If

End Sub
1 голос
/ 18 апреля 2019

Предположения:

  • Ваши письма находятся в отдельной ячейке
  • Нет повторений букв (или чего-либо, что вы хотите найти), каждая ячейка уникальна
  • Ваша матрица 5X5 начинается в C2
  • Значение, которое вы хотите найти, находится в A2

AGGREGATE - моя функция выбора здесь. Он будет выполнять операции с массивами для формул 14 и 15. Его можно настроить так, чтобы он игнорировал ошибки, которые будут использоваться в наших интересах, и мы можем выбирать, в каком месте списка результатов мы хотим получить результаты. АГРЕГАТ принимает форму:

AGGREGATE(Formula #, Ignore Option #, range/array, parameter)
  • Формула 15 отсортирует список результатов от наименьшего к наибольшему. Формула 14 делает это от самого большого до самого маленького. при условии, что все записи уникальны, не имеет значения, какой из них используется.

  • Опция 6 будет игнорировать все ошибки в диапазоне / массиве

  • Для части диапазона / массива создайте список всех номеров строк / столбцов электронной таблицы. Постройте формулу один раз для строк, затем повторите ее и переключитесь на столбцы. Разделите номер строки или столбца на результат ИСТИНА / ЛОЖЬ. в этом случае будет ли диапазон / массив равен вашему поисковому запросу. При отправке ИСТИНА / ЛОЖЬ с помощью математической операции (не для всех функций) ИСТИНА становится равной 1, а ЛОЖЬ - 0. Деление на 0 приведет к ошибке. только строки, в которых задан ваш поисковый термин, будут разделены на 1, оставив номер строки без изменений. Поскольку опция 6 игнорирует все ошибки, у вас останется список номеров строк, в которых есть ваш поисковый запрос. Если ваши ячейки уникальны, это означает, что у вас будет только 1 номер строки.

  • Параметр part для формул 14 и 15 определяет, какую позицию из отсортированных результатов вы хотите вернуть. В этом случае требуется первое вхождение, поэтому оно должно быть 1.

Объединение этой информации говорит нам, что наша формула AGGREGATE должна выглядеть примерно так:

FOR ROW
AGGREGATE(15,6,ROW($C$2:$G$6)/($C$2:$G$6=$A$2),1)

FOR COLUMN
AGGREGATE(15,6,COLUMN($C$2:$G$6)/($C$2:$G$6=$A$2),1)

Теперь это скажет вам, в каком столбце и строке таблицы вы находитесь. Если вы запускаете матрицу / массив в A1, вам больше ничего не нужно делать. Однако это решение предполагало, что ваша матрица началась в C2. Это означает, что ваши строки строк и столбцов матрицы не совпадают с номерами строк и столбцов электронных таблиц. Незначительные корректировки должны быть сделаны. Просто вычтите начальную позицию матрицы и добавьте 1. Эта настройка сделает формулу похожей на:

FOR ROW
AGGREGATE(15,6,ROW($C$2:$G$6)/($C$2:$G$6=$A$2),1)-ROW($C$2)+1

FOR COLUMN
AGGREGATE(15,6,COLUMN($C$2:$G$6)/($C$2:$G$6=$A$2),1)-COLUMN($C$2)+1

POC

0 голосов
/ 18 апреля 2019

Мне нравится совокупность, но я не был знаком с этим раньше. Спасибо !!

Я также нашел решение после того, как отправил вопрос.

SUM((MMULT((rowfind_array),--(ISNUMBER(SEARCH("D",data))))))

где rowfind_array - матрица 1x5 с 1 2 3 4 5, а data - матрица 5x5 с буквами или пробелами в ней. Это возвращает номер строки письма, если найдено.

Поиск, isnumber и "-" возвращают массив 5x5 со всеми 0 и 1, где был найден искомый элемент. Умножая его на массив 5x1 или 1x5 до или после результата, а затем суммируя окончательный массив, получим число 1-5, которое указывает номер моей строки (или столбца).

Таким образом, число столбцов просто переключает размеры массива искателя и помещает его после массива данных, а не до.

SUM((MMULT(--(ISNUMBER(SEARCH("D",data))),colfind_array)))

где colfind_array - матрица 5x1 с 1 2 3 4 5, а data - матрица 5x5 с буквами или пробелами в ней. Возвращает номер столбца, если он найден.

Простой = if (countif ("D", data) = 1, ... проверьте, есть ли буква для начала, и я все сделал.

Я использую это, чтобы найти строки и столбцы записей в помощнике по судоку 25x25. Если буквы находятся в блоке 5x5, он возвращает строку и столбец, чтобы исключить строки и столбцы для оставшихся без ответа квадратов. Работает довольно хорошо!

Если у вас есть другие разумные способы решения этой проблемы, пожалуйста, поделитесь. Спасибо, Dan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...