Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 获取系统&x27;s日期分隔符_Excel_Vba_Ms Access_Office365 - Fatal编程技术网

Excel 获取系统&x27;s日期分隔符

Excel 获取系统&x27;s日期分隔符,excel,vba,ms-access,office365,Excel,Vba,Ms Access,Office365,我需要将各种Excel文件导入Access数据库。有两个日期列使用所有可能的格式,如01.05.2020或01,052020或01/05/2020,具体取决于它们的创建方式。有时它是有效日期,有时它只是一个字符串 Access应用程序也将在不同的系统上运行,因此它们可能使用不同的分隔符。这意味着我不能用/替换所有或,。我将创建一个replace函数,该函数将规范化运行该函数的任何系统的字符串,但我不知道如何获取当前系统的日期分隔符 VBA能给我这些信息吗?使用enum和应用程序.Internat

我需要将各种Excel文件导入Access数据库。有两个日期列使用所有可能的格式,如
01.05.2020
01,052020
01/05/2020
,具体取决于它们的创建方式。有时它是有效日期,有时它只是一个字符串

Access应用程序也将在不同的系统上运行,因此它们可能使用不同的分隔符。这意味着我不能用
/
替换所有
。我将创建一个replace函数,该函数将规范化运行该函数的任何系统的字符串,但我不知道如何获取当前系统的日期分隔符

VBA能给我这些信息吗?

使用enum和
应用程序.International
属性来检索此配置

这将在我的系统上返回
/

如果您在Access主机中,您将希望避免使用全局
Excel.Application
对象,并使用您自己的实例,一旦完成,您可以
退出该实例:

Dim app As Excel.Application
Set app = New Excel.Application
Debug.Print app.International(xlApplicationInternational.xlDateSeparator)
'...
app.Quit

真正简单且最快的方法是让VBA完成工作,因为字符“/”用于格式化指定日期分隔符:

' Get localised date separator.
DateSeparator = Format(Date, "/")

' Denmark -> "-"
' Germany -> "."
' US      -> "/"
为什么会这样:

(/)-日期分隔符。在某些地区,可以使用其他字符表示日期分隔符。日期分隔符用于分隔日期值格式化时的日期、月份和年份。格式化输出中用作日期分隔符的实际字符由系统设置决定


哦,我刚刚想出了一个肮脏的解决办法。我使用
Date
函数,将其分配给一个字符串并检查哪个字符是分隔符。您可以调用Windows API来检索此信息。请注意,这将返回
sDate
注册表项,它不一定等于VBA使用的短日期格式中使用的值(位于
sShortDate
)中。但它应该适用于大多数情况。@t3chb0不要确保您没有引用某个全局作用域隐式
Excel。应用程序
实例,请参阅编辑(如果您的Access应用程序关闭,并且任务管理器中有“ghost”Excel.EXE进程,这就是原因)@MathieuGuindon关于Excel应用程序:没有共享代码,问题也被标记为ms access,因此我不太确定。关于格式,您无法从
xlApplicationInternational
enum重构长日期格式,只能进行有根据的猜测。例如,日本日期格式
yyy年M月D日。你不能从你当前提供的内容中重建它,你需要
sShortDate
你在Excel过程中是正确的。我有78个它的重影实例LOL@t3chb0t哎哟!确保所有
Application
成员调用都使用您自己的
Excel.Application
实例明确限定,例如使用
app.Worksheets
而不是
Excel.Worksheets
或只是
Worksheets
(实际上,其他所有VBA示例都做得不对);隐式限定调用将生成一个隐式
应用程序
,而您不希望它出现:)@BigBen maybe。虽然感觉有点不舒服;如果要在生产代码中使用,我希望有一个注释,而
Excel.Application.International
说明了它的功能,也说明了它的功能。Oto这将直接在标准库之外工作,因为这是
VBA.Strings.Format
:向上投票@马蒂尤金登:在线评论添加了。@马蒂尤金登的确,这是一个很好的把戏,但看起来并没有那么刻薄。我引用了文档中的部分来证实它的机制(我很好奇为什么它能工作,所以我检查了它)。我认为这个解决方案也可以。我实际上也接受了;-)@t3chb0t编辑得很好,我想其他无用的“谢谢”按钮可能意味着“这是一个虚拟的其他投票”=)带有一条注释,可以防止维护人员查找文档,顺便说一句,这是一个很好的解决方案
' Get localised date separator.
DateSeparator = Format(Date, "/")

' Denmark -> "-"
' Germany -> "."
' US      -> "/"