相同的date格式在几个本地化

目前面临的问题困扰了我很多。 我希望有人能帮助我。 我为Office 2007(32位)和Office 2010(64位)使用的大公司工作。 通过整个公司编写macros来兼容是我的难题(我之前从未在VBA中编程 – 实际上这个论坛对我有很大帮助)。 我的任务是在共享的Excel工作表中维护一个大表。 有几个macros和几个用户表单。 现在我将简要说明问题:工作表包含两个date格式的列(开始date和结束date)。 这两个值都被导入到列表forms的用户表单的文本框(命令buttonMsCal – 导出到类 – 填充这些文本框与date)。 我只需要在date格式为mm / dd / yyyy在这两列以执行过滤和其他操作。 当此值由使用与英语不同的本地化的工作人员更新时,美国date被input为dd.mm.yyyy。 这是基于date不可能的适当的过滤。 我试图改变格式:

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy") 

但这段代码不知何故行事不端。 在一些机器上它工作,其中一些机器不工作。 那是什么让我头痛。 我现在该怎么办? 有没有办法强制Excel中使用工作表中相同的date格式,并忽略Windows中的本地化设置? 员工不希望将本地化改为英文版美国,因为他们要么用于他们的格式,要么用于其他应用程序。 只有在此表打开时,是否有办法暂时更改本地化? 任何build议将被认为是。 先谢了彼得

您可以做的最好的是永远不要将datevariables转换为文本。

对于excel而言,date只是一个连续的数字(小数点分隔符的左边是天,右边的小数点是小时)。 所以,比如2012年6月10日 ,excel是41188 。 此date值与计算机上设置的date格式无关。

现在,当表示date(人类可视化)时,Excel会将此内部值格式化为一个string,并且在您的计算机中设置格式。 因此,例如,如果您的计算机中使用了美国date格式,则date41188将在2012年6月10日格式化。

date的最大挑战是以正确的格式inputdate。 当您以stringformsinputdate(“2012/6/10”)时,Excel将根据计算机上设置的date格式对其进行解释。 如果你有美国的格式,那么它会把第一个密码作为月份,第二个作为一天,最后一个作为一年。 如果您使用德语格式,则会以date显示第一个,按月显示,按年显示最后一个。 因此,对于美国格式的Excel,同样的input(“6/10/2012”)将在六月十日阅读,德语格式的Excel将阅读十月六日。

在你的情况下,你不应该格式化Textbox10内的date。 对于美国格式的Excel,没有问题,但如果您有其他date格式,第一个密码是当天而不是月份,则会得到错误的值:请检查此示例。 用户input6月10日德文格式Excel(dd.mm.yyyy)

  1. Calendar1.Value检索date值( 41188
  2. Format(Calendar1.Value, "mm/dd/yyyy")将date值转换为string“06/10/2012”
  3. 当使用格式date(STRING)时,Excel将不得不解释它是什么date。 由于计算机date格式为德语,因此将显示date:06,月:10,年:2012。 您将使用41070日而不是41188

如果Calendar1.Value检索Datevariables,并将此datevariables赋予Date formated列,那么您将总是在列中获取正确的dale,并且无论列中设置的date格式如何,您都可以正确地过滤和sortingdate单元格或用户计算机中设置的格式。


现在,在你的情况下,最好的办法是直接将Calendar1.Value赋值给所需的单元格。 就像是:

 ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value 

您仍然可以将Calendar1.Valuealignment到TextBox10中以供用户查看其select,但禁用TextBox10以便唯一的编辑选项是日历控件。 而使用date时,则是从TextBox10中取消,直接从Calendar1.Value取出。

如果您仍然需要将选定的值从Calendar1显示到文本框中,则不要在文本框中格式化date。 相反,使用:

 UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

这样,用户将看到他在计算机中设置的date格式以及他习惯的date格式。

一种解决scheme是不使用date数字格式,而只使用指定"mm/dd/yyyy"作为格式string的所有单元格date的自定义格式。 然而,根据我的经验,如果您的计算机的区域设置设置为使用"mm/dd/yyyy"那么如果您尝试使用相同的string进行自定义单元格格式化,excel将保持与计算机设置的连接,帮助你。 我解决这个问题的方法是在计算机上更改date格式,然后将这些单元格格式化为自定义“mm / dd / yyyy”并保存(然后将计算机的设置恢复为原来的样子)。现在即使excel仍然声称他们是date单元格,您会看到更改您的计算机上的设置不会更改单元格中的值。

我想另一种方法是总是有一个单元格旁边的date单元格调用TEXT函数。 所以如果你在A1中有一个date,那么在另一个单元格中=TEXT(A1, "mm/dd/yyyy") ,只能引用这个新单元格。 但是,这可能会使你的电子表格非常混乱。

我想最好的解决办法是让你的IT部门设置每个公司的date设置使用相同的格式。