VBA用户窗体中计算英国格式日期天数差的问题及解决
问题解决:Trevor Eyre日历控件日期格式适配英国用户后DateDiff计算失效
使用Trevor Eyre日历控件获取美国格式日期后,为适配英国用户转为dd-mmm-yy格式,却因文本框存储的是字符串类型,导致DateDiff无法正确计算天数差。
原代码问题分析
原代码将日期直接格式化字符串后存入文本框,此时文本框的值是字符串而非日期类型,DateValue解析字符串时可能因区域设置出现错误,同时重复使用sDate变量也易造成逻辑混淆:
Private Sub TextBox6_Enter() 'CALENDAR arrival date Dim dateVariable As Date dateVariable = CalendarForm.GetDate Dim sDate As String 'changes format from USA for UK users sDate = Format(dateVariable, "dd-mmm-yy") TextBox6.value = sDate End Sub Private Sub TextBox7_Enter() 'CALENDAR date leave Dim dateVariable As Date dateVariable = CalendarForm.GetDate Dim sDate As String 'changes format from USA to UK sDate = Format(dateVariable, "dd-mmm-yy") TextBox7.value = sDate End Sub Private Sub TextBox20_change() 'Number of NIGHTS TextBox20.value = DateDiff("d", DateValue(TextBox6.value), TextBox7.value) End Sub
修正后代码
通过先保留日期类型值,再格式化显示的方式,确保文本框底层存储的是日期类型,同时更换变量名避免重复,将天数计算逻辑移至离开日期选择完成时触发:
Private Sub TextBox6_Enter() ' CALENDAR arrival date Dim dateVariable As Date dateVariable = CalendarForm.GetDate TextBox6.value = dateVariable sDate = Format(dateVariable, "dd/mm/yyyy") 'changes format from USA to UK TextBox6.value = sDate 'entry to textbox End Sub Private Sub TextBox7_Enter() 'CALENDAR date leave Dim dateVariable As Date dateVariable = CalendarForm.GetDate TextBox7.value = dateVariable tDate = Format(dateVariable, "dd/mm/yyyy") 'changes format from USA to UK TextBox7.value = tDate TextBox20.Text = DateDiff("d", TextBox6.value, TextBox7.value) End Sub
修正说明
- 先将原始
Date类型的dateVariable赋值给文本框,确保文本框保留日期值的本质 - 再通过
Format方法将日期格式化为英国用户习惯的dd/mm/yyyy显示,不改变底层存储类型 - 更换重复的
sDate变量为tDate,避免变量名冲突和逻辑混淆 - 将天数计算逻辑移至
TextBox7_Enter事件中,用户选择离开日期后直接计算并显示结果,无需等待TextBox20触发变更事件
内容的提问来源于stack exchange,提问作者nickC
相关产品推荐
相关产品推荐

