VBA嵌套循环中如何跳过不以“A”开头的行?
VBA代码修正方案
原有代码核心问题
- 逻辑倒置:匹配、结果写入逻辑全部放在了「E列值不以A开头」的Else分支中,和需求完全相反
- 缺少错误容错:E列如果存在#N/A等错误值时,
Left函数会直接抛出运行时错误 - 变量未声明:代码中的A、b、X变量没有声明,容易出现隐式声明异常
修正后完整代码
Sub SummaryData() ' 强制变量声明,避免未定义变量出错 Dim A As Long, b As Long, X As String Dim CustCode As String Dim CustName As String Dim wkb As Workbook Dim Count As Integer ' 打开月度统计文件 Workbooks.Open Filename:=Sh_Source.Range("HKS").Value Set wkb = Workbooks("DataHK.xlsx") ' 遍历总表E列所有行 For A = 2 To Sh_Main.Range("E" & Rows.Count).End(xlUp).Row ' 先判断E列值是否为错误值,再判断是否以A开头 If Not IsError(Sh_Main.Range("E" & A).Value) Then If Left(Sh_Main.Range("E" & A).Value, 1) = "A" Then CustCode = Sh_Main.Range("E" & A).Value Count = 0 CustName = "" ' 匹配月度表对应字段 For b = 2 To wkb.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row X = wkb.Sheets("Data").Range("C" & b).Value If CustCode = X Then CustName = Sh_Main.Range("F" & A).Value Count = Count + 1 End If Next b ' 写入结果到目标表 Sh_Body.Range("A" & A).Value = CustCode Sh_Body.Range("B" & A).Value = CustName Sh_Body.Range("C" & A).Value = Count Else ' 非A开头的行清空对应结果行,若需保留原值可删除以下三行 Sh_Body.Range("A" & A).Value = "" Sh_Body.Range("B" & A).Value = "" Sh_Body.Range("C" & A).Value = "" End If Else ' E列是错误值(比如N/A)的行清空结果 Sh_Body.Range("A" & A).Value = "" Sh_Body.Range("B" & A).Value = "" Sh_Body.Range("C" & A).Value = "" End If Next A wkb.Close savechanges:=False End Sub
可选优化建议
- 如果数据量超过1000行,建议把月度表的C列数据先读入数组再做匹配,比直接遍历单元格速度快10倍以上
- 可以用
WorksheetFunction.CountIf代替内层循环统计匹配次数,进一步简化代码
内容的提问来源于stack exchange,提问作者cod3overflow
相关产品推荐
相关产品推荐

