简单的任务,混乱的替代结果。
我正在使用以下方法复制一系列数据:
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不起作用)
答案 0 :(得分:1)
简而言之:类型转换(首先在工作表上造成问题之前修改值)绝对是最好的方法。
长期:
让我们从这两个值开始:
22.05.2017 12:00
22.05.2017 12:00
我会将第一个放在A1
中,将第二个放在B1
中。请注意,Excel通常会尝试进行类型转换,因此在这种情况下,我会手动强制A1
通过在事后格式化单元格来包含文本值。
使用立即窗口,我们可以看到编译器将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