Выберите диапазон, равный переменным в массиве, используя цикл - PullRequest
0 голосов
/ 02 апреля 2020

enter image description here

Я написал программу с использованием VBA, которая показана ниже. был массив (ary), который содержит (C, F, B, P C, PB). Я создаю l oop - go через каждую переменную в массиве.

что я хочу сделать с моим кодом, так это то, что у меня есть таблица данных, которая включает значения этого массива в виде категорий. Я хочу присвоить каждому значению массива диапазон p . затем выполнить данные из диапазона р. затем хотите присвоить p следующему значению массива и сделать то же самое.

, но проблема в том, что диапазон p сначала устанавливается ary (1) = "C" и дает правильный результат. но после того, как он становится равным «F» не работает должным образом. он содержит тот же диапазон, что и ранее. кто-нибудь может мне помочь с этой проблемой?

For i = 1 To UBound(ary)
cat = ary(i)
Set p = Nothing
Set c = Nothing
    For Each c In Range("E:E")
        If c.Value = cat Then
            If p Is Nothing Then
                Set p = c.Offset
        Else
            Set p = Union(p, c)
        End If
    End If
Next c

'get values
p.Offset(, -1).Copy Destination:=ws.Range("N" & Rows.Count).End(xlUp).Offset(1)

next i

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Ключевая ошибка в вашем коде заключается в том, что вы можете собрать диапазон непоследовательных ячеек и вставить их значение в непрерывный диапазон. Excel не может этого сделать. Мой код ниже собирает квалифицирующие значения в массив и вставляет этот массив в целевой диапазон.

Приведенный ниже код не может быть именно тем, что вы хотите, потому что вы не предоставили важную информацию. Тем не менее, попробуйте в любом случае, чтобы адаптировать его к вашему проекту.

Private Sub Review()

    Dim Ws As Worksheet
    Dim Rng As Range
    Dim Rl As Long                              ' last row in column E
    Dim Ary() As String
    Dim Arr As Variant
    Dim n As Long
    Dim Cell As Range
    Dim i As Long

    Set Ws = Worksheets("Sheet1")
    Ary = Split("C,F,B,PC,PB", ",")             ' this array would be 0-based
    Rl = Cells(Rows.Count, "E").End(xlUp).Row   ' Range("E:E") has 1.4 million cells
    Set Rng = Range(Cells(2, "E"), Cells(Rl, "E"))

    For i = 0 To UBound(Ary)
        ReDim Arr(1 To Rl)
        n = 0
        For Each Cell In Rng
            If Cell.Value = Ary(i) Then
                n = n + 1
                Arr(n) = Cell.Offset(0, 1).Value
            End If
        Next Cell

        If n Then
            ReDim Preserve Arr(n)
            'get values
            Ws.Cells(Ws.Rows.Count, "N").End(xlUp).Offset(1) _
                    .Resize(UBound(Arr)).Value = Arr ' Application.Transpose(Arr)
        End If
    Next i
End Sub

Этот код полностью работает с ActiveSheet, а затем вставляет результат на другой лист, называемый «Лист1». Это не хорошая практика. Лучшим способом было бы объявить переменные для обоих листов и позволить коду ссылаться на переменные, чтобы обеспечить полный контроль над тем, над каким листом он работает в любое время.

0 голосов
/ 02 апреля 2020

Set p = Union(p, c) никогда не будет выполнено, потому что это произойдет, только если p НЕ является ничем, а Set p = Nothing выполняется каждый раз, когда внешний l oop повторяется.

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