Excel VBA错误1004:Worksheet的RangeOf方法失败,自定义日历代码求助
解决VBA错误1004:Worksheet对象的RangeOf方法失败
首先要敲黑板说个关键点:VBA里根本没有RangeOf这个方法,你看到的错误提示绝对是手滑把Range写成了RangeOf——大概率是代码里标注(*****)的位置写了错误的方法名,这就是触发错误1004的直接原因。
接下来我们一步步排查修复你的代码:
1. 先修正核心的方法名错误
如果在(*****)的位置你原本想写Range相关的操作(比如选中区域、赋值、清空内容等),直接把错误的RangeOf改成Range就行。举个例子,要是你原本想清空M3和B7的旧内容,这里应该写.Range("M3,B7").ClearContents而不是.RangeOf(...)。
2. 额外的代码优化与潜在问题排查
除了方法名的低级错误,你的代码还有几个可以完善的地方,能避免后续踩坑:
- 确认Sheet10的引用有效性:打开VBA编辑器的工程窗口,检查你日历所在工作表的CodeName是不是真的是
Sheet10(就是工作表属性里括号外的那个名字)。如果不是,改成对应的CodeName,或者用工作表名称引用(比如ThisWorkbook.Worksheets("你的日历表名")),防止引用错工作表。 - 规避Offset越界风险:当你选中的是目标区域的第一行单元格(比如D6),
Target.Offset(-1,0)会指向D5,要是这个单元格不存在或者工作表被保护,很可能触发新的错误。可以加个行号判断:If Target.Row > 6 Then ' 确保上一行存在才执行后续操作 If Target.Offset(-1, 0).Value <> Empty Then .Range("M3").Value = Target.Offset(-1, 0).Value .Range("B7").Value = Target.Address End If End If - 简化目标区域的判断逻辑:把重复的长Range合并成一个变量,代码会更清晰,也不容易写错:
Dim targetRange As Range Set targetRange = .Range("D6:J10,D12:J16,D18:J22,D24:J28,D30:J34,D36:J40") If Not Intersect(Target, targetRange) Is Nothing Then ' 你的业务逻辑代码 End If
修复后的示例代码
假设你在(*****)的位置原本想清空M3和B7的旧内容,修复后的完整代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = False If Target.Count > 6 Then Exit Sub Dim targetRange As Range With Sheet10 Set targetRange = .Range("D6:J10,D12:J16,D18:J22,D24:J28,D30:J34,D36:J40") If Not Intersect(Target, targetRange) Is Nothing Then ' 替换成你原本想实现的正确Range操作 .Range("M3,B7").ClearContents ' 增加行号判断,避免Offset越界 If Target.Row > 6 And Target.Offset(-1, 0).Value <> Empty Then .Range("M3").Value = Target.Offset(-1, 0).Value .Range("B7").Value = Target.Address End If End If End With Application.ScreenUpdating = True End Sub
内容的提问来源于stack exchange,提问作者philipprd
相关产品推荐
相关产品推荐

