在我的宏中,当我引用一个单元格中找到的值时,我一直不一致地使用.cell(r,c)或.cell(r,c).value。
dim c as variant
c = sheet1.cell(1,1) 'or sheet1.cell(1,1).value
这两个引用是否正确或是否有首选方式?
答案 0 :(得分:6)
.Value
是范围对象的默认属性。因此,当你分配这样的东西时:
myVar = myRange
它等同于myVar = myRange.Value
,因为您指定的变量不是 Object 。
但是,如果您使用Set
,请执行以下操作:
Set myObj = myRange
您将分配对象引用。关键字Set
告诉VBA您正在分配对象引用。缺少Set
会使VBA得出结论,您隐含地希望获得该范围的.value
默认属性。
明确使用.value
是一种很好的编程习惯,原因有两个:
1-它使代码更具可读性,因为读者无需猜测隐含的内容
2-随着VB.net
的出现,关键字Set
已经消失;分配对象或普通变量的语法变得相同。出于这个原因,默认属性成语已经与VB.net一起消失了。因此,良好的做法是在VBA中使用.value
,因为它最终将代码移植到VB.net更容易。
答案 1 :(得分:0)
我总是使用.Value2
来获取一个单元格的值(或一个范围内的一系列vables)。如果我不使用.Value2
,则表示我想要引用Range
个对象,而不是值。例如
Dim r as Range
Set r = Range("A1")
Dim x as Double, i as Integer
x = r.Offset(1,0).Value2
Dim vals() as Variant
vals = r.Offset(1,0).Resize(10,1).Value2
For i=1 to 10
vals(i,1) = CDbl(i)/10
Next i
r.Offset(1,0).Resize(10,1).Value2 = vals
此外,我不使用Cell()
方法,因为细胞的位置将来可能会发生变化。我使用命名范围和.Offset()
和.Resize()
方法来设置我想要读取或写入值的单元格范围。因此,在上面的代码中,我永远不会使用Range("A1")
,但像Range("my_table")
这样的东西有一个命名范围" my_table"在我与之交互的左上角单元格中定义。
使用[]
符号
Dim x as Double
x = [A2]
// This is the same as x = Range("A2").Value2