2013-08-06 141 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/