2013-08-06 137 views
0

我正在使用excel宏,並陷入了一個困境。需要幫助來解決它。excel vba爲每個循環嵌套

我必須在工作表中查找2行,並且對於1行中的每個值查找2行中的單元格值。如果第2行中的值範圍等於某個條件值,則從第2行檢查並將該標誌設置爲true。爲了實現這一點,我用了兩個For Each循環:

Sub Sendmail() 
    For Each cell in Rows("5").Cells.SpecialCells(xlCellTypeConstant) 
     If cells.Value Like "*@*" Then 
      Subj = "Fill the Sheet" 
      Recipient = cell.Offset(0,-3).Value 
      EmailAddr = cell.Offset.Value 
      For Each row In Sheet14.Range("O244:AK244").Cells 
       If Not row = '8.00" Then 
        found = False 
       Else 
        found = True 
       End If 
      Next row 
      If found = False Then 
       Msg = "Hi " & Recipient & vbCrLf & vbCrLf 
       Msg = Msg & " Please fill the sheet for this week " & vbCrLf & vbCrLf 
       Set MItem = Outlook.CreateItem(oIMailItem) 
       With MItem 
        .To = EmailAddr 
        .Subject = Subj 
        .Body = Msg 
        .Save 
       End With 
      End If 
     End If 
    Next 
End Sub 

這裏使用的found變量定義爲布爾,但我不能夠正確地使用它,每found = false時間執行。我只想要第2行的條件爲真,那麼只有郵件應該創建。

+0

我想看看行「如果不能行=「8.00" 之後的第一個大家開始用單如果這是一個數字,那麼不應該需要引號,如果是雙引號,則使用雙引號。 – ChrisProsser

回答

0

您正在運行For循環;

For Each row In Sheet14.Range("O244:AK244").Cells 
    If Not row = '8.00" Then 
     found = False 
    Else 
     found = True 
    End If 
Next row 

整個範圍內沒有做任何事情的條件。這與僅檢查範圍中的最後一個單元格相同,可能是True,這就是爲什麼您認爲False正在執行。也許你的if語句也應該在這個循環中呢?也許where found = False是?

2

我注意到一些事情...我沒有測試代碼,但這裏是我的一般觀察。

A)一個明顯的代碼片段是If cells.Value Like "*@*" Then。將其更改爲If cell.Value Like "*@*" Then

B)變化xlCellTypeConstantxlCellTypeConstants

C)EmailAddr = cell.Offset.Value如果你想拿起同一單元格的值,則不需要Offset其他指定偏移

的參數

d) @ChrisProsser已經評論For Each row In Sheet14.Range("O244:AK244").Cells

E)看在上帝的份上(不用理會......爲了你的緣故),請使用Option Explicit!我強烈建議使用Option Explicit我也建議查看此鏈接(請參閱鏈接中的第2點)。

主題:以「錯誤」是人類

鏈接http://www.siddharthrout.com/2011/08/01/to-err-is-human/