Найти соответствие между двумя неравными массивами вариантов - PullRequest
0 голосов
/ 21 марта 2020

Мне нужно проверить, имеет ли каждая строка в arr1 совпадение в arr2.

Если есть совпадение, напишите «Match» в столбец рядом с arr1, если нет, то «Not Match».

Вот как выглядит мой лист:

How my Sheet looks

Sub Variant_Array_Question()
'Here is my frankenstein monster of a code
    Dim DocNm As Variant, NroNm As Variant
    Dim i As Long, j As Long
    Dim NroLastRow As Long, DocLastRow As Long

    'Arr1
    DocLastRow = ShStart.Range("Q" & Rows.Count).End(xlUp).Row
    DocNm = ShStart.Range("Q6:Q" & DocLastRow).Value

    'Arr2
    NroLastRow = ShStart.Range("T" & Rows.Count).End(xlUp).Row
    NroNm = ShStart.Range("T6:T" & NroLastRow).Value

    For i = 1 To UBound(DocNm)
        For j = 1 To UBound(NroNm)
            If DocNm(i, 1) = NroNm(j, 1) Then
                'Match was found ==== Run into Problem here
                DocNm(i, 1).Offset(0, 1).Value = "Match"
                Exit For
            End If
        Next j
        If i > UBound(NroNm) Then
            'No match was found ==== Run into Problem here
            DocNm(i, 1).Offset(0, 1).Value = "Not Match"
        End If
    Next i
End Sub

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Вот код, который FaneDuru помог мне решить. Это касается тех нуждающихся нубов, как я.

Sub Variant_Array_Response()
    Dim DocNm As Variant, NroNm As Variant, ResStatus As Variant
    Dim i As Long, j As Long, boolFound As Boolean
    Dim NroLastRow As Long, DocLastRow As Long
    Dim ShStart As Worksheet

    Set ShStart = ActiveSheet

    'Arr1
    DocLastRow = ShStart.Range("Q" & Rows.Count).End(xlUp).Row
    DocNm = ShStart.Range("Q6:Q" & DocLastRow).Value

    'Arr2
    NroLastRow = ShStart.Range("T" & Rows.Count).End(xlUp).Row
    NroNm = ShStart.Range("T6:T" & NroLastRow).Value

    'Arr3
    'ResStatus = ShStart.Range("Q6:Q" & DocLastRow).Offset(, 1) 'What I had
    ReDim ResStatus(1 To UBound(DocNm, 1), 1 To 1) 'FaneDuru's pice

    For i = 1 To UBound(DocNm)
        For j = 1 To UBound(NroNm)
            If DocNm(i, 1) = NroNm(j, 1) Then
                boolFound = True
                ResStatus(i, 1) = "Match"
                Exit For
            End If
        Next j

        If Not boolFound Then
            ResStatus(i, 1) = "Not Match"
        End If
        boolFound = False
    Next i
    ShStart.Range("R6").Resize(UBound(ResStatus, 1), 1).Value = ResStatus
End Sub
0 голосов
/ 22 марта 2020

DocNm(i, 1).Offset(0, 1).Value = "Match" не имеет значения для массива. Массив не имеет свойства Offset.

Если ваш пример листа действителен с точки зрения размера диапазонов, используйте Ranges вместо массивов.

Чтобы использовать массивы и получить результат, который вам нужен, вы должны использовать третий массив. Измерьте его как ваш первый массив Ubound, но я лучше преобразую ваш код:

Sub Variant_Array_Question()
    Dim DocNm As Variant, NroNm As Variant, arrStat As Variant
    Dim i As Long, j As Long, boolFound As Boolean
    Dim NroLastRow As Long, DocLastRow As Long
    Dim ShStart As Worksheet
    Set ShStart = ActiveSheet 'use here your sheet!!!
    'Arr1
    DocLastRow = ShStart.Range("Q" & Rows.Count).End(xlUp).Row
    DocNm = ShStart.Range("Q6:Q" & DocLastRow).value
    ReDim arrStat(1 To UBound(DocNm, 1), 1 To 1) 'arr 3
    'Arr2
    NroLastRow = ShStart.Range("T" & Rows.Count).End(xlUp).Row
    NroNm = ShStart.Range("T6:T" & NroLastRow).value

    For i = 1 To UBound(DocNm)
        For j = 1 To UBound(NroNm)
            If DocNm(i, 1) = NroNm(j, 1) Then
                boolFound = True
                arrStat(i, 1) = "Match"
                Exit For
            End If
        Next j
        If Not boolFound Then
            arrStat(i, 1) = "Not Match"
        End If
        boolFound = False
    Next i
    ShStart.Range("R6").Resize(UBound(arrStat, 1), 1).value = arrStat
End Sub

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

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