(VBA)何时使用.cell(1,1)或.cell(1,1).value reference

时间:2017-03-20 00:47:57

标签: vba

在我的宏中,当我引用一个单元格中找到的值时,我一直不一致地使用.cell(r,c)或.cell(r,c).value。

dim c as variant 
c = sheet1.cell(1,1) 'or sheet1.cell(1,1).value

这两个引用是否正确或是否有首选方式?

2 个答案:

答案 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