excel定位空值vba代码 (excelvba技巧多条件统计)

​​​ 本文于2023年3月23日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!

在我的《财务管理系统》里,在填制凭证的时候,可以查询凭证空号,以便填补空号:

excel定位空值vba代码,excelvba数组的值填入单元格

我原来的代码是这样的:

    '用一个完整的数字序列去比较
    For i = 1 To arr(iRow, 1)
        For j = 1 To iRow
Ifarr(j,1)=iThen
                t = 1
            End If
        Next
        If t = 0 Then
ReDimPreservearrNumber(k)
            arrNumber(k) = i
            k = k + 1
        End If
        t = 0
Next

代码逻辑,来来来,AI同志,你来解释一下:

excel定位空值vba代码,excelvba数组的值填入单元格

看来我的代码是有点问题,至少效率比较差,于是AI也帮我出了主意,过程略过,最终,优化后的代码如下:

    '数组相邻元素比较
     If arr(1, 1) > 1 Then
        For i = 1 To arr(1, 1)
            ReDim Preserve arrNumber(k)
            arrNumber(k) = i
        Next
        For i = 1 To iRow - 1
            If arr(i + 1, 1) - arr(i, 1) > 1 Then
                For j = arr(i, 1) + 1 To arr(i + 1, 1) - 1
                    ReDim Preserve arrNumber(k)
                    arrNumber(k) = j
                    k = k + 1
                Next
            End If
        Next
    Else
        For i = 1 To iRow - 1
            If arr(i + 1, 1) - arr(i, 1) > 1 Then
                For j = arr(i, 1) + 1 To arr(i + 1, 1) - 1
                    ReDim Preserve arrNumber(k)
                    arrNumber(k) = j
                    k = k + 1
                Next
            End If
        Next
    End If

为了测试这两种方法的效率,我们做点前戏,先准备一个启用宏的Excel文件“凭证空号":

excel定位空值vba代码,excelvba数组的值填入单元格

首先,我们准备一个比较大的自然数列,选中Sheet1,A1:A15000单元格,输入公式=ROW(),然后按Ctrl+Enter,填充选择区域,下一步我们把它粘贴成数值,因为接着我们要删除部分数字。

然后,我们在b列输入公式=mod(a1,5),得到一个0-4的循环序列,随便筛选几个,把选中的数字复制到sheet2,然后回头把它删除,这样我们就得到一个不完整的自然数序列。

接着我们就要用VBA代码把缺少的数字给它列出来:

我们先运行旧代码,然后再把它注释掉,再运行新代码:

excel定位空值vba代码,excelvba数组的值填入单元格

我们可以看到两者的差距是很大的,可见代码优化还是非常必要的。

其实,旧代码我也用了好长时间了,由于数据量不大,感觉不到效率低下的问题。今天,在合并用户窗体的时候,看到这段代码,感觉有点陌生了,于是稍微梳理一下,感觉有点问题,两层完全循环,如果数据量大肯定是不行的。

于是,想着怎么改改,然后就把我的需求告诉AI,它给出的方式还是非常好的,就按照它的代码的思路改了改,发现效率相差真是惊人。

表面上看我以前的代码要比现在的代码量少,看上去简洁,但真应了一句话“简单粗暴”,效率方面就差了很多。

好了,今天就啰嗦这么多。我们下期再见.

​​​​ 本文于2023年3月23日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!