2011-02-10 241 views
11

我是VBA新手,但對PHP很不錯。話雖這麼說,我用VBA循環掙扎......如何使用Excel 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中的值符合我的標準(請參見下文),則生成一些輸出並將其放入另一張表中。

我的輸出表是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 
+0

抱歉,但是這看起來相當混亂,似乎不匹配前面的東西。順便說一句,你說`如果a2> 8 AND a1 <16`你的意思是如果a2> 8 AND a2 <16`(第二個循環,第二行)。你想做更早的東西(第一,第二個Lopp)嗎? – Fionnuala 2011-02-10 16:04:17

+0

我以前的東西只是一個構建在我需要生成的裸露輸出上的示例。我上面的例子工作,但是VBA循環和變量是新手,我確信有一個更清晰的方法(幫助!)。回答你的問題,「是的」,這是一個錯字。 – Jeff 2011-02-10 16:06:58

回答

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

您可以cell.Row得到您的當前行。祝你好運^ _^

1

這裏沒有

首先,不使用單詞「細胞」作爲一個變量,它可以工作了很多你可以做,但是......,但它在玩火,所以

Dim curCell as Range 

其次,你應該通過範圍的單元格屬性循環

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 

注意:如果您的設置爲接近於每次都在同,使用工作表函數可能會更容易。

+0

優秀信息,謝謝!我使用這一行進行連接:`cLeft = cLeft&curCell。偏移(0,5)&「。」 &curCell.Offset(0,6)&vbLf`。更新了我的功能以反映更改。 – Jeff 2011-02-10 17:21:46

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