Excel VBA中Range赋值O列触发1004运行时错误求助
问题排查与解决思路
针对你遇到的仅在读取O列数据写入C列时触发Run-time error '1004'的情况,结合代码和场景,常见原因及解决方法如下:
1. 工作表保护或O列单元格锁定
这是最常见的触发原因:
- 检查Sheet18是否处于保护状态:右键工作表标签,若显示"撤销工作表保护"选项,说明表被保护。即便其他列能正常读写,O列可能被单独设置为锁定状态,导致读取或写入时触发权限错误。
- 解决:先撤销工作表保护(有密码需输入对应密码),或者在代码开头添加
Sheet18.Unprotect Password:="你的密码",结尾添加Sheet18.Protect Password:="你的密码"(需要保持表保护时使用)。
2. O列存在合并单元格
如果Range("O" & i)对应的单元格是合并区域的一部分,直接引用赋值会因范围不匹配报错:
- 检查O列第i行单元格是否和其他单元格合并,若有,修改代码为读取合并区域的左上角单元格值:
Sheet18.Range("C" & j) = Sheet18.Range("O" & i).MergeArea.Cells(1,1).Value
3. O列单元格包含数组公式或特殊数据验证
若O列单元格使用了数组公式,或设置了限制读取的特殊数据验证规则,可能导致读取值时出错:
- 暂时清空O列第i行的数组公式或数据验证,测试代码是否正常运行,再针对性调整规则。
4. 变量类型溢出风险(次要)
代码中用Integer类型存储行号,当行数超过32767时会溢出报错。虽然目前其他列正常,但建议将i、j、blankCount的类型改为Long,避免后续隐藏问题:
Dim i As Long Dim j As Long Dim blankCount As Long
临时测试方案
可以先将读取O列的代码替换为常量赋值,比如Sheet18.Range("C" & j) = "测试值",如果运行正常,说明问题确实出在O列的单元格属性上,而非代码逻辑。
内容的提问来源于stack exchange,提问作者234Mike432
相关产品推荐
相关产品推荐

