Найти адрес соответствующего диапазона - PullRequest
0 голосов
/ 21 февраля 2019

На изображении ниже я пытаюсь найти адрес всех соответствующих ячеек.То есть, если OneSource (например) найден в 3 строках (это всегда будут непрерывные строки), то мне нужно показать адрес, например, F2: F4.

enter image description here

Как вы можете видеть на картинке, я создал формулу, которая дает мне адрес первого экземпляра матча, но не полный диапазон.

=CELL("address",INDEX($F$2:$F$12,MATCH(A2,$F$2:$F$12,0),1))

Как мне получить полный диапазон адресов?

Ответы [ 3 ]

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

Если вам интересно использовать VBA Change Event, вы можете попробовать:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LastrowA As Long, LastrowF As Long, i As Long, y As Long
    Dim Source As String, strAddress As String
    Dim ws As Worksheet

    'Set the sheet which you will use
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With ws
        'Find Last rows for Column A & F
        LastrowA = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastrowF = .Cells(.Rows.Count, "F").End(xlUp).Row
    End With

    'Chek if the changes intersect our ranges

    If Not Intersect(Target, Range("A:A", "F:F")) Is Nothing Then

        For i = 2 To LastrowA

            Source = ws.Range("A" & i).Value

            Application.EnableEvents = False
                'Count Times
                ws.Range("B" & i).Value = Application.WorksheetFunction.CountIf(ws.Range("F2:F" & LastrowF), Source)

                strAddress = ""
                'Import Address
                For y = 2 To LastrowF
                    If ws.Range("F" & y).Value = Source Then
                        If strAddress = "" Then
                            strAddress = ws.Range("F" & y).Address
                        Else
                            strAddress = strAddress & "," & ws.Range("F" & y).Address
                        End If
                    End If
                Next y

                ws.Range("C" & i).Value = strAddress

            Application.EnableEvents = True

        Next i

    End If

End Sub

Результаты:

enter image description here

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

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

=ADDRESS(MATCH(A2, E:E, 0), 5, 4)&":"&ADDRESS(MATCH(A2&" ", E:E), 5, 4)

Первый адрес - это обычное точное совпадение.Второй адрес достигается путем поиска последнего в отсортированном списке путем добавления символа пробела.

Поскольку вы имеете дело с известным столбцом, я отбросил функцию CELL в пользу ADDRESS.Конструктор.

enter image description here

Этот метод двоичного сопоставления отсортированных данных будет давать ненадежные результаты (результаты, а не ошибки, которые могут быть или не быть правильными) нанесортированные данные.

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

Предполагая, что данные отсортированы, вам потребуется две части формулы: первая часть, чтобы получить адрес первой ячейки, и вторая часть, чтобы получить адрес последней ячейки.Вы уже получили первую часть.Для второй части вы можете использовать аналогичную формулу, но обратите внимание, что MATCH отличается:

=CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,0)))&":"&CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,1)))

enter image description here


РЕДАКТИРОВАТЬ: Я пропустил более простое решение MATCH для второй части ранее.Если вы все еще заинтересованы в предыдущей формуле массива, это следующее:

=CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,0)))&":"&CELL("address",INDEX($F$2:$F$16,MAX(IF($F$2:$F$16=A2,ROW($F$2:$F$16)-1))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...