VBA中对用Dim声明存储为变量的区域使用.Count统计单元格数量的问题
VBA中对用Dim声明存储为变量的区域使用.Count统计单元格数量的问题
嗨,我来帮你理清这个问题~你遇到的报错其实是因为变量存储的不是Range对象引用,而是单元格的值数组,自然没法用Range专属的.Count方法啦。
问题根源
当你直接写Grada = Sheet12.Range("B1:B19")时,VBA默认会把这个区域里的所有单元格值读取出来,存成一个二维Variant数组(哪怕区域是单列/单行,也是二维的),而不是保存这个Range对象的引用。数组是没有.Count属性的,所以调用Grada.Count就会返回#VALUE!错误。
解决办法
要让变量保存Range对象的引用,你需要做这两件事之一:
- 把变量声明为
Range类型,并用Set关键字赋值 - 如果坚持用
Variant类型变量,同样要用Set关键字来赋值(因为Variant可以存储对象,但必须显式用Set)
下面是两种修正后的代码示例:
方法1:声明为Range类型
Function test2() As Variant Dim Grada As Range Set Grada = Sheet12.Range("B1:B19") test2 = Grada.Count End Function
方法2:用Variant+Set赋值
Function test2() As Variant Dim Grada As Variant Set Grada = Sheet12.Range("B1:B19") '这里加上Set test2 = Grada.Count End Function
这两种写法都会让Grada指向原始的Range对象,这样调用.Count就能正常返回19啦。
额外补充(如果需要处理值数组的情况)
要是你确实需要把单元格值存成数组,又想统计元素数量,可以用数组的边界计算:
Function test2() As Variant Dim Grada As Variant Grada = Sheet12.Range("B1:B19").Value '计算数组的元素总数:行数×列数 test2 = (UBound(Grada, 1) - LBound(Grada, 1) + 1) * (UBound(Grada, 2) - LBound(Grada, 2) + 1) End Function
不过这是针对值数组的统计方式,和Range对象的.Count逻辑一致,但适用场景不同~
备注:内容来源于stack exchange,提问作者Izak Nash
相关产品推荐
相关产品推荐

