VBA运行时错误13:拖拽初始值触发类型不匹配问题求助
解决VBA拖拽多单元格触发错误13的问题
问题原因
拖拽操作会让Target变成多单元格区域,此时Target.Value返回的是数组,原代码直接用<>比较数组和PreviousValue,触发类型不匹配错误(错误13)。另外原代码在Worksheet_Change中重复声明PreviousValue,覆盖了模块级变量,导致逻辑异常。
修复方案
- 移除
Worksheet_Change中重复声明的Dim PreviousValue,保留模块级变量 - 处理多单元格场景:循环遍历
Target中的每个单元格,逐个比较原值和新值 - 在
Worksheet_SelectionChange中,针对多单元格自动存储每个单元格的原值(以数组形式)
修改后的完整代码
' 模块级变量,存储选中单元格的原值 Dim PreviousValue As Variant Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim ws As Worksheet Dim i As Long Dim cellIndex As Integer ' 处理B列自动填充日期逻辑 For Each Cell In Target If Cell.Column = Range("B:B").Column Then If Cell.Value <> "" Then Cells(Cell.Row, "A").Value = Now Else Cells(Cell.Row, "A").Value = "" End If End If Next Cell Set ws = Sheets("log") ' 遍历每个修改的单元格,记录日志 For Each Cell In Target ' 计算当前单元格在选中区域中的索引,对应PreviousValue数组中的值 cellIndex = Cell.Row - Target.Row + 1 ' 分别处理单个单元格和多单元格的情况 If (IsArray(PreviousValue) And Cell.Value <> PreviousValue(cellIndex, 1)) Or _ (Not IsArray(PreviousValue) And Cell.Value <> PreviousValue) Then i = ws.Range("A" & Rows.Count).End(xlUp).Row + 1 With ws .Range("A" & i).Value = Application.UserName .Range("B" & i).Value = Cell.Address .Range("C" & i).Value = IIf(IsArray(PreviousValue), PreviousValue(cellIndex, 1), PreviousValue) .Range("D" & i).Value = Cell.Value .Range("E" & i).Value = Format(Now(), "dd/mm/yyyy") End With End If Next Cell End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 存储选中单元格的值,多单元格时自动转为数组 PreviousValue = Target.Value End Sub
关键修改说明
- 保留模块级
PreviousValue,避免重复声明覆盖变量 - 遍历每个修改的单元格,逐个处理日志,规避多单元格的数组比较问题
- 通过
IsArray判断PreviousValue类型,适配单个/多单元格场景 - 用
cellIndex定位数组中对应单元格的原值,确保日志记录准确
内容的提问来源于stack exchange,提问作者johnaskmeb
相关产品推荐
相关产品推荐

