0

我正在试验一些将数据写入表格的用户表单代码(代码是有效的)。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

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

4

2 回答 2

2

With ... End声明非常有用;它有助于更​​快的编码和程序执行。更多你可以在这里阅读

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

于 2012-11-22T14:01:23.920 回答
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

或者

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

或者

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
于 2012-11-22T14:02:39.727 回答