完全按照显示复制/粘贴日期?不一定是格式,但因为它们在视觉上显示

时间:2017-07-13 22:51:41

标签: excel excel-vba vba

我似乎无法弄清楚如何用显示来覆盖我的约会对象。

例如,显示的内容为06/01/2016,但其背后的实际数据显示为01/06/2016。我希望在那里的日期是2016年6月1日(这是显示的内容)。更改单元格的格式并没有帮助,因为我稍后会使用日期做一些公式,所以实际上需要让Excel具有正确的日期。

我有大约10,000个这样的日期,其中显示日期正是我想要的,但实际公式"反转"。

基本上,我希望只复制那个将单元格显示的内容放入单元格中的列(或运行一个子列)。

enter image description here

这是做什么工作的,但它只适用于那些带有"向后"约会...基本上将一天当作一个月,将月份作为一天。

=DATE(YEAR(C1),DAY(C1),MONTH(C1))

它"崩溃"虽然日期实际上是正确的,但我不想让它改变:

enter image description here

所以,最好的是用字面覆盖显示的内容。

或者,IF语句是什么,我可以用来以某种方式检查显示的日期是否是我想要的,如果是,请保留,否则使用{{1} "技巧"?

我也尝试了=DATE(YEAR(),DAY(),MONTH()),但这不起作用,因为它为=IF(DAY(C2)>12,DATE(YEAR(C2),DAY(C2),MONTH(C2)),C2)June 01 2016都返回01/06/2016

我可能会忽略一些简单的事情,我已经盯着这个一个小时左右......任何想法/想法都会受到赞赏!

3 个答案:

答案 0 :(得分:1)

假设从 C1 C100 的列 C 中的日期似乎是正确的。 (所以如果你看到06/12/2017你希望它是6月12日 th 而不是12月6日 th

试试这个短宏:

Sub dateFixer()
    Dim ary(1 To 100) As String
    Dim rng As Range, r As Range
    Dim i As Long
    Set rng = Range("C1:C100")

    i = 1
    For Each r In rng
        ary(i) = r.Text
        i = i + 1
    Next r

    rng.Clear
    rng.NumberFormat = "mm/dd/yyyy"

    i = 1
    For Each r In rng
        r.Value = ary(i)
        i = i + 1
    Next r
End Sub

答案 1 :(得分:1)

一个非常干净的解决方案是使用CELL()函数。

对于格式化为d / m / y的单元格,

=CELL("format",A1)将返回"D1",对于格式化为m / d / y的单元格,"D4"将返回=IF(CELL("format",A2)="D1",DATE(YEAR(A2),DAY(A2),MONTH(A2)),A2) 。因此,有了这个,您可以有条不紊地每月翻转:

skip

screen capture demonstrating the formula

答案 2 :(得分:1)

范围的Text属性返回显示文本:"单元格字面上显示的内容。"

请注意,文字是正确的词 - 例如,如果您的列太窄,Text将返回显示的#####字符,而不是任何有用的值。

Text属性不会返回数组,因此您必须遍历您的范围并使用以下内容读/写单个单元格:

For Each c in rng
    c.Value = c.Text
Next c

顺便提一下,此属性的文档几乎不存在。 This blog post会对该媒体及其与ValueValue2的关系进行更详细的审核。