仅在with语句之后结束的Excel VBA while语句



如果'end '只放在'end with'之后,我似乎无法将while语句放在with-statement中。

Sub Testing()
Dim i As Integer
i = 1
With ThisWorkbook.Worksheets("Data")
While i <= 4
.Cells(i, 20).Value = "5"
End With  'get error, as the wend for the while is not yet found
i = i + 1
Wend
End Sub

这是否意味着我不能使用with语句,如果它包含一个只在with语句之后结束的while语句?

我需要在进入while语句之前对工作表做一些事情,但我也需要在while完成之前结束

你不能这么做,这是不合法的语法。块有一个开始和一个结束令牌,它们不能交织在一起——不管我们看的是哪种块。

非法:

If condition Then
'...
With something
'...
End If
'...
End With

这并不意味着块不能在需要时嵌套!

法律:

If condition Then
With something
'...
End With
End If

编译器"读取";代码从上到下。当它遇到块语句(如With)时,它期望下一个End {Block}语句关闭该块-如果不是这种情况,则抛出语法错误并且代码无法编译。

所以你不能在Wend标记之前有End With(注意:Do While...Loop是首选;另外,考虑到迭代次数在编译时是已知的,应该使用For...Next循环,而不是在循环体中手动增加计数器)。

With块有时是实用的,但它从来都不是真正需要的

在这种特殊情况下,With ThisWorkbook.Worksheets("Data")正在解引用存在于ThisWorkbook中的工作表;如果该表在编译时存在于ThisWorkbook中,那么您可以使用它的CodeName代替,从而避免需要解引用已经从项目中的任何地方全局访问的工作表-将该模块的(Name)属性设置为例如DataSheet,然后您可以直接引用它,像这样:

DataSheet.Cells(i, 20).Value = "5"

除非你真正的代码是嵌套With语句(为了理智起见,不应该这样做!),那么将End With令牌移出循环以合法嵌套这两个块就足够了。如果循环外的代码也可以使用With块,那么它也可以使用它:

For i = 1 To 4
With DataSheet
.Cells(i, 20).Value = "5"
End With
Next
With DataSheet
'other code
End With
Sub Testing()
Dim i As Integer
i = 1
With ThisWorkbook.Worksheets("Data")
Do While i <= 4
.Cells(i, 20).Value = "5"
i = i + 1
Loop
End With
End Sub

最新更新