全局VBA日期格式和小数点分隔符

问题描述 投票:0回答:4

有没有办法在 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 formatting userform vba
4个回答
1
投票

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 日星期一


0
投票

为那些懒惰阅读的人提供的评论摘要。

好吧,正如 Thomas Inzina 指出的那样,我的问题的明确答案是否定的,你不能,因为 VBA 中没有像全局设置这样的东西。

正如 Rory 指出的那样,CDate 函数应该解决(事实上确实如此)这个问题,至少在日期方面。同样,Thomas 的回答没有包含它,但它指向 CDate 函数将使用的 Windows 配置。

cyboashu 建议的 Datetimepicker 也可以解决这个问题,但需要对用户的 PC 进行一些调整才能使用。对我来说工作太多了。尽管如此,这种方法具有“相当”的优势,可以为您的项目增加价值。

仍在寻找逗号/点错误转换问题。我会继续编辑这个答案,而没有更好的答案存在。


0
投票

这里我编写了一个名为 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

0
投票

对于仍然面临 VBA 代码类似问题的人,我想添加一些之前在此线程中显然遗漏的细节。

首先,VBA 实际上有一个通用的日期格式,无论用户的 Windows 环境中配置的本地区域设置如何,Excel 都可以读取它 - 它是美国日期格式,结构为 MM/DD/YYYY(您可以在此处阅读更多相关信息) )。

因此,无论用户的区域设置如何,每当您需要接受和使用日期时,我建议您应该:

    以字符串形式获取用户区域格式的输入日期;
  1. 重新构造日期字符串以匹配上面指定的美国日期格式;
  2. 然后对结果进行日期处理,并在宏/工作簿中使用此输出来执行任何进一步的特定于日期的操作。
这样,无论用户实际采用的格式如何,您基本上都可以对日期执行 VBA 可以执行的任何操作,并且如果您将美国格式的日期写入单元格,它们将自动以其区域格式呈现给用户,而无需任何额外的操作为了你而努力。

至于分隔符,有几个

Excel 属性,您可以使用它们根据用户的区域设置覆盖用户的默认分隔符,并确定您希望宏使用哪些分隔符:

Application.DecimalSeparator = "-" Application.ThousandsSeparator = "-" Application.UseSystemSeparators = False
    
© www.soinside.com 2019 - 2024. All rights reserved.