VBA使用Set和=给Range对象赋值时Address返回结果不同的问题
现象解释
VBA 中对象变量的赋值规则和普通变量不同:所有对象类型的变量赋值必须使用Set关键字,省略Set时,VBA会默认操作对象的默认属性,不会修改对象本身的引用指向。
你遇到的差异完全是这个语法规则导致的:
- 带
Set的写法是标准的对象引用赋值,会把rngSearch的指向修改为你新定义的$P$1:$AI$1区域,所以打印地址符合预期。 - 不带
Set的写法,因为Range对象的默认属性是Value,这行代码实际等价于rngSearch.Value = .Range(.Cells(1, lnFirstCol), .Cells(1, lnLastCol)).Value:你没有修改rngSearch的引用,它还是指向之前Find返回的$P$1单元格,只是给这个单元格赋值了右侧区域的内容(给单个单元格赋值多单元格区域时只会取区域第一个单元格的值)。所以打印地址仍然是$P$1,不是赋值被忽略,是你写的赋值操作本来就不是修改对象引用的。
你可以在不带Set的赋值后加一行Debug.Print rngSearch.Value验证,能看到单元格的值已经被更新,说明赋值操作实际已经执行了。
内容的提问来源于stack exchange,提问作者Toledo
相关产品推荐
相关产品推荐

