фильтровать значения в столбце с помощью цикла? - PullRequest
1 голос
/ 07 октября 2011

Я новичок в VBA, поэтому, пожалуйста, держитесь со мной. Я пытаюсь запрограммировать простой цикл, который будет проходить через выбранные пользователем значения и отфильтровывать отображаемые числа и числа, которые я хочу, в другом столбце. У меня есть 10 случайных чисел в столбце в следующем порядке: 3 7 10 12 5 2 7 13 9 23. По сути, я хочу игнорировать первое значение, получить следующие два значения, пропустить четвертое значение, получить следующие два значения и так далее. Таким образом, мой вывод будет: 7 10 5 2 13 9 Все, что у меня есть, это цикл, который проходит через столбец. Я думаю, что я должен был бы использовать функцию mod (), но я не могу sem, чтобы понять это правильно. Все, что у меня есть, это пустой цикл:

Sub findValues()

Do While Cells(x, 3).Value <> "" 'go through values in column 3 until empty cell is encountered
    'skip first value
    'retrieve next two values and put them in different column
    '...
Loop

End Sub

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Вот одно решение сделать это, используя цикл и Шаг 3.

Это не самый быстрый или оптимизированный способ, но это один из многих методов, который работает, и этот метод довольно прост. В примере предполагается, что данные находятся в столбце A, а новый список будет выведен в столбец B.

Поскольку вы хотите пропустить первое значение, я запускаю цикл в A2, затем выполняю шаг 3 для каждого цикла (но копирую 2 элемента, поэтому он всегда пропускает 3-й элемент).

Sub test()

Application.ScreenUpdating = False
Dim i As Long, j As Long
Dim lastRow As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
j = 1

For i = 2 To lastRow Step 3
    Cells(j, 2).Value = Cells(i, 1).Value
    Cells(j + 1, 2).Value = Cells(i + 1, 1).Value
    j = j + 2
Next

Application.ScreenUpdating = True
End Sub

Обратите внимание, что использование Ячейки (строка, столбец) лучше для зацикливания, чем нотация Range () (и тоже быстрее).

3 голосов
/ 07 октября 2011

[Обновление: решение формулы]

введите это значение в D1 и скопируйте на 2/3 длину столбца C = IF (MOD (ROW (), 2) = 1, OFFSET ($ C $ 1, INT (СТРОКА () / 2) * 3 + 1,0), OFFSET ($ C $ 1, INT (СТРОКА () / 2) * 3-1,0))

[исходное сообщение]

Я использовал вариантный массив, так как он более эффективен (хотя и немного сложнее), чем цикл

ВКороче говоря, вы искали функцию Mod, где (Row-1) Mod 3 = 0 следует исключить

т.е. исключить позицию 1,4,7 и т. д.

Этот код выводит выходные данные изот столбца C до D. Он будет обслуживать столько же значений, что и в C (обратите внимание, я установил диапазон c, глядя вверх снизу, а не сверху, поэтому пробелы не проходят через код)

Sub GetValues()
        Dim rng1 As Range
        Dim lngCnt As Long
        Dim lngCnt2 As Long
        Dim X
        Dim Y
        Set rng1 = Range([c1], Cells(Rows.Count, "C").End(xlUp))
        X = rng1
        ReDim Y(1 To 2 / 3 * rng1.Cells.Count, 1 To 1)
        For lngCnt = 1 To UBound(X, 1)
            If (lngCnt - 1) Mod 3 <> 0 Then
            lngCnt2 = lngCnt2 + 1
            Y(lngCnt2, 1) = X(lngCnt, 1)
            End If
        Next
        [d1].Resize(UBound(Y, 1), 1) = Y
    End Sub]

enter image description here

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