Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Vba 关于With语句的几个问题_Vba_Excel - Fatal编程技术网

Vba 关于With语句的几个问题

Vba 关于With语句的几个问题,vba,excel,Vba,Excel,我正在用一些将数据写入表的用户表单代码进行实验(代码本身就是这样)。ST是一些命名范围: With Range(ST) .Cells(Range(ST).Count).Offset(1, 0).EntireRow.Insert .Resize(Range(ST).Rows.Count + 1).Name = ST .Cells(Range(ST).Rows.Count, 1) = Range(ST).Rows.Count - 1 .Cells(Range(ST).

我正在用一些将数据写入表的用户表单代码进行实验(代码本身就是这样)。ST是一些命名范围:

With Range(ST)
    .Cells(Range(ST).Count).Offset(1, 0).EntireRow.Insert
    .Resize(Range(ST).Rows.Count + 1).Name = ST
    .Cells(Range(ST).Rows.Count, 1) = Range(ST).Rows.Count - 1
    .Cells(Range(ST).Rows.Count, 2) = TextBox2.Text
End With
我的问题是:

为什么我可以重写下面的第二行和第三行而不影响最终结果

    .Cells(.Count).Offset(1, 0).EntireRow.Insert
    .Resize(.Rows.Count + 1).Name = ST
但是改变其他行,例如

    .Cells(.Rows.Count, 2) = TextBox2.Text
导致表中应包含
TextBox2.Text
的条目返回空白单元格

谢谢(也欢迎对代码的任何其他评论)

编辑:

不幸的是,我发布这个问题正是因为它不像你们说的那样。详细阅读帮助文件后,我相信这句话:

表达式在进入块时计算一次。不能从With块中重新分配表达式

这意味着:

.Resize(Range(ST).Rows.Count + 1).Name = ST 
是问题所在,采取了两条路线:

.Cells(Range(ST).Count).Offset(1, 0).EntireRow.Insert
.Resize(Range(ST).Rows.Count + 1).Name = ST
在街区外,一切都按预期进行!我解释得对吗?
如果我上传了文件,有人会感兴趣吗?(玩具实验代码不到几行)

带有。。。End语句非常有用;它有助于加快编码和程序执行。你能读的更多


关于你的问题,;您应该能够使用以下命令删除
中所有行中的
范围(ST)
。。。结束
语句

带有。。。End语句非常有用;它有助于加快编码和程序执行。你能读的更多


关于你的问题,;您应该能够使用以下命令删除
中所有行中的
范围(ST)
。。。结束
语句

在我的评论之后,您可以用以下任何一种方式编写代码。他们都会做同样的事情

With Range(ST)
    .Cells(Range(ST).Count).Offset(1, 0).EntireRow.Insert
    .Resize(Range(ST).Rows.Count + 1).Name = ST
    .Cells(Range(ST).Rows.Count, 1) = Range(ST).Rows.Count - 1
    .Cells(Range(ST).Rows.Count, 2) = TextBox2.Text
End With


除我的评论外,您可以用以下任何一种方式编写代码。他们都会做同样的事情

With Range(ST)
    .Cells(Range(ST).Count).Offset(1, 0).EntireRow.Insert
    .Resize(Range(ST).Rows.Count + 1).Name = ST
    .Cells(Range(ST).Rows.Count, 1) = Range(ST).Rows.Count - 1
    .Cells(Range(ST).Rows.Count, 2) = TextBox2.Text
End With


删除带有end with的
中的
范围(ST)
不会对代码产生任何影响删除带有end with的
中的
范围(ST)
不会对代码产生任何影响不幸的是,事情并不是这样的。我已经对我认为可能存在的问题进行了编辑。你觉得怎么样?谢谢。嗨,不幸的是事情不是这样的。我已经对我认为可能存在的问题进行了编辑。你觉得怎么样?谢谢。不幸的是,在我的例子中,前两个块的输出不一样。我已经编辑了我认为我是如何解决它的,但我不确定我是否正确理解了帮助文件。如有任何意见,将不胜感激。谢谢你的回复!不幸的是,在我的例子中,前两个块没有给出相同的输出。我已经编辑了我认为我是如何解决它的,但我不确定我是否正确理解了帮助文件。如有任何意见,将不胜感激。谢谢你的回复!
With Range(ST)
    Dim nCount As Long

    nCount = .Rows.Count

    .Cells(.Count).Offset(1, 0).EntireRow.Insert
    .Resize(nCount + 1).Name = ST
    .Cells(nCount, 1) = nCount - 1
    .Cells(nCount, 2) = TextBox2.Text
End With