问题 如何使用Excel VBA宏循环行?


我是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

7994
2018-02-10 11:53


起源

对不起,但这看起来很混乱,似乎与之前的东西不符。顺便说一句,你说 if a2 > 8 AND a1 < 16 你的意思是 a2 > 8 AND a2 < 16 (第二个循环,第2行)。你想做更早的事情(第一次,第二次lopp)吗? - Fionnuala
我之前的东西只是建立在我需要生成的裸输出上的一个例子。我上面的例子正在工作,但对VBA循环和变量不熟悉,我确信有一种更清洁的方法(帮助!)。要回答你的问题,“是的”,这是一个错字。 - Jeff


答案:


Dim cell As Range
For Each cell In Range("a1:a40")
    'do stuff here
Next cell

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


11
2018-02-10 12:06





怎么样:

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

3
2018-02-10 17:08



我没有看到写入Sheet6的任何连接,但那 With Sheet6 声明确实打开了我的眼睛。 =) - Jeff
它写入sheet6中的每一行,与表单1中的行匹配。在副本上尝试。 - Fionnuala


你可以做的不是很多,但......

首先,不要使用“单元格”这个词作为变量,它可能会起作用,但它正在玩火,所以

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

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


1
2018-02-10 16:30



好消息,谢谢!我用这行连接: cLeft = cLeft & curCell.Offset(0, 5) & "." & curCell.Offset(0, 6) & vbLf。更新了我的功能以反映更改。 - Jeff