如果'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