我有一个电子表格,其列格式为:
类别:日期
键入:* dd / mm / yyyy
地点:英国
当我通过VBA读取此列中的数据时,它会以mm / dd / yyyy格式读取。
例如,2014年6月10日(2014年6月10日)正在阅读2014年10月6日(2014年10月6日)。
我的代码:sDate = SourceSheet.Range("AB" & CurRow.Row).Value
答案 0 :(得分:2)
考虑:
Sub luxation()
Dim sDate As Date, CurRow As Range
Set SourceSheet = ActiveSheet
Set CurRow = Range("A1")
ary = Split(SourceSheet.Range("AB" & CurRow.Row).Text, "/")
sDate = DateSerial(ary(2), ary(1), ary(0))
MsgBox Format(sDate, "dd mmmm yyyy")
End Sub
答案 1 :(得分:2)
我的表单也有这个问题,对我来说最好的方法是格式化文本框,如下所示:
sDate = format(SourceSheet.Range("AB" & CurRow.Row).Value, "mm/dd/yyyy")
即使VBA中的日期格式错误,它似乎在Excel中以正确的方式运行。这很奇怪,我无法解释它为什么会发生,但这对我来说很有用。每当我从VBA转到Excel时,如果将值存储为日期,我几乎总能找到此问题。
答案 2 :(得分:0)
我的这个问题 - .NumberFormat sometimes returns the wrong value with dates and times - 提供了一些可能有用的背景知识。
我多年前第一次遇到这个VBA错误,它比看起来更糟糕。我注意到我在一年内更新的工作表中的许多(但不是全部)日期都是错误的。我花了很长时间来诊断问题。那些可以解释为中期日期的日期已被破坏,但那些不能被解释为中期日期的日期没有变化。所以2014年6月12日将成为12月6日,但2014年6月13日仍将是6月13日。如果13/06/2014作为无效日期被拒绝或作为字符串保留,我会立即发现错误。双重解释所以每个日期都被导入为日期 - 错误的日期,但仍然是一个日期 - 确保我没有注意到很久以后最大化纠正错误的成本。
Excel将日期和时间保存为数字。 " 2014年6月17日"是作为41807和" 1900年1月1日和#34;保留为1.在这两种情况下,该值是自1899年12月31日以来的天数。时间为分数:
number of seconds since midnight
--------------------------------
seconds in a day
所以06:00,12:00和18:00分别为0.25,0.5和0.75。
当传输日期涉及到字符串格式的转换时会遇到此错误。我没有发现一个案例,其中从date到string的转换是错误的。这是从字符串到日期的转换,可以解决这个问题。
我可以看到SilverShotBee的解决方案可以避免这个错误,但它不会吸引我。我不再使用任何模棱两可的日期。
一种选择是将值转换为数字。如果单元格A3包含日期和时间" 2014年6月17日9:00和#34;然后CDbl(Range("A3").Value)
返回41807.375。当您将此数字存储在单元格中时,您需要将单元格的NumberFormat设置为您选择的日期格式,但这可能是一件好事。
如果我要使用中期日期,我会明确的。 #13/06/2014#总是被解释为中端。
我更喜欢明确的字符串。 " 2014年6月13日"或者" 2014年6月13日"没有被VBA或人类读者误解。
答案 3 :(得分:0)
刚刚遇到这个问题!从.csv中读取记录并存储在.xls
中我发现以下序列可以克服错误解释的日期:
日期采用原始格式
答案 4 :(得分:0)
我发现这个问题非常复杂,并试图让它尽可能简单,但确实留下了一些重要的细节!道歉。这是我发现的更全面的版本:
首先,我应该解释一下我是从.csv读取日期(和其他字段)并存储回.xls
我在Windows 2002上运行的Office 2002
以dd / mm / yyyy字符串格式(来自csv)使用2个示例日期:2015年7月27日和2015年7月5日
我发现的是:
将csv中的27/4/2015文本日期字段读取为尺寸为STRING的变量,并以dd / mm / yyyy DATE格式存储到xls字段中,生成一个读取27/4/2015但将其转换为格式化为数字的单元格也生成27/4/2015。另一方面,7/5/2015产生一个读取7/5/2015的字符串并将其转换为格式为Number的单元格生成42131。
将csv中的27/4/2015文本日期字段读入未扩展的变量并以dd / mm / yyyy DATE格式存储到xls字段中,生成一个读取27/4/2015但将其转换为格式化的单元格的单元格由于Number也生成27/4/2015,而2015年7月5日读取2015年5月7日并将其转换为格式为Number的单元格生成42190.
将csv中的27/4/2015文本日期字段读入一个标注为DATE的变量,并以dd / mm / yyyy DATE格式存储到xls字段中,生成一个读取27/4/2015并将其转换为格式为Number的单元格生成42121.另一方面,7/5/2015生成一个读取5/7/2015的字符串并将其转换为格式为Number的单元格生成42190.
因此,上述前3个场景无法为所有日期规范生成所需的结果。
要解决此问题,请执行以下操作:
Query
最初用于存储日期的单元格格式为GENERAL,最终目标单元格格式为DATE(dd / mm / yyyy)。
我没有足够的脑细胞来完全解释在此过程中日期会发生什么,但它对我有用,当然在上面的代码块中目标细胞的选择是完全随机的。
答案 5 :(得分:0)
问题在于VBA正在打开带有倒数日期的csv单位天。
这种打开工作簿的方式与我手动进行工作时相同,因此具有dd / mm / yyyy格式的正确日期。然后正确复制:
type ComponentProps = Pick<Props, Exclude<keyof Props, keyof S | keyof A>>