提问人:Jeff 提问时间:2/10/2011 最后编辑:RubberDuckJeff 更新时间:2/17/2015 访问量:71310
如何使用Excel VBA宏循环行?
How to loop rows with Excel VBA macro?
问:
我是 VBA 的新手,但对 PHP 相当擅长。话虽如此,我正在为 VBA 循环而苦苦挣扎......
我有这张有 40 行的工作表,称为“SH1”:
SH1
A B C D E
1 2 One 1.0a 12
2 7 Two 2.0b 34
3 13 Three 3.0c 56
4 14 Four 4.0d 78
..
40
我需要遍历 40 行并检查 A 列中的值。如果 A 列中的值符合我的条件(见下文),请生成一些输出并将其放入另一张工作表中。
我的输出表是 3 列,称为“SH2”:
SH2
A B C D E
1 1.0a 12 One
2.0b 34 Two
2 3.0c 56 Three
4.0d 78 Four
..
15
我决定什么去哪里的标准:
// First loop:
if a1 < 8, put c1 in SH2 a1, put d1 in SH2 b1, put b1 in SH2 c1
if a2 < 8, put c2 in SH2 a1, put d2 in SH2 b1, put b2 in SH2 c1
// ... loop through a40 ...
然后:
// Second loop:
if a1 > 8 AND a1 < 16, put c1 in SH2 a2, put d1 in SH2 b2, put b1 in SH2 c2
if a2 > 8 AND a2 < 16, put c2 in SH2 a2, put d2 in SH2 b2, put b2 in SH2 c2
// ... loop through a40 ...
进度编辑:
似乎正在工作,但想知道是否有“更清洁”的方法?
Sub CatchersPick2()
Dim curCell As Range
For Each curCell In Sheet4.Range("C3:C40").Cells
If curCell.Value > 0 And curCell.Value < 73 Then
cLeft = cLeft _
& curCell.Offset(0, 5) & "." _
& curCell.Offset(0, 6) & vbLf
cMidl = cMidl _
& curCell.Offset(0, -2) & ", " _
& curCell.Offset(0, -1) & " " _
& curCell.Offset(0, 7) & vbLf
cRght = cRght _
& curCell.Offset(0, 9) & " " _
& curCell.Offset(0, 2) & " " _
& curCell.Offset(0, 11) & " " _
& curCell.Offset(0, 10) & vbLf
End If
Next curCell
Sheet6.Range("B3") = cLeft
Sheet6.Range("C3") = cMidl
Sheet6.Range("D3") = cRght
Sheet6.Range("B3:D3").Rows.AutoFit
Sheet6.Range("B3:D3").Columns.AutoFit
End Sub
答:
11赞
jswolf19
2/10/2011
#1
Dim cell As Range
For Each cell In Range("a1:a40")
'do stuff here
Next cell
您可以使用 获取当前行。祝你好运^_^cell.Row
1赞
Lance Roberts
2/11/2011
#2
你能做的不多,但是......
首先,不要使用“细胞”这个词作为变量,它可能有效,但它是在玩火,所以
Dim curCell as Range
其次,应遍历 Range 的 Cells 属性
For Each curCell In Range("C3:C40").Cells
第三,你不需要选择单元格,你只需操作 curCell 变量即可
最后,您不需要使用 ActiveCell,只需使用 curCell 变量即可。
If curCell.Value < 35 And curCell.Value > 0 Then
cLefta = curCell.Offset(0, 5) & "."
事实上,你也可以只使用一个像'c'这样的短变量,把整个事情放在一行上:
cLeft = c.Offset(0,5) & "." & c.Offset(0,6) & vblf
注意:如果您的设置每次都接近相同,那么仅使用 worksheet-functions 可能会更容易。
评论
0赞
Jeff
2/11/2011
很棒的信息,谢谢!我使用这一行进行连接:.更新了我的函数以反映更改。cLeft = cLeft & curCell.Offset(0, 5) & "." & curCell.Offset(0, 6) & vbLf
3赞
Fionnuala
2/11/2011
#3
怎么样:
Sub Catchers()
Dim cell As Range
Sheet1.Select 'SHEET: C
For Each cell In Range("C3:C40")
If cell.Value < 35 And cell.Value > 0 Then
With Sheet6
.Range("B" & cell.Row) = cell.Offset(0, 5) _
& "." & cell.Offset(0, 6)
.Range("C" & cell.Row) = cell.Offset(0, -2) _
& ", " & cell.Offset(0, -1) _
& " " & cell.Offset(0, 7)
.Range("D" & cell.Row) = cell.Offset(0, 9) _
& " " & cell.Offset(0, 2) _
& " " & cell.Offset(0, 11) _
& " " & cell.Offset(0, 10)
End With
End If
Next cell
Sheet6.Range("B4:D4").Rows.AutoFit
Sheet6.Range("B4:D4").Columns.AutoFit
End Sub
评论
1赞
Jeff
2/11/2011
我没有看到任何写给 Sheet6 的串联,但这句话确实让我大开眼界。=)With Sheet6
0赞
Fionnuala
2/11/2011
它写入工作表 6 中的每一行,与工作表 1 中的行匹配。在副本上尝试一下。
评论
if a2 > 8 AND a1 < 16
a2 > 8 AND a2 < 16