Excel VBA下拉框单元格变更触发宏报错问题求助
问题分析与修复方案
首先,你遇到的**运行时错误13(类型不匹配)**主要有几个核心原因,咱们一步步拆解:
1. 区域判断逻辑错误
你原代码里用 Target.Address = Range("AV9:AV" & lastrow) 来判断触发事件的单元格是否在目标区域,这根本行不通:
Target.Address返回的是触发事件的单个(或选中的)单元格地址,比如$AV$10;而Range("AV9:AV" & lastrow).Address返回的是整个区域的地址,比如$AV$9:$AV$20,两者永远不可能相等。- 正确做法是用
Intersect函数判断Target是否和目标区域有交集,不管Target是单个还是多个单元格,都能准确识别。
2. 空值判断逻辑错误
Range("AV9:AV" & lastrow) <> "" 这行是在判断整个区域是否为空,但VBA里不能直接把单元格区域和空字符串做比较,这直接导致了类型不匹配的错误。你需要判断的是当前触发事件的Target单元格是否不为空,而非整个区域。
3. 固定行复制的问题
原代码复制的是固定的Range("A9:B9"),但你需要的是触发单元格对应行的A、B列数据,所以得动态获取Target所在行的A、B单元格。
另外要注意:在Worksheet_Change事件里执行复制粘贴时,会再次触发Change事件导致循环,所以要先关闭事件触发,操作完成后再恢复。
修正后的完整代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim lastrow As Long Dim targetRange As Range Dim pasteRow As Long ' 关闭事件触发,防止循环执行 Application.EnableEvents = False On Error GoTo Cleanup ' 出错时确保恢复事件触发 ' 定义目标下拉列表区域 lastrow = Tabelle3.Range("A" & Rows.Count).End(xlUp).Offset(8).Row Set targetRange = Tabelle3.Range("AV9:AV" & lastrow) ' 判断Target是否在目标区域内,且当前单元格不为空 If Not Intersect(Target, targetRange) Is Nothing And Target.Value <> "" Then ' 获取Tabelle10的下一个空白行 pasteRow = Tabelle10.Range("A" & Rows.Count).End(xlUp).Row + 1 ' 复制对应行的A、B列值到Tabelle10 Target.EntireRow.Range("A:B").Copy Tabelle10.Range("A" & pasteRow).PasteSpecial xlPasteValues Application.CutCopyMode = False End If Cleanup: ' 恢复事件触发 Application.EnableEvents = True If Err.Number <> 0 Then MsgBox "运行错误: " & Err.Description, vbExclamation End If End Sub
关于测试代码的小问题
你之前的测试代码里 If Target.Address = "$AV$9" And "$AV$9" <> "" Then 有个逻辑漏洞:"$AV$9" <> "" 是在判断字符串$AV$9是否为空,这永远为真,正确写法应该是 Range("$AV$9").Value <> "",不过因为测试代码针对单个单元格,所以没报错,但逻辑上不够严谨。
内容的提问来源于stack exchange,提问作者HPM
相关产品推荐
相关产品推荐

