如何使用 Excel VBA 宏循环行?

Posted

技术标签:

【中文标题】如何使用 Excel VBA 宏循环行?【英文标题】:How to loop rows with Excel VBA macro? 【发布时间】:2011-06-24 19:29:37 【问题描述】:

我是 VBA 的新手,但对 php 非常了解。话虽如此,我正在为 VBA 循环而苦苦挣扎……

我有这张名为“SH1”的 40 行工作表:

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

【问题讨论】:

对不起,但这看起来很乱,似乎与早期的东西不匹配。顺便说一句,您说if a2 &gt; 8 AND a1 &lt; 16 是指a2 &gt; 8 AND a2 &lt; 16(第二个循环,第2 行)。你想做之前的事吗(第一个,第二个lopp)? 我之前的东西只是一个基于我需要生成的裸输出的示例。我上面的例子是有效的,但是对于 VBA 循环和变量是新手,我确信有一种更清洁的方法(帮助!)。要回答您的问题,“是”,这是一个错字。 【参考方案1】:
Dim cell As Range
For Each cell In Range("a1:a40")
    'do stuff here
Next cell

您可以使用cell.Row 获取当前行。祝你好运^_^

【讨论】:

【参考方案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

注意:如果您的设置每次都接近相同,那么只使用工作表函数可能会更容易。

【讨论】:

很棒的信息,谢谢!我使用这条线进行连接:cLeft = cLeft &amp; curCell.Offset(0, 5) &amp; "." &amp; curCell.Offset(0, 6) &amp; vbLf。更新了我的函数以反映这些变化。【参考方案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

【讨论】:

我没有看到任何用于写入 Sheet6 的连接,但 With Sheet6 声明确实让我大开眼界。 =) 它写入 sheet6 中的每一行,与 sheet 1 中的行匹配。在副本上尝试。

以上是关于如何使用 Excel VBA 宏循环行?的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 宏 - 在循环中连接

使用Excel VBA,如何将某一个工作表保存到新建的Excel中?

excel 运行VBA效率变低了 原来excel运行VBA程序,很快就执行完毕,现在运行相同的程序,效率变得很慢

如何在Excel VBA中定义一个在窗体控件和模块中均能使用的变量?

VBA宏运行速度为啥比Excel自带函数慢

如何向/从具有 VBA 宏计算的 Excel 文件发送和接收信息