在Excel中循环直到

在Excel中循环直到,excel,vba,loops,Excel,Vba,Loops,嗨,我正在尝试循环,直到它找到最后一个单元格,然后停止,但当它到达空单元格时,它给了我一个错误,因为在最后一个空单元格中没有人可以发送电子邮件。我将复制我的代码,以便您理解我的意思 Sub SendMassEmail() row_number = 0 Do DoEvents row_number = row_number + 1 item_in_review = Sheet1.Range("A" & row_number) Dim mail_bo

嗨,我正在尝试循环,直到它找到最后一个单元格,然后停止,但当它到达空单元格时,它给了我一个错误,因为在最后一个空单元格中没有人可以发送电子邮件。我将复制我的代码,以便您理解我的意思

Sub SendMassEmail()
  row_number = 0

  Do
    DoEvents
    row_number = row_number + 1
    item_in_review = Sheet1.Range("A" & row_number)
    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row_number) & " " & Sheet1.Range("C" & row_number)
    exam_grade = Sheet1.Range("D" & row_number)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row_number), "Final Year Exam Results", mail_body_message)

  Loop Until item_in_review = ""

  MsgBox "The Email Sending Process Is Complete!"
End Sub
编辑…发送电子邮件子项

Sub SendEmail(what_address As String, subject_line As String, mail_body As String)
  Dim olApp As Outlook.Application
  Set olApp = CreateObject("Outlook.Application")

  Dim olMail As Outlook.MailItem
  Set olMail = olApp.CreateItem(olMailItem)

  olMail.To = what_address
  olMail.Subject = subject_line
  olMail.Body = mail_body
  olMail.Send
End Sub
基本上,它发送列表中的所有电子邮件,但当它点击最后一个空单元格时,会抛出运行时错误,我相信这是因为最后一个空单元格中没有电子邮件地址可发送。那么,有人知道我怎样才能让它在到达终点时停止吗?

试试:

Sub SendMassEmail()

row_number = 1
item_in_review = Sheet1.Range("A" & row_number)



Do Until item_in_review = ""

DoEvents

    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row_number) & " " & Sheet1.Range("C" & row_number)
    exam_grade = Sheet1.Range("D" & row_number)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row_number), "Final Year Exam Results", mail_body_message)
     row_number = row_number + 1
     item_in_review = Sheet1.Range("A" & row_number) ' This is the new line
Loop
MsgBox "The Email Sending Process Is Complete!"


End Sub
我已将“循环直到”更改为“执行直到”-您的过程试图在“执行”和“循环直到”之间运行完整的代码,而您确实希望它在满足条件(_review=“”)后立即停止-您可以通过在进入循环之前测试位置来实现这一点。

尝试:

Sub SendMassEmail()

row_number = 1
item_in_review = Sheet1.Range("A" & row_number)



Do Until item_in_review = ""

DoEvents

    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row_number) & " " & Sheet1.Range("C" & row_number)
    exam_grade = Sheet1.Range("D" & row_number)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row_number), "Final Year Exam Results", mail_body_message)
     row_number = row_number + 1
     item_in_review = Sheet1.Range("A" & row_number) ' This is the new line
Loop
MsgBox "The Email Sending Process Is Complete!"


End Sub
我已将“循环直到”更改为“执行直到”-您的过程试图在“执行”和“循环直到”之间运行完整的代码,而您确实希望它在满足条件(_review=“”)后立即停止-您可以通过在进入循环之前测试位置来实现这一点。

尝试:

Sub SendMassEmail()

row_number = 1
item_in_review = Sheet1.Range("A" & row_number)



Do Until item_in_review = ""

DoEvents

    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row_number) & " " & Sheet1.Range("C" & row_number)
    exam_grade = Sheet1.Range("D" & row_number)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row_number), "Final Year Exam Results", mail_body_message)
     row_number = row_number + 1
     item_in_review = Sheet1.Range("A" & row_number) ' This is the new line
Loop
MsgBox "The Email Sending Process Is Complete!"


End Sub
我已将“循环直到”更改为“执行直到”-您的过程试图在“执行”和“循环直到”之间运行完整的代码,而您确实希望它在满足条件(_review=“”)后立即停止-您可以通过在进入循环之前测试位置来实现这一点。

尝试:

Sub SendMassEmail()

row_number = 1
item_in_review = Sheet1.Range("A" & row_number)



Do Until item_in_review = ""

DoEvents

    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row_number) & " " & Sheet1.Range("C" & row_number)
    exam_grade = Sheet1.Range("D" & row_number)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row_number), "Final Year Exam Results", mail_body_message)
     row_number = row_number + 1
     item_in_review = Sheet1.Range("A" & row_number) ' This is the new line
Loop
MsgBox "The Email Sending Process Is Complete!"


End Sub

我已将“循环直到”更改为“执行直到”-您的过程试图在“执行”和“循环直到”之间运行完整的代码,而实际上您希望它在符合条件时立即停止(_review=”“)was met-通过在进入循环之前测试位置来实现此目的。

