VBA数组处理日期计算遇Run-time error 13:类型不匹配求助
问题解决:VBA数组计算年中天数的类型不匹配错误
错误原因
你错误地将Excel公式的字符串直接与数组中的日期值做减法运算,字符串和日期/数值类型无法直接运算,导致Run-time error 13: 类型不匹配。
修正代码
把出错的行替换为VBA原生日期函数的计算逻辑,Excel公式=A1-DATE(YEAR(A1),1,0)对应的VBA写法是用DateSerial函数获取上一年最后一天,再做减法:
Sub AddYearMonthWeekDay() Dim i As Long Dim arr As Variant With Worksheets("Source") arr = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "F").End(xlUp)).Value2 For i = LBound(arr, 1) To UBound(arr, 1) ' 跳过空值或非日期值,避免额外报错 If IsDate(arr(i, 1)) Then arr(i, 2) = Year(arr(i, 1)) arr(i, 3) = Month(arr(i, 1)) arr(i, 4) = Application.WeekNum(arr(i, 1), 2) ' 替换出错行:用VBA原生函数计算年中天数 arr(i, 5) = arr(i, 1) - DateSerial(Year(arr(i, 1)), 1, 0) Else ' 非日期值时填充空或自定义标记 arr(i, 2) = "" arr(i, 3) = "" arr(i, 4) = "" arr(i, 5) = "" End If Next i .Range("C:E").Insert .Range("C1").Value = "Year" .Range("D1").Value = "Month" .Range("E1").Value = "Week" .Range("F1").Value = "Day" .Cells(2, "B").Resize(UBound(arr, 1), 5) = arr .Range("C:F").NumberFormat = "General" ' 年中天数用常规格式更合适,无需文本格式 End With End Sub
关键说明
DateSerial(Year(date), 1, 0):VBA中当日期的日参数为0时,会返回上月最后一天,这里就是上一年12月31日,和Excel的DATE(YEAR(A1),1,0)效果完全一致。- 类型匹配:直接用VBA日期数值运算,彻底避免字符串和数值的类型冲突。
- 异常处理:增加
IsDate判断,防止数组中存在空值或非日期值时再次报错。 - 格式优化:年中天数是数值类型,把
NumberFormat改为General比文本格式@更合理,不影响正常显示。
内容的提问来源于stack exchange,提问作者HardDisk
相关产品推荐
相关产品推荐

