VBA运行时错误1004求助:Categorize宏写入D列时报错
嘿,我帮你找出问题所在了!你遇到的Run-time error '1004'主要有两个关键原因,咱们一步步来解决:
问题1:未定义且未赋值的LSearchRow变量
你在所有ElseIf条件里都用了Range("B" & CStr(LSearchRow)),但这个变量既没有声明,也从来没给它赋过值!VBA会把它当作空值处理,导致引用的单元格地址无效——这就是触发错误的直接原因。其实你在循环里已经拿到了Cell对象,完全可以直接用Cell.Value来判断,不用再去拼单元格地址。
问题2:未明确限定工作表范围
你一开始用Sheets(2).UsedRange.Rows.Count获取行数,但后面的Range("B2", "B" & RN)默认是指当前激活的工作表,而不是你目标的Sheets(2)。如果当前激活的不是第二张表,就会出现范围不匹配的问题,也可能引发错误。
修正后的完整代码
我把代码里的问题都修复了,还加了一些适合新手的优化注释:
Sub Categorize() Dim RN As Long ' 用Long代替Integer,避免行数超过Integer上限(32767) Dim Cell As Range Dim ws As Worksheet ' 明确指定要操作的工作表,避免依赖当前激活表 Set ws = ThisWorkbook.Sheets(2) ' 获取该工作表的已用行数 RN = ws.UsedRange.Rows.Count ' 限定循环范围在目标工作表的B列 For Each Cell In ws.Range("B2", "B" & RN) ' 直接用Cell.Value判断,替换掉未定义的LSearchRow If Cell.Value = "TS-VIRGIN MOBILE CLIENT ID 14 DIG" Then Cell.Offset(0, 2).Value = "Phone Bill" ElseIf Cell.Value = "WALMART STORE #1097 CALGA" Then Cell.Offset(0, 2).Value = "Groceries" ElseIf Cell.Value = "INTERAC E-TRANSFER" Then Cell.Offset(0, 2).Value = "Income" ElseIf Cell.Value = "FPOS LOBLAWS CITY MARKET CALGA" Then Cell.Offset(0, 2).Value = "Groceries" ElseIf Cell.Value = "INVESTMENT PURCHASE" Then Cell.Offset(0, 2).Value = "Investments" ElseIf Cell.Value = "OPOS AMZN Mktp CA WWW.A" Then Cell.Offset(0, 2).Value = "Personal Shopping" ElseIf Cell.Value = "FPOS ZEE CUTS LTD. CALGA" Then Cell.Offset(0, 2).Value = "Personal Shopping" ElseIf Trim(Cell.Value) = "" Then ' 用Trim更准确判断空单元格 Cell.Offset(0, 2).Value = "Income" ElseIf Cell.Value = "MB-EMAIL MONEY TRF" Then Cell.Offset(0, 2).Value = "Income" Else Cell.Offset(0, 2).Value = "Miscellaneous" End If Next Cell End Sub
给新手的调试小技巧
- 启用
Option Explicit:在模块顶部加上这行代码,VBA会强制你声明所有变量,避免像LSearchRow这种未定义变量导致的低级错误。 - 逐行调试:按
F8键逐行执行代码,观察每一步的变量值和单元格操作,能快速定位问题行。 - 明确工作表引用:永远不要依赖默认的激活表,像代码里那样用
Set ws = ...指定目标表,能避免很多跨表操作的坑。
内容的提问来源于stack exchange,提问作者Ola Akinsunmade
相关产品推荐
相关产品推荐

