关于With Statement的一些问题

时间:2012-11-22 13:53:34

标签: vba excel-vba excel

我正在尝试使用一些将数据写入表的userform代码(代码正常工作)。 ST是一些名为Range:

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的表上的Entry返回空白单元格。

谢谢(任何其他misc评论,代码也欢迎)

编辑:

不幸的是,我发布这个问题正是因为它不像你们所说的那样表现。在详细阅读了帮助文件后,我相信这一行:

“在进入块时,表达式被计算一次。您无法从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

在with block之外,一切都按预期工作!我是否正确地解释了这一点? 如果我上传文件,有人会有兴趣吗? (玩具实验代码不到几行)

2 个答案:

答案 0 :(得分:2)

With ... End语句非常有用;它有助于更​​快的编码以及程序执行。您可以阅读更多内容here

关于你的问题;您应该能够删除Range(ST)语句中所有行中的With ... End

答案 1 :(得分:1)

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

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

OR

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

OR

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