查找连续范围内最后一个单元格的最简单方法是range.End(xlDown)。Range.End(xlDown).row您将给出该单元格的行索引

Sub SendMassEmail()

  For each row in Sheet1.Range("A" & Sheet1.Range("A1").End(xlDown).row)

    item_in_review = Sheet1.Range("A" & row.row)
    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row.row) & " " & Sheet1.Range("C" & row.row)
    exam_grade = Sheet1.Range("D" & row.row)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row.row), "Final Year Exam Results",     mail_body_message)

  Next row

  MsgBox "The Email Sending Process Is Complete!"
End Sub

查找连续区域中最后一个单元格的最简单方法是range.End(xlDown)。Range.End(xlDown).row您将给出该单元格的行索引

Sub SendMassEmail()

  For each row in Sheet1.Range("A" & Sheet1.Range("A1").End(xlDown).row)

    item_in_review = Sheet1.Range("A" & row.row)
    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row.row) & " " & Sheet1.Range("C" & row.row)
    exam_grade = Sheet1.Range("D" & row.row)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row.row), "Final Year Exam Results",     mail_body_message)

  Next row

  MsgBox "The Email Sending Process Is Complete!"
End Sub

查找连续区域中最后一个单元格的最简单方法是range.End(xlDown)。Range.End(xlDown).row您将给出该单元格的行索引

Sub SendMassEmail()

  For each row in Sheet1.Range("A" & Sheet1.Range("A1").End(xlDown).row)

    item_in_review = Sheet1.Range("A" & row.row)
    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row.row) & " " & Sheet1.Range("C" & row.row)
    exam_grade = Sheet1.Range("D" & row.row)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row.row), "Final Year Exam Results",     mail_body_message)

  Next row

  MsgBox "The Email Sending Process Is Complete!"
End Sub

查找连续区域中最后一个单元格的最简单方法是range.End(xlDown)。Range.End(xlDown).row您将给出该单元格的行索引

Sub SendMassEmail()

  For each row in Sheet1.Range("A" & Sheet1.Range("A1").End(xlDown).row)

    item_in_review = Sheet1.Range("A" & row.row)
    Dim mail_body_message As String
    Dim full_name As String
    Dim exam_grade As String

    mail_body_message = Sheet1.Range("G3")
    full_name = Sheet1.Range("B" & row.row) & " " & Sheet1.Range("C" & row.row)
    exam_grade = Sheet1.Range("D" & row.row)
    mail_body_message = Replace(mail_body_message, "replace_name_here", full_name)
    mail_body_message = Replace(mail_body_message, "exam_grade_replace", exam_grade)

    Call SendEmail(Sheet1.Range("A" & row.row), "Final Year Exam Results",     mail_body_message)

  Next row

  MsgBox "The Email Sending Process Is Complete!"
End Sub


你能在你的答案中添加一个解释吗?我希望我在代码下面给出了足够好的解释。欢迎进一步编辑。谢谢,我不想在没有给你机会的情况下编辑你的答案。非常感谢。我认为这给了OP更好的机会去理解他哪里出了错。谢谢Jiminy Cricket,我明白你的意思了,尽管这么说,我还是犯了运行时错误“收件人、抄送或密件抄送”框中必须至少有一个姓名或通讯组列表。你知道如何停止这个运行时错误吗?我现在已经做了,在原始帖子的底部添加了代码,你可以在你的答案中添加一个解释,解释为什么会这样吗?我希望我已经在代码下面给出了足够好的解释。欢迎进一步编辑。谢谢,我不想在没有给你机会的情况下编辑你的答案。非常感谢。我认为这给了OP更好的机会去理解他哪里出了错。谢谢Jiminy Cricket,我明白你的意思了,尽管这么说,我还是犯了运行时错误“收件人、抄送或密件抄送”框中必须至少有一个姓名或通讯组列表。你知道如何停止这个运行时错误吗?我现在已经做了,在原始帖子的底部添加了代码,你可以在你的答案中添加一个解释,解释为什么会这样吗?我希望我已经在代码下面给出了足够好的解释。欢迎进一步编辑。谢谢,我不想在没有给你机会的情况下编辑你的答案。非常感谢。我认为这给了OP更好的机会去理解他哪里出了错。谢谢Jiminy Cricket,我明白你的意思了,尽管这么说,我还是犯了运行时错误“收件人、抄送或密件抄送”框中必须至少有一个姓名或通讯组列表。你知道如何停止这个运行时错误吗?我现在已经做了,在原始帖子的底部添加了代码,你可以在你的答案中添加一个解释,解释为什么会这样吗?我希望我已经在代码下面给出了足够好的解释。欢迎进一步编辑。谢谢,我不想在没有给你机会的情况下编辑你的答案。非常感谢。我认为这给了OP更好的机会去理解他哪里出了错。谢谢Jiminy Cricket,我明白你的意思了,尽管这么说,我还是犯了运行时错误“收件人、抄送或密件抄送”框中必须至少有一个姓名或通讯组列表。你知道如何停止这个运行时错误吗?我现在已经做了,在原始文章的底部添加了代码