用循环过滤列中的值?

时间:2011-10-07 01:39:54

标签: excel loops excel-vba vba

我是VBA新手所以请光临我。 我正在尝试编写一个简单的循环来运行用户选择的值,并在不同的列中过滤掉一些数字显示和我想要的数字。 我按顺序在一列中有10个随机数: 3 7 10 12 五 2 7 13 9 23。 我基本上想要忽略第一个值,检索接下来的两个值,跳过第四个值 值,检索接下来的两个值,依此类推。所以我的输出是: 7 10 五 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 个答案:

答案 0 :(得分:3)

[更新:公式解决方案]

在D1中输入此内容并将C列长度的2/3复制下来 = IF(MOD(ROW(),2)= 1,OFFSET($ C $ 1,INT(ROW()/ 2)* 3 + 1,0),OFFSET(1 $ C $,INT(ROW()/ 2) * 3-1,0))

[首发帖子]

我使用变量数组比循环

更有效(虽然稍微复杂一些)

简而言之,您所寻找的是Mod功能 (第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

答案 1 :(得分:3)

这是一个使用循环和步骤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

请注意,使用 Cells(行,列)更适合循环而不是Range()表示法(也更快)。