我是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
答案 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]
答案 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()表示法(也更快)。