0

我发现了许多类似的问题,但从来没有一个不包括蛮力重新设计的解决方案。

使用这个简单的子程序:

Sub readwrite()
    Dim arr As Variant
    Dim i As Long
    arr = Range("F2:F36").Value
    For i = LBound(arr) To UBound(arr)
        arr(i, 1) = CStr(arr(i, 1))
    Next i
    Range("G2:G36").Value = arr
End Sub

我从我的英国地区转换为美国日期格式,而不是这样:

正确的日期格式

我明白了:

不正确的混合日期格式

注释掉 Cstr 行得到第一个结果。添加行:

arr(i, 1) = FormatDateTime(arr(i, 1), 0)

在 Cstr 行之后没有解决问题,也没有使用 Value2。

我意识到我可以通过蛮力循环来解决这个问题,但是我的现实世界问题需要在 32 列和数百行中的两列中不可预知地混合日期和空白字符串,所以我需要一些不昂贵的东西。


蛮力方法是确保在尝试写出工作表之前完成从日期到字符串并再次返回的所有转换:

        arr(i, 1) = Format(arr(i, 1), "dd/mm/yyyy hh:mm")
        arr(i, 1) = DateValue(arr(i, 1)) + TimeValue(arr(i, 1))

正如我所说,这是可行且有效的,只是有点问题。


我会很感激任何建议。我是一名软件测试员,同时也是一名相当高级的编码员。

附录 - 我将 =G2-F2 放在 H 列中并得到: 日期的实际差异 这意味着这个日期处理错误会产生真正的后果。

4

2 回答 2

0

在将 Array 的值写入 Range 之前更改 Range 的 NumberFormat。

Range.NumberFormat

NumberFormat 代码

Range("G2:G36").NumberFormat = "d/m/yyyy hh:mm"

我从不在宏中使用复制和粘贴,但“蛮力”的“替代方法”是:

Range("F2:F36").Copy
Range("G2:G36").PasteSpecial Paste:=xlPasteValues
于 2020-12-13T14:38:50.063 回答
0

我通过确保数组在写入工作表时包含日期对象(在必要时)来解决了这个问题。这意味着确保每次将日期对象最终分配给所使用的数组

myarray(x,y) = datevalue(mydate)+timevalue(mydate)

因为即使 mydate 是一个日期对象,以任何其他方式将其分配给数组也会将其转换回字符串!

我有一个辅助问题,我正在使用

myrange.value = Application.Transpose(myarray)

Transpose 函数再次将日期对象转换为字符串对象,然后被赋值错误解释。我编写并使用了自己的转置函数。

如果 Microsoft 可以修复值分配中的错误并在处理不明确的日期字符串时采用本地格式,那对我来说会更简单。

于 2020-12-13T16:10:46.387 回答