VBA中将字符串日期转为Long型时溢出问题咨询
VBA日期转Long型溢出问题分析与解决
首先,咱们来拆解你遇到的OVERFLOW错误原因:
你提到数组daty的第一个值是"2018-03-26",这个日期对应的Excel序列号是43186,远小于Long类型的最大值(2147483647),所以溢出不是因为数值本身太大,而是转换方式出了问题。常见的触发原因有两个:
- 系统区域设置不识别日期格式:如果你的Windows系统区域设置里的日期分隔符不是
-,或者默认日期格式不是yyyy-mm-dd,直接用CLng(daty(i))转换字符串会失败——VBA没法把这个字符串正确解析成日期,反而会尝试把它当成普通数字转换,结果自然溢出。 - 跳过了Date类型转换步骤:你得先把字符串转成VBA的Date对象,再转换成对应的序列号Long值,直接转字符串到Long是行不通的。
正确的转换方法
方法1:先转成Date再转Long(适用于系统能识别的日期格式)
如果你的系统能识别yyyy-mm-dd格式,直接用DateValue或CDate先转成日期,再转Long:
daty_int(i) = CLng(DateValue(daty(i)))
或者:
daty_int(i) = CLng(CDate(daty(i)))
方法2:拆分日期构造(兼容所有区域设置)
如果系统不识别-分隔的日期,就手动拆分年、月、日,用DateSerial构造日期后再转Long:
Dim dateParts() As String dateParts = Split(daty(i), "-") ' 确保拆分后有3个部分,避免出错 If UBound(dateParts) = 2 Then daty_int(i) = CLng(DateSerial(CInt(dateParts(0)), CInt(dateParts(1)), CInt(dateParts(2)))) End If
补充验证
你可以先测试单个值的转换,确认没问题再套进循环里:
Debug.Print CLng(DateValue("2018-03-26")) ' 输出43186,完全在Long范围内
内容的提问来源于stack exchange,提问作者Paweł
相关产品推荐
相关产品推荐

