为每个循环嵌套excel vba



我正在处理excel宏,有一次遇到了问题。需要帮助来解决它。

我必须在工作表中查找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行的条件为true时,只创建邮件。

我注意到的几件事。。。我还没有测试过代码,但以下是我的一般观察结果。

A)一段引人注目的代码是If cells.Value Like "*@*" Then。更改为If cell.Value Like "*@*" Then

B)xlCellTypeConstant更改为xlCellTypeConstants

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/

您正在运行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语句也应该在这个循环中?也许哪里找到了=False?

最新更新