我正在处理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?