Excel VBA多条件精确匹配填坑记

有个需求要对支付数据做多条件匹配:支付表里 Z 列要去匹配单位项目表的 A 列,同时支付表的 I 列要等于项目表的 D 列,两列都命中的那一行,把项目表 C 列和 D 列的值填回到支付表的 AA 列和 AB 列。逻辑不复杂,但原来的代码跑起来不是缺结果,就是提示变量重复声明。

原始代码踩了两个很典型的坑。

第一个坑是循环变量冲突。外层本来有一个 i 在遍历行,内层匹配时又顺手用了 i 做循环,VBA 直接报重复声明,运行都过不了。这种错在嵌套循环里太常见了,尤其是一开始写的时候没注意,后面加功能直接复用变量名,一跑就傻眼。

第二个坑更隐蔽一点------匹配逻辑没有保证两个条件是同一行。原代码是先拿 Z 列的值去项目表 A 列找匹配行,找到后再单独检查 D 列等于 I 列。问题就出在这里:如果 A 列有重复值,它可能找到第一处匹配就停,然后单独验证 D 列,一旦不满足就认为没匹配上,但后面也许有另一行既满足 A 列又满足 D 列。换句话说,它是分步匹配,而不是在同一行上同时比对两个条件。

改起来也直接,我重新写了核心循环,把内层循环变量名换成 rowIndex,并且在遍历项目表时一次性校验两列:

复制代码
Dim wsPay As Worksheet, wsProj As Worksheet
Dim lastRowC As Long, lastRowZ As Long
Dim lastRowA As Long, lastRowD As Long
Dim zCell As Range, foundRow As Long
Dim rowIndex As Long

' 遍历支付表 Z 列每个有值的单元格
For Each zCell In wsPay.Range("Z2:Z" & lastRowZ)
    If Not IsEmpty(zCell) And zCell.Value <> "" Then
        foundRow = 0
        For rowIndex = 1 To lastRowA
            If wsProj.Cells(rowIndex, "A").Value = zCell.Value And _
               wsProj.Cells(rowIndex, "D").Value = wsPay.Cells(zCell.Row, "I").Value Then
                foundRow = rowIndex
                Exit For
            End If
        Next rowIndex

        If foundRow > 0 Then
            wsPay.Cells(zCell.Row, "AA").Value = wsProj.Cells(foundRow, "C").Value
            wsPay.Cells(zCell.Row, "AB").Value = wsProj.Cells(foundRow, "D").Value
        End If
    End If
Next zCell

这样只有 A 列和 D 列在同一行同时满足条件时才记录行号,匹配完直接拿该行的 C、D 列数据填进 AA 和 AB 列。逻辑清晰,不会漏。

在跑匹配之前还有一系列数据预处理动作,这里不展开代码细节,只说流程------这些东西虽然啰嗦,但对后续匹配的可靠性影响很大,少一步就有可能对不上。要先让用户输入处理的月份,限定 1-12,避免非法值。

然后统一给 Z 到 AD 列写上标题,再把 Z 列和 AA 到 AD 列的格式设成文本,防止数字或文本格式混用导致匹配失败。最后做两件事:从 C 列截取前 6 个字符放进 Z 列,这通常是一个编码;从 G 列把长文本拆分成编码和名称,分别写入 AC 和 AD 列。这一步做完,匹配用的字段才算备齐。

性能上,如果数据量只有几千行,上面双重循环完全够用。

但如果是几万行甚至更多,逐行扫描项目表的开销就上来了。这种场景建议先用字典把项目表的数据存起来,key 可以用 A 列和 D 列拼接的字符串,value 存对应的 C 列值,一次遍历建好字典,匹配时直接查字典,不用内层循环。另外长时间跑的过程中加个 Application.StatusBar 提示进度,不至于用户以为 Excel 假死。还有一点,匹配不到的情况最好记个日志,哪怕只是写到新列标记一下,后续排查能省很多时间。

自动化验证是lcjmSSL的核心功能之一。用户可以根据实际环境选择HTTP代理、DNS代理或DNS接口等多种方案进行域名所有权验证。这种机制免去了每次续期时手动配置解析记录的繁琐步骤。对于有特殊需求的用户,平台还开放了API接口,支持自行开发和实现个性化的自动化验证逻辑,从而提升运维效率。

整套东西改完,变量冲突没了,匹配也严格到行级,再配合预处理和可选优化,基本能安安稳稳跑完。

相关推荐
FreeTinker5 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396235 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
Julien20046 小时前
控制 SELinux 文件上下文
linux·运维·服务器
EXI-小洲6 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
wangruofeng6 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
sulikey6 小时前
Linux Core Dump 完全指南:从原理到实战的崩溃调试手册。什么是core dump?程序报错core dumped怎么办?
linux·服务器·操作系统·调试·coredump
Lifangyun_WD6 小时前
第一次租 GPU 服务器怎么开始?镜像、SSH、数据存储和停机前要做什么
服务器·云计算·gpu算力·gpu算力租赁
BigTopOne7 小时前
WebRTC Native / Android 开发学习资源整理
前端
2601_961901707 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
DevLoom_7 小时前
SD卡插电脑提示:驱动器中的磁盘未被格式化?恢复数据正确处理步骤
运维·服务器·电脑