VBA判断数组中非空值的个数,理论上应该可以使用WorksheetFunction.CountA函数去判断非空个数的,但是实际测试上CountA会把空白的数组元素也计算进去,所以行不通,网上也没有找到专门统计数组非空数量的函数,虽然可以简单地用for循环遍历数组累计出数量,但是如果数组很大,或者需要重复统计数组的元素数量时,用for循环就会很慢而且很耗内存,所以我自己研究了一个方法:
Sub 计算数组非空元素的数量() dim aa,bb arr = Array("苹果", "西瓜", "", "", "香蕉", "", "香蕉", "") aa = "@" '第一种特殊字符 bb = "#" '第二种特殊字符 all_xiabiao = ubound( arr ) '统计原数组的最大下标 merge_string = aa & bb & Join(arr, bb & aa & bb) & bb & aa '所有元素之间放“#@#”,前放“@#”,后放“#@”,合并成字符串 split_arr = Split(merge_string, bb & bb) '根据“##”拆分成新数组 null_xiabiao = ubound( split_arr ) '计算拆分出来的数组最大下标就是空值个数,比如拆分出5个元素,最大下标就是4,就是4个“##”,4个空值 notnull_num = all_xiabiao + 1 - null_xiabiao'非空个数就等于全部元素个数(arr下标+1)减去空值个数 MsgBox notnull_num End Sub
这个代码是比较简单的,不过使用需要注意作为辅助的两个特殊字符必须是在数组中没有出现的,不然可能会计算错误。
这个代码原理简单点说,就是将数组中所有元素用两种特殊字符标记,让非空值形成与空值不一样的标志,再通过计算空值的特殊标志而得到空值数量,用数组的总元素数量减去空值的数量就得到非空值的数量。
比如解析以上代码就是用jion函数将arr数组组成一个字符串merge_string(@#苹果#@#西瓜#@##@##@#香蕉#@##@#香蕉#@##@)。
其中“##”就是空值的标记,然后再根据“##”将字符串用aplit函数拆分成split_arr数组("@#苹果#@西瓜#@", "@", "@", "@#香蕉#@", "@", "@#香蕉#@", "@")。
再统计split_arr数组的元素个数减1(split_arr的下标)就可以得到空值的数量,之后再将原数组的总元素数量减去空值的数量就得到非空值的数量了。
如果这篇文章对您有帮助,可以分享或转藏到您的个人图书馆避免以后找不到。想要了解更多VBA相关知识,欢迎到http://moqingyan.360doc.com我的个人图书馆查看。
联系客服