VBA读取错误的date格式

我有一个电子表格,格式为:

类别:datetypes:* dd / mm / yyyy地点:英国

但是,当我通过vba读取这一列的数据时,它的格式是mm / dd / yyyy。

例如2014年6月10日(2014年6月10日)正在阅读2014年10月6日(2014年10月6日)。

我在vba中的代码:sDate = SourceSheet.Range(“AB”&CurRow.Row).Value

任何想法如何解决这个问题将是最受欢迎的。

我也有我的表单这个问题,对我来说最好的方法是像这样格式化文本框:

sDate = format(SourceSheet.Range("AB" & CurRow.Row).Value, "mm/dd/yyyy") 

尽pipeVBA中的date格式是错误的,但它似乎在Excel中正确运行。 这很奇怪,我不能解释为什么会发生,但是这为我解决了这个问题。 每当我从VBA到Excel,我几乎总是发现这个问题,如果价值被存储为一个date。

考虑:

 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 

我的这个问题 – .NumberFormat有时会返回错误的值与date和时间 – 给出一些可能有所帮助的背景。

我多年前第一次遇到这个VBA bug,看起来比它糟糕。 我注意到很多 – 但不是全部 – 在一个工作表中的date,我已经更新了一年是错误的。 我花了很长时间来诊断问题。 那些可以解释为中间date的date已经被破坏了,但那些不能被解释为中间date的date没有改变。 所以2014年6月12日将成为12月6日,但13/06/2014将保持6月13日。 如果2014年6月13日作为无效date被拒绝或留作string,我会立即发现错误。 所以每一个date的双重解释被导入为一个date – 错误的date,但仍然是一个date – 确保我没有注意到,直到很久以后,最大限度地纠正错误的成本。

Excel将date和时间保存为数字。 “2014年6月17日”为41807,“1900年1月1日”为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格式的转换时遇到此错误。 我还没有发现从date到string的转换错误的情况。 这是从string到date的转换,击中这个错误。

我可以看到,SilverShotBee的解决scheme将避免该错误,但它不会吸引我。 我不再使用任何模棱两可的date。

一种select是将数值转换为数字。 如果单元格A3包含date和时间“2014年6月17日9:00”,则CDbl(Range("A3").Value)返回41807.375。 当你将这个数字存储在一个单元格中时,你将需要将单元格的NumberFormat设置为你select的date格式,但这可能是一件好事。

如果我要使用中间的date,我会明确的。 #13/06/2014#总是被解释为中端。

我更喜欢毫不含糊的string。 “2014-06-13”或“2014年6月13日”不会被VBA或读者误解。

刚刚拿出来反对这个问题! 从.csv读取logging并存储在.xls中

我发现以下顺序可以解决错误的date:

  1. 从.csv文件中读取date字段
  2. 将其存储到.xls文件中的单元格中
  3. 读回到vba
  4. 将其存储到.xls所需的目标中

date是原始格式

我发现这个问题非常复杂,试图尽可能简单,但确实留下了一些重要的细节! 道歉。 这里是我发现的更全面的版本:

首先,我应该解释我正在阅读.csv中的date(和其他字段)并将其存储回.xls

我在Windows / 7上运行的Office 2002上

使用2个示例date:27/4/2015和7/5/2015,以dd / mm / yyyystring格式(来自csv)

我发现的是:

将csv中的27/4/2015文本date字段读入尺寸为STRING的variables,并以dd / mm / yyyy DATE格式存储到xls字段中,将生成一个读取27/4/2015的单元格,但会将其转换为单元格,格式为数字也产生27/4/2015。 7/5/2015另一方面产生一个string,读取7/5/2015并将其转换为数字格式化为单元格产生42131。

将csv中的27/4/2015文本date字段读入一个无标记的variables,并以dd / mm / yyyy DATE格式存储到xls字段中,生成一个读取27/4/2015的单元格,但将其转换为格式为Number的单元格产生27/4/2015,而7/5/2015读取5/7/2015,并将其转换为格式为Number的单元格产生42190。

将csv中的27/4/2015文本date字段读入尺寸为DATE的variables,并以dd / mm / yyyy DATE格式存储到xls字段中,从而生成一个单元格,其格式为27/4/2015,并将其转换为格式为数字产生42121. 7/5/2015另一方面产生一个string,读取5/7/2015并将其转换为一个单元格格式化为数字产生42190。

因此,以上前三种情况并不能产生所有date规格的预期结果。

要解决这个问题,我做了以下几点:

 Input_Workbook.Activate ilr = Range("A5000").End(xlDown).End(xlDown).End(xlDown).End(xlUp).Row For i = 1 To ilr Input_Workbook.Activate If IsDate(Cells(i, 1).Value) Then d1 = Cells(i, 1).Value d1 = Replace(d1, "/", "-") ThisWorkbook.Activate Cells(14, 5).Value = d1 d1 = Cells(14, 5).Value If VarType(d1) = vbString Then d1 = CDate(d1) End If Cells(i, 1).Value = d1 End If Next 

最初用于存储date的单元格格式为GENERAL,最终的目标单元格格式为DATE(dd / mm / yyyy)。

我没有足够的脑细胞来完全解释在这个过程中发生的date会发生什么,但它对我来说很有效,当然在上面的代码块中目标细胞的select是完全随机的。