VBA跨表读写脚本出现Error13类型不兼容错误求助
问题排查与修复方案
错误原因分析
你遇到的Error 13(类型不匹配)主要由三个核心问题导致:
- 语法错误:定义
transportColumn的代码缺少闭合括号,VBA无法正确解析范围对象。 - 范围引用逻辑错误:若
"Transport"和"Faktura"是工作表表头而非命名区域,直接用.Range("Transport")会引用错误范围;同时循环内重复定义范围,既低效又易引发对象类型冲突。 - 查找逻辑颠倒:原代码循环
Faktura列匹配LADUNGSNUMMER的值,与需求完全相反——应该是在Transport列查找值,再取对应行的Faktura值。
修复后的完整代码
Sub NVLFakturenLaden() Dim wsNVL As Worksheet, wsDATA As Worksheet Dim loadNumberRange As Range Dim cell As Range Dim counter As Long Dim transportCol As Long, fakturaCol As Long Dim lastRow As Long Dim result As String Dim i As Long ' 初始化工作表对象 Set wsNVL = ThisWorkbook.Sheets("NVL") Set wsDATA = ThisWorkbook.Sheets("DATA") ' 定位DATA表中Transport和Faktura列的列号(假设表头在第一行) transportCol = wsDATA.Rows(1).Find(What:="Transport", LookIn:=xlValues, LookAt:=xlWhole).Column fakturaCol = wsDATA.Rows(1).Find(What:="Faktura", LookIn:=xlValues, LookAt:=xlWhole).Column ' 获取DATA表Transport列的最后一行数据 lastRow = wsDATA.Cells(wsDATA.Rows.Count, transportCol).End(xlUp).Row ' 定义NVL表的LADUNGSNUMMER范围 Set loadNumberRange = wsNVL.Range("LADUNGSNUMMER") counter = 0 ' 遍历LADUNGSNUMMER列的每个值 For Each cell In loadNumberRange result = "" ' 在DATA表Transport列查找匹配值,拼接对应Faktura For i = 2 To lastRow ' 跳过表头行,从第二行开始遍历 If wsDATA.Cells(i, transportCol).Value = cell.Value Then If result <> "" Then result = result & ", " & wsDATA.Cells(i, fakturaCol).Value Else result = wsDATA.Cells(i, fakturaCol).Value End If End If Next i ' 将结果写入EX-Fakturen列(LADUNGSNUMMER列右侧一列) cell.Offset(0, 1).Value = result If result <> "" Then counter = counter + 1 Next cell MsgBox "已为 " & counter & " 条运输记录加载对应发票信息。", vbInformation End Sub
关键修复点说明
- 修正语法错误:补全原代码中缺失的闭合括号,确保范围对象能正确创建。
- 优化范围引用:
- 通过
Find方法动态定位表头列号,避免依赖命名区域或硬编码列标,适配不同表结构。 - 将范围初始化逻辑移到循环外,仅执行一次,大幅提升运行效率。
- 通过
- 修正查找逻辑:遍历
Transport列匹配目标值,取对应行的Faktura值拼接,符合一对多的需求逻辑。 - 提升鲁棒性:默认表头在第一行,若你的表头位置不同,只需调整
Rows(1)和i=2的参数即可。
内容的提问来源于stack exchange,提问作者reznor
相关产品推荐
相关产品推荐

