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

Excel VBA使用For循环填充列末尾空行构建原料供应商分类表问题求助

代码核心错误点

  • 读取数据源范围时未指定工作表,默认读取当前激活的工作表而非Sheet3,容易出现数据读取错误
  • 严重逻辑错位:将全局去重供应商集合arrS的下标X直接作为Sheet3的行偏移量使用,集合下标和数据源行号完全不对应,匹配逻辑完全失效
  • 计算目标列最后一行时列号错误:写入目标列为i+1,但计算空行时取的是第i列的最后一行,导致每列最多只能写入1条数据
  • arrS做了全局供应商去重,若同一供应商属于多个分类,会导致后续分类无法匹配到该供应商
  • 未重置错误捕获状态,On Error Resume Next执行后没有恢复正常错误提示,不利于调试

修正后代码

Sub uniquevalues()
    Application.EnableEvents = False
    Dim arrCategory As New Collection, a
    Dim lRowSource As Long, i As Long, j As Long, lRowTarget As Long
    Dim wsSource As Worksheet, wsTarget As Worksheet
    
    ' 绑定工作表对象,避免活动表误读
    Set wsSource = Sheet3
    Set wsTarget = Sheet12
    
    ' 获取Sheet3原材料分类列的有效数据最后一行,避免遍历空行
    lRowSource = wsSource.Cells(wsSource.Rows.Count, "D").End(xlUp).Row
    
    ' 收集唯一原材料分类
    On Error Resume Next
    For i = 4 To lRowSource
        arrCategory.Add wsSource.Cells(i, "D").Value, CStr(wsSource.Cells(i, "D").Value)
    Next
    On Error GoTo 0 ' 重置错误捕获
    
    ' 清空目标区域旧数据
    wsTarget.Range("B1:Z1000").ClearContents
    
    ' 遍历分类写入表头并匹配对应供应商
    For i = 1 To arrCategory.Count
        ' 写入分类作为列标题
        wsTarget.Cells(1, i + 1) = arrCategory(i)
        ' 遍历所有数据源行,匹配当前分类的供应商
        For j = 4 To lRowSource
            If wsSource.Cells(j, "D").Value = arrCategory(i) Then
                ' 计算当前目标列的第一个空行行号
                lRowTarget = wsTarget.Cells(wsTarget.Rows.Count, i + 1).End(xlUp).Row + 1
                ' 写入供应商名称
                wsTarget.Cells(lRowTarget, i + 1) = wsSource.Cells(j, "C").Value
            End If
        Next
    Next
    
    Application.EnableEvents = True
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:45:03