打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel VBA 数组内容比较/判断一个数组元素是否存在于另一个数组中的两种方法

☆本期内容概要☆

  • 上期代码修正

  • 数组元素内容比较(2种方法)

在上期的文章中,我们的代码部分有一点小bug:

原代码33行、50行IF语句InStr函数的第2个参数,没有加限定符:

原代码第45行SQL语句,没有加末级科目的条件:

大家猜猜会不会有什么问题?还是举个简单的例子说明吧:

1、如果不加限定符,InStr("/100101/","1001")>0
2、如果加了限定符,InStr("/100101/","/1001/")=0
3、如果不加末级科目的条件,则比较字段包括所有级别的科目,这样一来,如果导入的凭证数据中,有科目代码为非末级的也会被导入,这样是不行的,我们的制单规则是只能用末级科目填制凭证。

新代码

……If InStr(strCheck, "/" & xlTitle(i) & "/") = 0 Then……If InStr(strCheck, "/" & xlData(PosAccCode, k) & "/") = 0 Then……arr = clsDQ.GetData("select 科目代码 from tb科目 where 是否末级=True")

改过之后,我把一个科目220301改为2203,结果是这样子的:

当然,这个提示“【2203】科目代码不存在”有点不太准确,应该是提示“【2203】科目代码非末级”,可以实现,但感觉没有必要,不去管它了。

扯远了,回到今天的正题:数组元素内容的比较,也就是检查数组arrA()的各个元素,在arrB()中是否存在,就像上期我们导入凭证的时候,要检查一下导入的科目代码是否已存在,如果不存在,我们要先添加后再导入,否则会引起错乱。

方法我想到2种,一种是用两层循环

for i=Lbound(arrA) to Ubound(arrA) t=0    for j=Lbound(arrB) to Ubound(arrB)       if arrA(i)=arrB(j) then          t=1          exit for       end if     next       if t=0 then          msgA=msgA & arrA(i) & "不存在" & chr(10)       esle          msgB=msgB & arrA(i) & "已存在" & chr(10)       end if next msgbox msgA & msgB  

代码是在这里直接敲的,没有测试,解释一下:

1、这里默认都是一维数组,如果是2维可以通过我们分享过的自定义函数FlattenArray来转换成一维数组后再比较。(Excel VBA 数组应用/核算项目代码组合/VBA代码优化/AI辅助)
2、循环遍历数组arrA(),将它的每个元素与arrB()里的元素进行比较,这里再用一个循环遍历数组arrB()。
3、如果有相等的,则使t=1并退出第2层循环,如果第2层循环都结束了,还是没有找到相等的,这时t=0
4、根据t值,写入字符串msgA(不存在的信息)、msgB(已存在的信息)
6、继续第1层循环
7、结束,输出提示信息

第2种方法,其实就是我们上期、和这期开头修改代码时提到的方法:

strCheck=join(arrB,"/")strcheck="/" & strcheck & "/"     '前后都加上限定符"/"for i=Lbound(arrA),Ubound(arrA)       if instr(strcheck,"/" & arrA(i) & "/") =0 then          msgA=msgA & arrA(i) & "不存在" & chr(10)       esle          msgB=msgB & arrA(i) & "已存在" & chr(10)       end if next msgbox msgA & msgB

这段代码也不复杂,解释一下:

1、把arrB()中的元素通过join函数用"/"连接起来,结果类似"1001/1002/1003",存到字符串变量strcheck里
2、为了能够准确匹配,我们要把strcheck前后再加上限定符"/",结果类似"/1001/1002/1003/"
3、循环遍历arrA,用instr函数判断每一个元素(前后加上限定符"/")在strcheck中的位置,如果这个元素在strcheck中没有找到,则instr函数返回结果0,否则返回一个大于0的整数(位置)。
4、根据instr返回结果,写入字符串msgA(不存在的信息)、msgB(已存在的信息)
6、结束,输出提示信息
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【VBA常用代码解析】数组行列转置的限制
5G(NR)网络随机接入两步法介绍
Autosar通信栈:基础问题知多少
volatile与const学习笔记
Protocol Buffer技术详解(语言规范)
【OpenGL ES系列教程三】着色语言 Shading Language(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服