Excel VBA日期复制不同没有明显原因?

时间:2017-06-30 11:12:43

标签: excel-vba vba excel

简单的任务,混乱的替代结果。

我正在使用以下方法复制一系列数据:

12/05/2017  01:00:00

副本表中的第一列是14/05/2017 01:00格式的日期(注意日期和时间之间的双倍空格)

在这方面的一个例子中,日期值被贴在罚款上并作为日期出来 - 很棒!

在另一个例子中,日期值被粘贴但是以.range("A1:A100").value = .range("A1:A100").value形式出现,并且这些日期值不是作为日期注册,而是作为文本字符串注册。

我注意到我可以逐个单元格查看日期并按回车键将其转换为日期,所以我尝试使用{{1}}无效。

我怀疑它可能与日 - 月 - 年格式有关,而不是月 - 日 - 年(因为它适用于从12月5日开始而不是14日可能的表)但是( 1)可能存在另一个区别,(2)为什么按ENTER键工作正常;(3)如何在我的整个单元格范围内模拟按ENTER键(记住.value = .value不起作用)

1 个答案:

答案 0 :(得分:1)

简而言之:类型转换(首先在工作表上造成问题之前修改值)绝对是最好的方法。

长期:

让我们从这两个值开始:

22.05.2017 12:00
22.05.2017  12:00

我会将第一个放在A1中,将第二个放在B1中。请注意,Excel通常会尝试进行类型转换,因此在这种情况下,我会手动强制A1通过在事后格式化单元格来包含文本值。

让我们核实一下:
enter image description here

使用立即窗口,我们可以看到编译器将A1的内容识别为纯文本值,同时将B1中的内容识别为日期值。

您需要的解决方案是确保将任何文本值转换为日期值:

Option Base 1

Sub pasteTextAsDate()
    Dim dateArr As Variant
    Dim rng As Range

    Set rng = ThisWorkbook.Worksheets(1).Range("A1:A3")

    ' In the line below, we fill the variant variable with the content of the range, casting the variable into an array of variants
    dateArr = rng

    ' For the sake of proving this code works, we'll start by printing the content and what type it is
    For Each s In dateArr
        Debug.Print s & " - " & TypeName(s)
    Next s

    For i = 1 To UBound(dateArr)
        ' This is where we loop through the array and cast any string values to date values
        dateArr(i, 1) = CDate(dateArr(i, 1))

        ' Here we verify for ourselves that the conversions are OK
        Debug.Print dateArr(i, 1) & " - " & TypeName(dateArr(i, 1))
    Next i

    ' And here we print the result to the worksheet
    ThisWorkbook.Worksheets(1).Range("C1:C3").Value = dateArr
End Sub

结果:enter image description here