Выбор неправильного диапазона - PullRequest
0 голосов
/ 25 октября 2018

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

Rwave2 генерирует диапазон, который начинается после конца Rwave, каким-то образом беря значения из исходного диапазона «Экспорт».

Первое значение s = 44928 и e = 85991, а второе значение s = 1 и e = 2388. Однако второй диапазон начинается с 89855 исходного диапазона ячеек «Экспорт» и 2388 значений после.Не 1-2388 из диапазона Rwave.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Set KeyCells = Range("B4")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
           Dim wave As String
           wave = CStr(Range("B4").Value)
           Dim Rwave As Range
           Dim s, e As Long
           'Separate by Wave
           s = Search_Start(Sheets("Export").Range("A:A"), "A", wave)
           e = Search_End(Sheets("Export").Range("A:A"), "A", wave, s)
           Set Rwave = Sheets("Export").Range(Sheets("Export").Cells(s, "A"), Sheets("Export").Cells(e, "G"))
           Sheets("TestSheet1").UsedRange.ClearContents
           Rwave.Copy Sheets("TestSheet1").Range("A1")

           For i = 6 To 56
            'Separate by Zone
            Dim Rwave2 As Range
            s = Search_Start(Rwave, "B", CStr(Sheets("Sheet1").Cells(i, "B")))
            e = Search_End(Rwave, "B", CStr(Sheets("Sheet1").Cells(i, "B")), s)
            Set Rwave2 = Rwave.Range(Rwave.Cells(s, "A"), Rwave.Cells(e, "G"))
            Sheets("TestSheet2").UsedRange.ClearContents
            Rwave2.Copy Sheets("TestSheet2").Range("A1")

            'Create an array of only the unique locations
            Dim tmp, cell As String
            Dim arr() As String
            tmp = "|"
            For j = 1 To Rwave2.Rows.Count
                'Only count the locations on the right level
                If Rwave2.Cells(j, "C") = Sheets("Sheet1").Cells(i, "C") Then
                    cell = Rwave2.Cells(j, "D")
                    If (cell <> "") And (InStr(tmp, cell) = 0) Then
                        tmp = tmp & cell & "|"
                    End If
                End If
            Next j
            If Len(tmp) > 0 Then tmp = Left(tmp, Len(tmp) - 1)
            arr = Split(tmp, "|")

            Cells(i, "M") = UBound(arr) - LBound(arr)
           Next i
    End If
End Sub

Function Search_Start(r As Range, c As String, y As String) As Double
    For i = 1 To r.Rows.Count
        If InStr(r.Cells(i, c), y) <> 0 Then
                Search_Start = i
            Exit Function
        End If
    Next i
    Search_Start = 1
End Function

Function Search_End(r As Range, c As String, y As String, s As Variant) As Double
    For i = s To r.Rows.Count
        If InStr(r.Cells(i, c), y) = 0 Then
            Search_End = i - 1
            Exit Function
        End If
    Next i
    Search_End = r.Rows.Count
End Function

1 Ответ

0 голосов
/ 25 октября 2018

Думаю, я вижу, что происходит сейчас.

Приведенный ниже код будет искать столбец C диапазона B5:D10.
Поскольку диапазон поиска начинается с столбца B - затем столбца C - это третий столбец, который является столбцом D при просмотре всего листа.

Точно так же вы считаете строки в пределах вашего диапазона.Если ячейка листа D7 содержит слово Yellow, то она вернет i=3, поскольку это третья строка в вашем диапазоне.

Sub Test()

    Debug.Print Search_Start(Sheet3.Range("B5:D10"), "C", "Yellow")

End Sub

Function Search_Start(r As Range, c As String, y As String) As Double
    Dim i As Long

    For i = 1 To r.Rows.Count
        Debug.Print r.Cells(i, c).Address
        If InStr(r.Cells(i, c), y) <> 0 Then
                Search_Start = i
            Exit Function
        End If
    Next i
    Search_Start = 1
End Function  

Чтобы вернуть правильный номер, используйте Search_Start = r.Cells(i, c).Row.

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