如何在Excel中验证符合yyyy/mm/dd格式的波斯历日期有效性
Excel波斯(贾拉利)历日期的数据验证方案
针对Excel数据有效性默认公历1900年下限限制,无法直接验证1300-1400区间波斯历日期的问题,提供两种可行方案:
方案1:纯公式格式验证(无需VBA)
选中目标列后打开「数据验证」,选择「自定义」类型,输入以下公式:
=AND( LEFT(A1,4)+0>=1300, LEFT(A1,4)+0<=1400, MID(A1,6,2)+0>=1, MID(A1,6,2)+0<=12, RIGHT(A1,2)+0>=1, RIGHT(A1,2)+0<=31, ISNUMBER(LEFT(A1,4)+0), ISNUMBER(MID(A1,6,2)+0), ISNUMBER(RIGHT(A1,2)+0), MID(A1,5,1)="/", MID(A1,8,1)="/" )
这个公式会检查:
- 日期格式严格为
yyyy/mm/dd,分隔符是斜杠 - 年份在1300-1400区间,月份1-12,日期1-31
- 年、月、日部分均为数字
可在「输入信息」中添加提示:请输入yyyy/mm/dd格式的波斯历日期(年份1300-1400),「出错警告」设置为停止类型,避免无效输入。
方案2:VBA自定义函数(严格验证日期合法性)
如果需要验证波斯历的真实日期有效性(比如区分月份天数、闰年),可以用VBA实现:
- 按
Alt+F11打开VBA编辑器,插入新模块,粘贴以下代码:
Function IsValidJalaliDate(jalaliDate As String) As Boolean Dim y As Integer, m As Integer, d As Integer Dim parts() As String parts = Split(jalaliDate, "/") ' 检查格式是否为三段式 If UBound(parts) <> 2 Then IsValidJalaliDate = False Exit Function End If ' 检查各部分是否为数字 If Not IsNumeric(parts(0)) Or Not IsNumeric(parts(1)) Or Not IsNumeric(parts(2)) Then IsValidJalaliDate = False Exit Function End If y = CInt(parts(0)) m = CInt(parts(1)) d = CInt(parts(2)) ' 波斯历月份天数规则 Dim maxDay As Integer Select Case m Case 1 To 6: maxDay = 31 Case 7 To 11: maxDay = 30 Case 12: ' 波斯历闰年判断规则 If (y Mod 33) = 0 Or (y Mod 33) = 1 Or (y Mod 33) = 5 Or _ (y Mod 33) = 9 Or (y Mod 33) = 13 Or (y Mod 33) = 17 Or _ (y Mod 33) = 22 Or (y Mod 33) = 26 Or (y Mod 33) = 30 Then maxDay = 30 Else maxDay = 29 End If Case Else: IsValidJalaliDate = False Exit Function End Select ' 最终验证范围 IsValidJalaliDate = (y >= 1300 And y <= 1400) And _ (m >= 1 And m <= 12) And _ (d >= 1 And d <= maxDay) End Function
- 返回Excel,选中目标列设置数据验证「自定义」,输入公式:
=IsValidJalaliDate(A1)
这样就能确保输入的是真实有效的波斯历日期,而非仅格式正确的字符串。
内容的提问来源于stack exchange,提问作者Mohamed Mostafa El-Sayyad
相关产品推荐
相关产品推荐

