Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-仅在with语句之后结束的while语句_Excel_Vba_While Loop - Fatal编程技术网

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

Excel VBA-仅在with语句之后结束的while语句,excel,vba,while-loop,Excel,Vba,While Loop,如果“wend”仅放在“end with”之后,则我似乎无法在with语句中放置while语句 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 fo

如果“wend”仅放在“end with”之后,则我似乎无法在with语句中放置while语句

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
子测试()
作为整数的Dim i
i=1
使用此工作簿。工作表(“数据”)
而i
子测试()
作为整数的Dim i
i=1
使用此工作簿。工作表(“数据”)
趁我还活着的时候
在输入while语句之前,我需要对工作表做一些事情,但是我还需要在while完成之前结束

你不能这样,这不是合法的语法。块有一个开始和一个结束标记,它们不能相互交织——不管我们看到的是什么类型的块

非法:

If条件然后
'...
带着什么
'...
如果结束
'...
以
这并不意味着块不能根据需要嵌套

法律:

If条件然后
带着什么
'...
以
如果结束
编译器从上到下“读取”代码。当它遇到block语句(例如
With
)时,它希望下一个
End{block}
语句关闭该块-如果不是这样,则抛出语法错误,代码不会编译

因此,您不能在
Wend
标记之前使用
End With
(注意:
Do While…Loop
将是;同时考虑到编译时已知迭代次数,应该使用
For…Next
循环,而不是手动增加循环体中的计数器)

带有
块的
有时是实用的,但实际上并不需要

在这种特殊情况下,
与此工作簿一起使用。工作表(“数据”)
正在取消对
此工作簿中存在的工作表的引用;如果该工作表在编译时存在于
此工作簿中
,那么,为了避免取消对已从项目中任何位置全局访问的工作表的引用,请将该模块的
(名称)
属性设置为例如
数据表
,然后您可以直接引用它,如下所示:

DataSheet.Cells(i, 20).Value = "5"
除非您真正的代码是用
语句嵌套
(为了理智起见,不应该这样做!),否则将
标记结尾移动到循环外部以合法嵌套两个块就足够了。如果循环外的代码也可以使用带
块的
,那么它也可以使用它:

For i = 1 To 4
    With DataSheet
        .Cells(i, 20).Value = "5"
    End With
Next

With DataSheet
    'other code
End With

Wend
之后移动
结束。注意:
While…Wend
是老式的。使用
For
循环,或在
With
之前使用
While
。因为这个
With
语句毫无意义,所以实际代码可能有更多的内容?是的,实际代码有更多的内容,我在上面的示例中理解,将while放在宽度之前似乎很明显,因为它对结果没有影响,但是在我的实际代码中,在输入while语句之前,我需要对工作表做一些事情,但在while语句中移动到另一个工作簿时,我还需要在while语句完成之前结束while。如果在循环中结束a,并且循环在结束之前返回到,您希望发生什么?它已经结束了,它不会返回代码,找到并重新应用它。即使它确实这样做了,它也会让代码中实际发生的事情变得非常混乱。非常感谢Warcupine,您提供了一个替代方案并解释了为什么它不起作用。我现在明白了,在我当前的代码中,当它第二次循环时,我试图结束一些没有再次开始的事情。非常感谢您的详细解释!
For i = 1 To 4
    With DataSheet
        .Cells(i, 20).Value = "5"
    End With
Next

With DataSheet
    'other code
End With