You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA开发问题:判断数组1中的值是否存在于数组2的实现故障排查

代码错误点梳理

  • 语法错误:嵌套循环中If判断内部直接执行Next j,Else分支放置位置不符合VBA语法规则,运行会直接报错
  • 数组访问错误:从单元格区域读取的InvArray为二维数组,必须使用InvArray(j, 1)访问邮箱值,直接写InvArray(j)会触发类型不匹配错误
  • 匹配逻辑错误:需求是遍历完整张发票邮箱列表都未找到匹配的交易邮箱,才将该邮箱追加到发票列表,原有逻辑只要遇到一个不匹配的邮箱就会触发写入,完全不符合要求
  • 多余的工作表激活操作:之前必须激活工作表才能正常获取范围,是因为部分Range对象没有指定所属工作表,默认调用了活动工作表的范围,给所有Range加上父工作表对象即可完全避免使用Activate
  • 行号未同步更新:每次写入新邮箱后LastRow没有同步累加,后续写入内容会覆盖之前的结果
  • 值写入错误:原有代码写入时用了InvArray(j),实际应该写入交易列表中未匹配到的邮箱TrxArray(i, 1)

修正后完整代码

Sub PullingTrxData()
    Dim TrxArray As Variant
    Dim InvArray As Variant
    Dim emailColumn As Range
    Dim wsTrx As Worksheet
    Dim wsInvoices As Worksheet
    Dim trxRange As Range
    Dim LastRow As Long
    Dim i As Long
    Dim j As Long
    ' 新增标记变量,判断是否找到匹配邮箱
    Dim isExist As Boolean

    ' 绑定工作表对象
    Set wsTrx = ThisWorkbook.Worksheets("Transactions")
    Set wsInvoices = ThisWorkbook.Worksheets("Invoices Summary")

    ' 获取发票表C列最后一行非空行号
    LastRow = wsInvoices.Cells(wsInvoices.Rows.Count, "C").End(xlUp).Row

    ' 读取发票表已有邮箱列表到数组,所有Range都指定所属工作表,无需激活
    If wsInvoices.Range("C3") <> "" Then
        Set emailColumn = wsInvoices.Range("C2", wsInvoices.Range("C2").End(xlDown))
    Else
        Set emailColumn = wsInvoices.Range("C2")
    End If
    InvArray = emailColumn.Value

    ' 读取交易表所有数据到数组,所有Range都指定所属工作表,无需激活
    Set trxRange = wsTrx.Range("A2", wsTrx.Range("A1").End(xlToRight).End(xlDown))
    TrxArray = trxRange.Value

    ' 遍历所有交易记录
    For i = LBound(TrxArray, 1) To UBound(TrxArray, 1)
        isExist = False ' 初始化标记为未找到
        ' 遍历已有发票邮箱列表
        For j = LBound(InvArray, 1) To UBound(InvArray, 1)
            If TrxArray(i, 1) = InvArray(j, 1) Then
                isExist = True ' 找到匹配,修改标记
                Exit For ' 提前退出循环,无需继续比对
            End If
        Next j
        
        ' 遍历完所有邮箱都未找到匹配,写入新行
        If Not isExist Then
            LastRow = LastRow + 1 ' 行号+1
            wsInvoices.Range("C" & LastRow).Value = TrxArray(i, 1)
            ' 可选:同步更新InvArray,避免后续重复写入同个新添加的邮箱
            ReDim Preserve InvArray(1 To UBound(InvArray, 1) + 1, 1 To 1)
            InvArray(UBound(InvArray, 1), 1) = TrxArray(i, 1)
        End If
    Next i
End Sub

内容的提问来源于stack exchange,提问作者Dawid S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:03