目前我面临的问题让我很烦恼。我希望有人可以帮助我。我在大公司工作,使用Office 2007(32位)和Office 2010(64位)。编写宏以通过整个公司进行兼容对我来说是一项艰巨的任务(我以前从未在VBA中编程 - 实际上这个论坛对我帮助很大)。我的任务是在共享的Excel工作表中维护一个大表。有几个宏和几个用户表单。现在我将简要地解决这个问题: 工作表包含两列日期格式(开始日期和结束日期)。这两个值都导入到列形式userform的文本框中(commandbutton lunches MsCal -exported to class-将日期填充到那些文本框中)。我只需要在两列中都将日期格式设置为mm / dd / yyyy,以便执行过滤和其他操作。当使用与英语不同的本地化的工人更新此值时,美国日期输入为dd.mm.yyyy。这是根据不可能的日期进行适当的过滤。我试图改变格式:
UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy")
但是这段代码在某种程度上行为不端。在某些机器上它可以工作,其中一些机器不起作用。这就是令我头痛的问题。我现在该怎么办?有没有办法强制excel在工作表中使用相同的日期格式并忽略Windows中的本地化设置?员工不希望将本地化更改为美国英语,因为他们要么习惯于他们的格式,要么将其用于其他应用程序。有没有办法在此表单打开时暂时更改本地化? 任何建议都会被贬低。 提前致谢 彼得
答案 0 :(得分:1)
您可以做的最好的事情是永远不要将日期变量转换为文本。
在excel的内部,日期只是一个连续的数字(小数点分隔符的左边是天,小数点分隔符的右边是小时)。因此,例如, 2012年6月10日,对于Excel, 41188 。此日期值与计算机上设置的日期格式无关。
现在,当涉及表示日期(人类可视化)时,Excel会将此内部值格式化为具有计算机中设置格式的字符串。因此,例如,如果您的计算机中有美国日期格式,则日期41188将格式化为6/10/2012。
日期的一大挑战是以正确的格式输入日期。当您将日期输入为字符串(“6/10/2012”)时,Excel将根据您计算机上设置的日期格式对其进行解释。如果你有美国格式,那么它将把第一个密码作为月份,第二个作为日期,最后一个作为年份。如果您使用的是德语格式,则会将第一个作为日期,下一个作为月份,最后一个作为年份。因此,美国格式Excel的相同输入(“6/10/2012”)将读取6月10日,德语格式Excel将读取Oktober的第6个。
在您的情况下,您不应格式化Textbox10中的日期。对于美国格式的Excel没有问题,但如果你有另一种日期格式,第一个密码是一天而不是一个月,你将得到错误的值: 检查此示例。用户以德语格式Excel(dd.mm.yyyy)
输入6月10日Calendar1.Value
检索日期值( 41188 )Format(Calendar1.Value, "mm/dd/yyyy")
将日期值转换为字符串“06/10/2012”如果Calendar1.Value
检索日期变量并将此日期变量提供给日期格式化列,您将始终在列中获取正确的日期,并且无论日期如何,您都可以正确过滤和排序日期在列单元格内设置的格式或在用户计算机中设置的格式。
现在,在您的情况下,最好的方法是直接将Calendar1.Value
分配给所需的单元格。类似的东西:
ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value
您仍然可以将Calendar1.Value
设置到TextBox10中以供用户查看其选择,但禁用TextBox10以便唯一的编辑选项是日历控件。使用日期时,不必从TextBox10中删除它,直接从Calendar1.Value
获取它。
如果仍需要将Calendar1中的选定值显示到textBox中,请不要在文本框中格式化日期。相反,使用:
UserForm1.TextBox10.Value = Cstr(Calendar1.Value)
这样,用户将在日期格式中看到他在计算机中设置的日期以及他习惯使用的日期。
答案 1 :(得分:0)
一种解决方案是不使用日期编号格式,而是仅对您指定"mm/dd/yyyy"
作为格式字符串的所有单元格日期使用自定义格式。但是,根据我的经验,如果您的计算机的区域设置设置为使用"mm/dd/yyyy"
,那么如果您尝试使用相同的字符串进行自定义单元格格式设置excel将保持与计算机设置链接,因此无济于事您。我解决这个问题的方法是更改计算机上的日期格式,然后将单元格格式化为自定义“mm / dd / yyyy”并保存(然后将计算机的设置恢复为原样。)现在即使excel仍然声称它们是日期单元格,您将看到更改计算机上的设置不会更改单元格中的值。
我想另一种方法是在日期单元格旁边总是有一个调用TEXT函数的单元格。因此,如果您在A1中有一个日期,那么在另一个单元=TEXT(A1, "mm/dd/yyyy")
中,并且只引用这个新单元格。但这可能会使你的电子表格变得非常混乱。
我想最好的解决方案就是让IT部门将公司日期设置中的每一个设置为使用相同的格式。