【问题标题】:How do I copy dates from a different regional format in Excel VBA?如何在 Excel VBA 中从不同的区域格式复制日期?
【发布时间】:2018-01-12 12:01:57
【问题描述】:

我有一个工作簿,用于从另一个我只有读取权限的工作簿中收集相关数据。我使用 Excel 的内置函数“数据连接”将后者连接到我自己的。复制这样的工作表,然后从复制的工作表中复制相关数据在我的情况下(是的,我测试过)更快(大约 30%),而不是打开所述工作簿,然后直接从源复制相关数据。

源中的默认日期格式是“dd/mm/yy”(尽管打开时显然会适应本地日期格式设置)。复制的工作表保持该日期格式,但是当复制区域设置为“英语-美国”的日期时,即使单元格格式为“dd/mm/yy”,Excel 也会假定源格式为“yy/mm/dd”。

问题就在这里: 并非我的工作簿的所有用户都可以使用本地日期格式“dd/mm/yy”,有些用户必须使用“mm/dd/yy”或“yy/mm/dd”。

当本地格式并不总是不同时,如何告诉 Excel 从特定日期格式复制到本地日期格式?


使用Application.International(xlDateOrder)检查本地格式,然后在格式不同时更改日期似乎是一种复杂的解决方法,我想避免。


源格式为dd/mm/yy,用TargetSheet.Cells(TargetRow, TargetColumn).Value = CDate(SourceSheet.Cells(SourceRow, SourceColumn).Value)复制后格式为dd/mm/yy,天为年,年为天。

【问题讨论】:

  • 这些日期是真实日期(日期格式)还是文本字符串?对于日期,这应该没有任何问题(因为格式只是表示形式,在内部它是一个数值)。但是,使用 textstring,您可能会遇到很多问题
  • 这可能取决于您复制的准确程度。您在多大程度上使用 VBA 来做到这一点?如果您正在使用它,请包含相关代码。但作为初学者,CDate 类型转换似乎足够智能,可以捕获许多格式(并将其转换为本地格式),Format 可以修复此问题的某些变体,由于某种原因,CDate 不会自动拾取这些变体:TargetWorksheet.Range("A1").Value = CDate(Format(SourceWorksheet.Range("A1"), "dd/mm/yy"))
  • @FunThomas 即使函数状态格式也被复制,它们也必须被复制为文本字符串,否则我无法解释这里发生了什么。
  • @Vegard 请把它写成答案,所以我可以接受。

标签: vba excel date


【解决方案1】:

这可能取决于您复制数据的准确程度。

在您的情况下,我并不完全清楚您的源数据是什么样的,但是对于使用 CDate 进行类型转换的日期不足以使 Excel 自行推断出正确格式的情况,您应该能够使用Format 强制正确解释:

TargetSheet.Range("A1").Value = _ 
    CDate(Format(SourceSheet.Range("A1").Value, "dd/mm/yy"))

请注意,您可能会遇到需要调整此方法的数据集(例如,具有不同格式或特定格式的数据不适合 Excel 的算法来理解转换)。

在某些情况下(可能是文本转换),您可能必须在之后应用该格式。也就是说,将Format 应用于CDate 对象,而不是相反。我没有在任何重要范围内查找此内容,也无法提供具体的细节或示例,但我提到它是为了让您保持警惕。

我也不确定这种方法在多大程度上适用于 VBA 标准“英美”格式之外的源格式。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2023-03-20
    • 2013-11-17
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多