使用while和when编译错误

我目前遇到了While和Wend声明中的一个问题但是,首先让我给一点背景环境来解释我正在尝试完成的是什么。 我有一个button,我点击并创build一个名为人的新表,并使用自动筛选从源表中复制与它们相关的整个行(其名称存在的地方)。 这是没有任何问题,并使用下面的代码(你可能从罗恩·布鲁恩你可以认识到)我设法发送信息与点击一个button给所有我添加了一个类似的代码的人(有点像通用的我下面包括)但是,这performance出一些问题。 可以说总共有30个人,人数和姓名都是一个常数。 如果所有的名字都以工作表的forms出现,那么我可以发送任何问题。 问题是,这是每月运行,在一些月份,并不是所有这30人将在表上。 以下面的例子来说,如果John Doe和Jane Doe都有一个带有Data的工作表,我将能够发送,但是如果Jane没有出现在源表中,代码就会中断。 我意识到,那么我将需要一些如果陈述和经过多次尝试,我无法工作。 然后我发现While / Wend语句似乎是更好的select用于此目的。 从逻辑上讲,我在下面想要完成的是“虽然有一张名为John Doe的表”,那么执行下面的所有代码,如果条件没有达到,那么在Wend之后继续执行。“目前我认为我有一个这里可能有两个问题:

首先是执行代码时出现错误“编译错误:Wend without While”。

根据VBA编译错误“Wend without While”,这似乎与未终止的IF语句有关,但似乎并非如此

其次是由于我不能testingWhile(工作表(“John Doe”)。Name <>“John Doe”)是否是一个有效的while语句,它将按照我打算这么做的方式工作。

如果有人能够解释为什么这不起作用,我可以从中学习,我将不胜感激。 感谢您花时间阅读这篇文章! 如果需要额外的信息或我写的东西不清楚,请让我知道。

Sub emailfitest() Dim OutApp As Object Dim OutMail As Object Dim rng As Range Dim strbody As String On Error Resume Next While (Worksheets("John Doe").Name <> "John Doe") Set rng = Sheets("John Doe").Range("A1:K80").SpecialCells(xlCellTypeVisible) On Error Resume Next Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .SentonBehalfofName = "bla@domain.com" .To = "blabla@domain.com" .CC = "" .BCC = "" .Subject = "Bla bla 123" .WrapText = True .HtmlBody = "<HTML><BODY><p> " & strTo & " <br /> " & strCC & " <br /> </p>" & _ "<p>Hi Bla, " & " </B> <br /> <br /< </p>" & _ "<p>text1<br /> <br /> </p> " & _ "<p>text2.<br /> </p> " & _ "<li>bulletpoint 1<br /> </li> " & _ "<li>bulletpoint2<br /> <br /> </li> " & _ "<p>text3<br /> </p> " & _ "<p> text4 <A href=https://blabbla.com>Here</A><br /></p>" & _ "<p>text5</p> <br /> <br />" & _ "<p>text6 <br /></p>" & RangetoHTML(rng) .Send Wend End With On Error GoTo 0 With Application .EnableEvents = True .ScreenUpdating = True Set OutMail = Nothing Set OutApp = Nothing While (Worksheets("Jane Doe").Name <> "Jane Doe") '--------------------------------------------------------------------------------- Set rng = Sheets("Jane Doe").Range("A1:K80").SpecialCells(xlCellTypeVisible) On Error Resume Next Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .SentonBehalfofName = "blabla@domain.com" .To = "thingsandstuff@domain.com" .CC = "" .BCC = "" .Subject = "hello1233h12" .WrapText = True .HtmlBody = "<HTML><BODY><p> " & strTo & " <br /> " & strCC & " <br /> </p>" & _ "<p>Hi Jane" & " </B> <br /> <br /< </p>" & _ "<p>text1<br /> <br /> </p> " & _ "<p>text2<br /> </p> " & _ "<li>bulletpoint1<br /> </li> " & _ "<li>bulletpoint2<br /> <br /> </li> " & _ "<p>text3<br /> </p> " & _ "<p>blablabla <A href=https://bblablabsa.com >Here</A><br /></p>" & _ "<p>text4</p> <br /> <br />" & _ "<p>text5<br /></p>" & RangetoHTML(rng) .Send Wend End With On Error GoTo 0 With Application .EnableEvents = True .ScreenUpdating = True Set OutMail = Nothing Set OutApp = Nothing End Sub -------------------------------------------- Function RangetoHTML(rng As Range) ' Changed by Ron de Bruin 28-Oct-2006 ' Working in Office 2000-2013 Dim fso As Object Dim ts As Object Dim TempFile As String Dim TempWB As Workbook TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm" 'Copy the range and create a new workbook to past the data in rng.Copy Set TempWB = Workbooks.Add(1) With TempWB.Sheets(1) .Cells(1).PasteSpecial Paste:=8 .Cells(1).PasteSpecial xlPasteValues, , False, False .Cells(1).PasteSpecial xlPasteFormats, , False, False .Cells(1).Select Application.CutCopyMode = False On Error Resume Next .DrawingObjects.Visible = True .DrawingObjects.Delete On Error GoTo 0 End With 'Publish the sheet to a htm file With TempWB.PublishObjects.Add( _ SourceType:=xlSourceRange, _ Filename:=TempFile, _ Sheet:=TempWB.Sheets(1).Name, _ Source:=TempWB.Sheets(1).UsedRange.Address, _ HtmlType:=xlHtmlStatic) .Publish (True) End With 'Read all data from the htm file into RangetoHTML Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2) RangetoHTML = ts.readall ts.Close RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _ "align=left x:publishsource=") 'Close TempWB TempWB.Close savechanges:=False 'Delete the htm file we used in this function Kill TempFile Set ts = Nothing Set fso = Nothing Set TempWB = Nothing End Function 

你和Wend End With是错误的。

 While (Worksheets("Jane Doe").Name <> "Jane Doe") ... With OutMail ... ... End With '// <~~ Close the With block first. Wend '// <~~ THEN close the While block 

你也错过了这个块的End With

 With Application .EnableEvents = True .ScreenUpdating = True 

这意味着你不能在第二次运行时使用With OutMail ,因为你仍然在第一个With块中。

所有With语句必须在块的结尾处以End With完成。