DateValue 将一些日期保留为字符串
DateValue is leaving some dates as strings
使用 Office 365 - 但一些用户通过旧版本访问文件。标准和系统日期格式为 DD/MM/YYYY。原始数据也格式化为这样。
我有一系列显示为日期的单元格,但有些单元格的格式为文本。
数据来自系统提取,所以我无法帮助它原来的格式。
我使用此数据使用 VBA 创建自动报告,但出于某种原因,DATEVALUE 似乎将一些日期保留为字符串。
我已经尝试用几种不同的方式对其进行编码,但无法让它的这一小块工作,而且我一直让单元格仍然是文本。
如果我在 sheet 中手动应用公式,它会起作用。我已经通过应用中断进行了检查,那行代码是 运行(即应该满足 IF 语句标准)。
由于代码将数据从一个 sheet 移动到另一个,我知道所有变量都是正确的,除此之外其他一切都完美无缺。
有关详细信息,请参阅下文:
代码:
If Replace(Field32, "/", "") <> Field32 Then
Field32 = DateValue(Field32)
End If
If Replace(Field34, "/", "") <> Field34 Then
Field34 = DateValue(Field34)
End If
我试过 CDate。我还尝试首先使用 Format(Field32, "dd/mm/yyyy") 格式化字段,我尝试了几种不同的方法来检查字段是否已经是日期。我尝试将所有内容转换为文本,然后将 DATEVALUE 应用于每一行,但没有用,只是获取了所有文本。我也尝试过将 DATEVALUE 应用于每一行,但似乎 DATEVALUE 根本不起作用,因为它没有 return 已经有日期的错误。我做错了什么?
代码执行后的数据:
如您所见,存储为文本的日期仍存储为文本,因此其他一些计算字段不起作用
将字段格式化为数字,以便清楚地看到哪些现在是日期:
例如:
Dim c As Range, arr
For Each c In Range("B25:B33").Cells
'if formatted as text and content looks like a date
If c.NumberFormat = "@" And c.Text Like "##/##/####" Then
arr = Split(c.Text, "/")
c.NumberFormat = "dd/mm/yyyy" 'set format *before* value
c.Value = DateSerial(arr(2), arr(1), arr(0))
End If
Next c
使用 Office 365 - 但一些用户通过旧版本访问文件。标准和系统日期格式为 DD/MM/YYYY。原始数据也格式化为这样。
我有一系列显示为日期的单元格,但有些单元格的格式为文本。 数据来自系统提取,所以我无法帮助它原来的格式。
我使用此数据使用 VBA 创建自动报告,但出于某种原因,DATEVALUE 似乎将一些日期保留为字符串。
我已经尝试用几种不同的方式对其进行编码,但无法让它的这一小块工作,而且我一直让单元格仍然是文本。
如果我在 sheet 中手动应用公式,它会起作用。我已经通过应用中断进行了检查,那行代码是 运行(即应该满足 IF 语句标准)。
由于代码将数据从一个 sheet 移动到另一个,我知道所有变量都是正确的,除此之外其他一切都完美无缺。
有关详细信息,请参阅下文:
代码:
If Replace(Field32, "/", "") <> Field32 Then
Field32 = DateValue(Field32)
End If
If Replace(Field34, "/", "") <> Field34 Then
Field34 = DateValue(Field34)
End If
我试过 CDate。我还尝试首先使用 Format(Field32, "dd/mm/yyyy") 格式化字段,我尝试了几种不同的方法来检查字段是否已经是日期。我尝试将所有内容转换为文本,然后将 DATEVALUE 应用于每一行,但没有用,只是获取了所有文本。我也尝试过将 DATEVALUE 应用于每一行,但似乎 DATEVALUE 根本不起作用,因为它没有 return 已经有日期的错误。我做错了什么?
代码执行后的数据:
如您所见,存储为文本的日期仍存储为文本,因此其他一些计算字段不起作用
将字段格式化为数字,以便清楚地看到哪些现在是日期:
例如:
Dim c As Range, arr
For Each c In Range("B25:B33").Cells
'if formatted as text and content looks like a date
If c.NumberFormat = "@" And c.Text Like "##/##/####" Then
arr = Split(c.Text, "/")
c.NumberFormat = "dd/mm/yyyy" 'set format *before* value
c.Value = DateSerial(arr(2), arr(1), arr(0))
End If
Next c