我正在尝试使用一些将数据写入表的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之外,一切都按预期工作!我是否正确地解释了这一点? 如果我上传文件,有人会有兴趣吗? (玩具实验代码不到几行)
答案 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