VBA AutoFill填充InputBox获取范围时报错误13问题咨询
VBA运行时错误13(类型不匹配)问题定位与修复方案
报错根因
- 直接触发错误13的核心原因:变量名拼写错误。代码开头声明的Range对象变量为
xRg1(末尾字符是阿拉伯数字1),但后续给fillRange赋值时误写为xRgl(末尾字符是小写英文字母l),VBA会将未声明的xRgl识别为值为空的Variant类型变量,将空值赋值给Range类型的fillRange时就会触发类型不匹配错误。这类拼写错误在默认未开启强制变量声明的场景下极难排查,多数编辑字体中小写l和数字1视觉差异极小。 - 隐藏逻辑漏洞:即使修正拼写问题,原代码的
AutoFill调用也会报错——VBA中Range.AutoFill方法强制要求目标填充范围必须包含源范围本身,原代码直接将用户选中的独立范围作为填充目标,不满足方法调用规则;另外原代码全程使用Select/ActiveCell写入值的写法效率极低,还会受活动工作表切换影响出现写入位置错误。
修正后完整代码
' 强制所有变量必须显式声明,从编译阶段拦截拼写错误 Option Explicit Sub FillPresetSeq() Dim xRg1 As Range Dim SourceRange As Range Dim fillRange As Range ' 捕获用户点击InputBox取消按钮的场景 On Error Resume Next Set xRg1 = Application.InputBox("Range:", Type:=8) On Error GoTo 0 If xRg1 Is Nothing Then Exit Sub ' 关闭屏幕更新提升运行效率 Application.ScreenUpdating = False ' 直接给源范围批量写入预设序列,无需Select操作 Set SourceRange = ThisWorkbook.ActiveSheet.Range("D5:D9") SourceRange.Value = Array(2, 3, 4, 5, 6) ' 合并源范围与用户选中范围,满足AutoFill的参数要求 Set fillRange = Union(SourceRange, xRg1) SourceRange.AutoFill Destination:=fillRange, Type:=xlFillSeries ' 若不需要保留D列临时写入的源数据,可取消下一行注释清除内容 ' SourceRange.ClearContents Application.ScreenUpdating = True End Sub
关键修复说明
- 统一变量名拼写,所有位置均使用声明过的
xRg1变量,直接解决当前触发的错误13问题。 - 新增
Option Explicit强制变量声明规则,后续只要出现变量名拼写错误,VBA会在代码编译阶段直接提示,不会等到运行时才抛出异常。 - 新增InputBox取消场景的容错逻辑,用户点击取消按钮时宏会直接退出,不会触发对象赋值错误。
- 移除所有低效的
Select/ActiveCell操作,通过数组直接给单元格批量写入值,运行效率更高,也不会受活动工作表切换的干扰。 - 修正AutoFill的目标范围逻辑,通过
Union方法合并源范围和用户选中的范围,满足AutoFill方法的参数强制要求,避免填充时抛出运行时错误。 - 新增屏幕更新开关,减少宏运行时的界面刷新开销,运行速度提升明显。
内容的提问来源于stack exchange,提问作者Santiago Fernandez
相关产品推荐
相关产品推荐

