VBA代码问题排查:双条件匹配更新LoC工作表M列
VBA代码问题排查与修正
以下是你代码中存在的问题及对应的优化方案:
- 变量未显式声明:
LastRowLoC和LastRowAPME未指定数据类型,默认会被识别为Variant类型,建议显式声明为Long,避免因数据量过大导致溢出。 - Range对象直接传入字符串函数:
UCase(criteria1)中criteria1是Range对象,并非字符串值,需要改为UCase(criteria1.Value),否则会触发类型不匹配错误。 - 内层循环无终止逻辑:只要找到任意一行符合条件的记录,就可以将M列设为"Yes",无需遍历剩余行,添加
Exit For能大幅提升运行效率。 - 目标单元格未初始化:若LoC表M列已有旧值,当无符合条件的记录时,旧值会保留,建议先将M列初始化为空或"No"。
- APME表最后一行判断依据错误:当前用A列计算最后一行,若L列数据行数多于A列,会漏掉部分数据,应改为基于L列计算最后一行。
修正后的代码
Sub InString_two_conditions() Dim cell As Range Dim i As Long Dim criteria1 As String ' 直接存储字符串,避免操作Range对象 Dim LastRowLoC As Long Dim LastRowAPME As Long ' 计算LoC表A列最后一行 LastRowLoC = ThisWorkbook.Sheets("LoC").Cells(Rows.Count, 1).End(xlUp).Row ' 计算APME表L列最后一行,确保覆盖所有数据 LastRowAPME = ThisWorkbook.Sheets("APME").Cells(Rows.Count, 12).End(xlUp).Row ' 初始化LoC表M列,清空旧值 ThisWorkbook.Sheets("LoC").Range("M2:M" & LastRowLoC).ClearContents For i = 2 To LastRowLoC ' 提前转换为大写字符串,减少重复计算 criteria1 = UCase(ThisWorkbook.Sheets("LoC").Cells(i, 1).Value) ' 默认设为No,找到符合条件的再修改 ThisWorkbook.Sheets("LoC").Cells(i, 13).Value = "No" For Each cell In ThisWorkbook.Sheets("APME").Range("L3:L" & LastRowAPME) ' 检查字符串包含关系,同时验证J列金额不为0 If InStr(UCase(cell.Value), criteria1) > 0 And cell.Offset(0, -2).Value <> 0 Then ThisWorkbook.Sheets("LoC").Cells(i, 13).Value = "Yes" ' 找到匹配项后跳出内层循环,停止遍历 Exit For End If Next cell Next i End Sub
内容的提问来源于stack exchange,提问作者user27364877
相关产品推荐
相关产品推荐

