2017-06-30 146 views
0

简单的任务,令人困惑的替代结果。Excel VBA日期复制不同,没有明显的原因?

我使用复制的数据范围:

WS.Range("A2:Z" & lRow).Copy 
ThisWorkbook.Worksheets("Import").Range("A2:Z" & lRow).PasteSpecial xlPasteValues 

从复印纸的第一列是在格式12/05/2017 01:00:00一个日期(注意在日期和时间之间的双空间)

在这个日期值的一个实例粘贴在罚款并作为日期出来 - 太棒了!

在这个日期值的另一个实例粘贴,但出来作为14/05/2017 01:00,这些不注册为日期,而是作为文本字符串。

我注意到我可以通过单元格的日期和按回车转换它们到日期,所以我尝试使用.range("A1:A100").value = .range("A1:A100").value无济于事。

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

+0

只是出于好奇,什么都在你的电脑设置您的区域设置短/长日期? – Busse

+0

短日期设置为dd/MM/yyyy,长日期设置为dd MMMM yyyy – jamheadart

回答

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

+0

感谢您提供这样一个健康和简洁的答案!我将在周末将其应用到我的工作表中,看看它是如何运行的,但这看起来很有希望。 – jamheadart

相关问题