简体   繁体   English

如何使用Excel VBA宏循环行?

[英]How to loop rows with Excel VBA macro?

I am new to VBA, but pretty good with PHP. 我是VBA的新手,但对PHP非常好。 That being said, I'm struggling with VBA loops... 话虽这么说,我正在努力与VBA循环......

I have this sheet with 40 rows called "SH1": 我有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

I need to loop through 40 rows and check the value in column A. If the value in column A meets my criteria (see below), generate some output and put it in another sheet. 我需要遍历40行并检查A列中的值。如果A列中的值符合我的条件(见下文),则生成一些输出并将其放入另一张表中。

My output sheet is 3-columns and called "SH2": 我的输出表是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

My criteria for deciding what goes where: 我决定什么去哪里的标准:

// 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 ...

Then: 然后:

// 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 ...

PROGRESS EDIT: 进展编辑:

Seems to be working, but wondering if there is a "cleaner" way? 似乎工作,但想知道是否有“更清洁”的方式?

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
Dim cell As Range
For Each cell In Range("a1:a40")
    'do stuff here
Next cell

You can get your current row with cell.Row . 您可以使用cell.Row获取当前行。 Good luck ^_^ 祝你好运^ _ ^

How about: 怎么样:

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

There's not a lot you can do, but... 你可以做的不是很多,但......

First, don't use the word 'cell' as a variable, it may work, but it's playing with fire, so 首先,不要使用“单元格”这个词作为变量,它可能会起作用,但它正在玩火,所以

Dim curCell as Range

Second, you should loop through the Cells property of the Range 其次,您应该遍历Range的Cells属性

For Each curCell In Range("C3:C40").Cells

Third, you don't need to Select the cell, you can just manipulate the curCell variable 第三,你不需要选择单元格,你可以只操纵curCell变量

Lastly, you won't need to use ActiveCell, just use the curCell variable. 最后,您不需要使用ActiveCell,只需使用curCell变量即可。

If curCell.Value < 35 And curCell.Value > 0 Then

    cLefta = curCell.Offset(0, 5) & "."

In fact, you could also just use a short variable like 'c' and put the whole thing on one line: 事实上,您也可以使用像'c'这样的短变量,并将整个事物放在一行上:

cLeft = c.Offset(0,5) & "." & c.Offset(0,6) & vblf

Note: If your setup is close to the same every time, it would probably be easier to just use worksheet-functions. 注意:如果您的设置每次都接近相同,那么使用工作表函数可能会更容易。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM