有没有办法在 PC 上全局更改 VBA 设置以接受指定格式的日期和数字? (在我的情况下 dd/mm/yyyy 和逗号)
更改 Excel 设置并不能解决我的问题。
作为一名小型 VBA 开发人员,我主要创建用于数据输入和验证的用户表单。除了一些基本的访问权限之外,它还可以防止用户(主要是客户的雇佣兵)窥探数据库并破坏它。
但是,在提交表单时,文本框值会暂时保存在电子表格的单元格中。不知何故,在此步骤中,日期会被打乱,并且在某些情况下,小数点后 3 位的数字会乘以千(例如,1/2/2000 变为 2/1/2000,1,234 变为 1234)。它违背了这些应用程序的全部目的 - 数据被损坏。
我已经能够使用
Format(expression, format)
函数解决这些问题,但每次添加日期或某些精度数字时都必须应用该函数,甚至在某些辅助任务中使用该函数。
这对我来说是一个经常出现的问题,因为作为巴西人,几乎 100% 的本地用户的日期格式为 dd/mm/yyyy,小数点分隔符为“,”(逗号)。
有人遇到类似问题吗?
蒂亚
Excel 没有默认的日期格式。 Excel 使用 Windows 系统日期格式设置。您可以通过进入控制面板 -> 更改日期、时间和数字格式来更改系统设置。
将 Windows 7、8.1 和 Windows 10 中的日期格式更改为 dd-mm-yyyy
将 Windows 系统设置调整为 dd-mm-yyyy 后,CDate 将期望字符串位于 dd-mm-yyyy 中。
范围(“A1”).Value = CDate(“11/01/2016”)
结果:2016 年 1 月 11 日星期一
为那些懒惰阅读的人提供的评论摘要。
好吧,正如 Thomas Inzina 指出的那样,我的问题的明确答案是否定的,你不能,因为 VBA 中没有像全局设置这样的东西。
正如 Rory 指出的那样,CDate 函数应该解决(事实上确实如此)这个问题,至少在日期方面。同样,Thomas 的回答没有包含它,但它指向 CDate 函数将使用的 Windows 配置。
cyboashu 建议的 Datetimepicker 也可以解决这个问题,但需要对用户的 PC 进行一些调整才能使用。对我来说工作太多了。尽管如此,这种方法具有“相当”的优势,可以为您的项目增加价值。
仍在寻找逗号/点错误转换问题。我会继续编辑这个答案,而没有更好的答案存在。
这里我编写了一个名为 gdate 的函数,它接受带有特定格式的日期的字符串。然后我解析该字符串,然后根据用户日期设置调用 cdate。
我所要做的就是在我的代码中查找/替换 cdate 为 gdate 。现在我有一种方法来处理所有日期格式,始终期望精确的一个 gdate("mm/dd/yyyy")。如果您想要不同的格式,请调整解析。构建内置对象和函数是我们让事物发挥作用的方式。
Function gdate(ByVal dstring As String)
' 0 = month-day-year; 1 = day-month-year; 2 = year-month-day
d = Mid(dstring, InStr(1, dstring, "/") + 1, Len(dstring) - 5 - InStr(1, dstring, "/"))
m = Left(dstring, InStr(1, dstring, "/") - 1)
y = Right(dstring, 4)
dtype = Application.International(xlDateOrder)
Select Case dtype
Case 0: gdate = CDate(m & "/" & d & "/" & y)
Case 1: gdate = CDate(d & "/" & m & "/" & y)
Case 2: gdate = CDate(y & "/" & m & "/" & d)
End Select
End Function
对于仍然面临 VBA 代码类似问题的人,我想添加一些之前在此线程中显然遗漏的细节。
首先,VBA 实际上有一个通用的日期格式,无论用户的 Windows 环境中配置的本地区域设置如何,Excel 都可以读取它 - 它是美国日期格式,结构为 MM/DD/YYYY(您可以在此处阅读更多相关信息) )。
因此,无论用户的区域设置如何,每当您需要接受和使用日期时,我建议您应该:
至于分隔符,有几个
Excel 属性,您可以使用它们根据用户的区域设置覆盖用户的默认分隔符,并确定您希望宏使用哪些分隔符:
Application.DecimalSeparator = "-"
Application.ThousandsSeparator = "-"
Application.UseSystemSeparators = False