Excel运行VBA查找ISIN未找到报1004错误,On Error Resume Next应放在何处
VBA代码ISIN查找报错/Excel无响应修复方案
问题根因
- 原代码第二个Do Loop未设置循环边界,当目标ISIN不存在时,
c会持续累加直到超过Excel允许的最大行号,此时访问Cells(c,1)就会触发1004错误,同时无意义的循环累加也会导致Excel无响应。 - 不推荐直接滥用
On Error Resume Next掩盖逻辑问题,更稳妥的方案是提前获取工作表有效数据行边界,避免无限制循环,同时匹配不到时直接跳过当前迭代。
最优修改方案
修改说明
- 修正变量声明问题:原VBA语法中
Dim a,b,c As Double只会把c声明为Double,其余变量默认是Variant类型,统一修正为明确的Long类型(更适配行号存储,无精度隐患) - 提前获取两个工作表的有效数据行边界,替代原无意义的计数循环
- 取消所有冗余的
Select操作,VBA操作工作表不需要选中对象,可大幅降低运行卡顿概率 - 增加匹配状态标记,只有匹配到ISIN才执行赋值操作,匹配失败自动进入下一轮迭代
修改后完整代码
Sub 匹配ISIN() Dim a As Long, b As Long, c As Long Dim WS1 As String, WS2 As String Dim ISIN As String Dim maxRow_WS1 As Long, matchFlag As Boolean WS1 = "1M_issues" WS2 = "MI_1" '获取WS2表A列最大有效行(即待查找的ISIN总数量) a = Sheets(WS2).Cells(Rows.Count, 1).End(xlUp).Row '获取WS1表A列最大有效行,作为查找循环的终止边界,避免无限循环 maxRow_WS1 = Sheets(WS1).Cells(Rows.Count, 1).End(xlUp).Row '遍历所有待查找的ISIN For b = 2 To a ISIN = Sheets(WS2).Cells(b, 1).Value matchFlag = False c = 1 '循环查找ISIN,到WS1最大有效行就自动停止 Do While c < maxRow_WS1 c = c + 1 If Sheets(WS1).Cells(c, 1) Like "*" & ISIN & "*" Then matchFlag = True Exit Do '找到匹配项后直接退出循环 End If Loop '仅匹配成功时执行赋值 If matchFlag = True Then Sheets(WS2).Cells(b, 2).Value = Sheets(WS1).Cells(c, 3).Value End If Next End Sub
可选:On Error Resume Next兼容方案
如果不想修改原有循环逻辑,仅用错误捕获临时处理,可参考以下写法,注意错误捕获要及时关闭避免掩盖其他问题:
'Find ISIN within cells (looping) Sheets(WS1).Select c = 1 On Error Resume Next '出错后继续执行后续代码 Do c = c + 1 Loop Until Cells(c, 1) Like "*" & ISIN & "*" If Err.Number <> 0 Then '错误编号不为0代表未找到ISIN Err.Clear '清除错误标记 On Error GoTo 0 '恢复系统默认错误处理 GoTo NextISIN '跳转到下一个ISIN迭代 End If On Error GoTo 0 '匹配成功也恢复默认错误处理 'Copy CR from general_report to target sheet Sheets(WS2).Cells(b, 2) = Sheets(WS1).Cells(c, 3) NextISIN: Next
内容的提问来源于stack exchange,提问作者DataDan
相关产品推荐
相关产品推荐

