7

目前我面临着困扰我很多的问题。我希望有人可以帮助我。我在同时使用 Office 2007(32 位)和 Office 2010(64 位)的大公司工作。编写宏以在整个公司中兼容对我来说是一项艰巨的任务(我以前从未在 VBA 中编程 - 实际上这个论坛对我帮助很大)。我的任务是在共享 Excel 工作表中维护一张大表。有几个宏和几个用户窗体。现在我将简要描述这个问题:工作表包含两列日期格式(开始日期和结束日期)。这两个值都被导入到用户窗体的文本框的列表单中(命令按钮午餐 MsCal - 导出到类 - 用日期填充这些文本框)。我只需要在两列中都将日期格式设置为 mm/dd/yyyy,以便执行过滤和其他操作。当使用与英语不同的本地化的工作人员更新此值时,美国日期输入为 dd.mm.yyyy。这使得基于日期的适当过滤变得不可能。我试图通过以下方式更改格式:

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

但这段代码不知何故行为不端。在某些机器上它可以工作,在其中一些机器上它不工作。这就是让我头疼的地方。我现在应该如何进行?有没有办法强制 excel 在工作表中使用相同的日期格式并忽略 Windows 中的本地化设置?员工不想将本地化更改为美国英语,因为他们要么习惯了他们的格式,要么需要它用于其他应用程序。有没有办法仅在此工作表打开时临时更改本地化?任何建议将不胜感激。在此先感谢彼得

4

2 回答 2

1

您能做的最好的事情就是永远不要将日期变量转换为文本。

在 Excel 内部,日期只是一个连续的数字(小数分隔符左边是天,小数分隔符右边是小时)。因此,例如,2012 年 6 月 10 日,对于 excel 是41188。此日期值与您计算机上设置的日期格式无关。

现在,当涉及到表示日期(供人类可视化)时,Excel 会将此内部值格式化为一个字符串,该字符串具有您计算机中设置的格式。因此,例如,如果您的计算机中有美国日期格式,则日期 41188 将被格式化为 2012 年 6 月 10 日。

日期的最大挑战是以正确的格式输入日期。当您输入日期作为字符串(“6/10/2012”)时,Excel 将根据您计算机上设置的日期格式对其进行解释。如果你有美国格式,那么它将把第一个密码作为月份,第二个作为日,最后一个作为年。如果您有德语格式,它将第一个读作日,下一个读作月,最后一个读作年。因此,美国格式 Excel 的相同输入(“6/10/2012”)将读取 6 月 10 日,而德国格式 Excel 将读取 6 月 6 日。

在您的情况下,您不应该格式化 Textbox10 中的日期。对于美国格式的 Excel 没有问题,但如果您有另一种日期格式,其中第一个密码是日期而不是月份,您将得到错误的值:检查此示例。用户以德语格式 Excel (dd.mm.yyyy) 输入 6 月 10 日

  1. Calendar1.Value检索日期值 ( 41188 )
  2. Format(Calendar1.Value, "mm/dd/yyyy")将日期值转换为字符串“06/10/2012”
  3. 使用格式化日期 (STRING) 时,Excel 必须解释它是什么日期。因为计算机的日期格式是德语,所以它会读取 Day:06, Month:10, Year:2012。您将使用第41070天而不是41188

如果Calendar1.Value检索日期变量并将此日期变量提供给日期格式的列,您将始终在列中获得正确的日期,并且无论在列单元格内设置的日期格式如何,您都将能够正确过滤和排序日期或在用户计算机中设置的格式。


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

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

您仍然可以分配Calendar1.Value到 TextBox10 以供用户查看他的选择,但禁用 TextBox10 以便唯一的编辑选项是日历控件。并且在处理日期时,不是从 TextBox10 中提取它,而是直接从Calendar1.Value.

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

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

这样,用户将看到他在他的计算机中设置的并且他习惯的日期格式的日期。

于 2012-10-12T15:26:25.207 回答
0

一种解决方案是不使用日期数字格式,而仅对您指定"mm/dd/yyyy"为格式字符串的所有单元格日期使用自定义格式。但是,根据我的经验,如果您的计算机的区域设置被设置为使用,"mm/dd/yyyy"那么如果您尝试使用相同的字符串进行自定义单元格格式设置,excel 将保留为链接到计算机设置的日期,因此这对您没有帮助。我解决此问题的方法是更改​​计算机上的日期格式,然后将单元格格式化为自定义“mm/dd/yyyy”并保存(然后将计算机的设置恢复为原来的状态。)现在即使 excel 仍然声称它们是日期单元格,您会看到更改计算机上的设置不会更改单元格中的值。

我想另一种方法是在调用 TEXT 函数的日期单元格旁边始终有一个单元格。因此,如果您在 A1 中有日期,则在另一个单元格中=TEXT(A1, "mm/dd/yyyy"),并且只引用这个新单元格。但这可能会使您的电子表格非常混乱。

我想最好的解决方案是让您的 IT 部门将公司日期设置中的每个设置都设置为使用相同的格式。

于 2012-10-12T12:17:12.670 回答