Excel VBA:即使设置了日期格式,日期也显示为文本

时间:2013-11-07 20:02:54

标签: excel-vba vba excel

Excel 2010 Pro。

我遇到了一个奇怪的格式化问题。

它在美国运行正常,但在我在奥地利运行代码之后却没有。 在奥地利,它忽略了我的日期和时间格式。之后我甚至不能手动改变它。 看看我如何尝试不同的格式,顶部的样本没有改变?

单元格值包含整个日期和时间非常重要,但要使用所需的时间和日期格式。

更新了14Nov13:该问题在其他网站上有所描述,认为日期不知何故被“卡住了文本”,无法重新格式化为其他任何内容。一个建议是对单元格做一些数学操作,强制它回到非文本。 (想法:range.value = cdate(range.value)+ 0)我仔细观察了我在奥地利的牢房,注意到日期和时间之间有两个空格,如14.11.2013 15:22:19。在一个案例中,我删除了其中一个空格,并按照我想要的格式(14-NOV-13)。但是,我无法重复这一点,并且必须弄清楚如何以编程方式执行某些操作。我还不确定正确的解决方案。在粘贴我的变体数组后,它可能会涉及在所有日期单元格中循环,并以某种方式修复它们。

BAD(奥地利)

The Sample Won't Change Even if I Select DIfferent Formats

好(美国)

enter image description here

更多细节: 在我的应用程序中,我通过数组向两个单元格写日期,然后使用两种自定义日期格式之一格式化它们。我检查时单元格格式是正确的。当我查看美国的工作表时,它是正确的,如:

  • A1显示01-DEC-13'英文
  • B2显示15:23

然后我将XLSM复制到奥地利的服务器并打开它。看起来很正确。

  • A1显示01-DEZ-13'德语
  • B1显示15:23

然后我运行我的代码,将新数据写入这些时间字段并对其进行格式化。这会让我在奥地利看到的东西变得混乱,但在美国则不然。

  • A1显示01.12.2013 15:23'正确值,格式错误
  • B1显示01.12.2013 15:23'正确值,格式不正确

我进行了调试,直到找到导致问题的部分,即从数组中将数据写入工作表时。在调试中,我可以看到当我复制数组时,所有格式都会丢失。没关系。

Set Destination = myWS.Range("A" & lFirstRow)
Destination.Resize(UBound(arrIn, 1), UBound(arrIn, 2)) = arrIn

然后我运行一个重新格式化该区域的例程。

If not bFormatWorksheet(myWS) then err.Raise glHandled_Error

在此例程中,我尝试了两种方法之一来纠正问题。首先,我尝试从隐藏的模板中复制我想要的格式。

myWS.Rows(lFirstRow & ":" & lLastRow).ClearFormats
wksTemplate.Rows(giHEADER_ROW + 1).Copy
myWS.Rows(lFirstRow & ":" & lLastRow).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                                                   SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

在我的美国版本上,这会产生正确格式化的单元格。例如

  • A1.Value = 12/5/2013 05:00:45
  • B1.Value = 12/5/2013 05:00:45
  • A1表示05-DEC-13'DD-MMM-YY正确
  • B1表示05:00'HH:MM Correct

同样,当我在奥地利打开文档时它看起来没问题,但是在我运行任何更新代码之后它没有。

在奥地利运行更新代码后,我看到了:

  • A1.Value = 12/5/2013 05:00:45
  • B1.Value = 12/5/2013 05:00:45
  • A1显示= 12/5/2013 05:00:45
  • B1显示= 12/5/2013 05:00:45

如果我检查NumberFormat ......

  • ?范围( “A1”)。NumberFormat的
  • DD-MMM-YY
  • ?范围( “B2”)。NumberFormat的
  • HH:MM

如果我右键单击每个单元格以检查格式,我看到......

  • A1格式TT-MMM-JJ'正确用于Tag,Monat,Jahr
  • B1格式hh:mm'正确

由于那不起作用,我进入并明确地重新格式化每个循环中的单元格如下:

for i = lFirst to lLast
  myWS.Range("A" & i).numberformat = "DD-MMM-YY"
  myWSRange("B" & i).numberformat = "HH:MM"
next i

这没有帮助。

想法?

由于 斜里

2 个答案:

答案 0 :(得分:3)

我终于弄明白了。在互联网上阅读了几个小时后,我得到了一个线索,这使我得到了这个解决方案。这是一种伏都教而且没有多大意义,但它解决了我的问题。

在格式化例程开始时,我从模板中复制一个格式化的行。这在美国逗留期间运作良好,但在奥地利描述失败。

然后我将日期重新格式化添加到格式化例程的末尾,如下所示。这解决了这个问题。

   For i = lFirstRow To lLastRow
        With myWS
                ' The following line didn't work 
                '    (where gsDATE_DISPLAY_FORMAT = "DD-MMM-YYYY")
                '.Cells(i, pstColNum.cre_eta).NumberFormat = gsDATE_DISPLAY_FORMAT

                ' The following two lines work.  I don't know why, but they do.
                ' You must have the + 0!  That is the key!
                dDate = CDate(.Cells(i, pstColNum.cre_eta)) + 0
                .Cells(i, pstColNum.cre_eta) = dDate
        End With
    Next i

答案 1 :(得分:1)

我不想肯定地说存在VBA解决方案,因为它可能只是软件的本地化问题......但也许您可以通过明确剥离日期/时间的不需要的部分来解决问题在格式化之前从每个单元格。像

这样的东西
myWS.Range("A" & i).value = Format(myWS.Range("A" & i).value,"DD-MMM-YY")
myWS.Range("A" & i).numberformat = "DD-MMM-YY"
myWS.Range("B" & i).value = Format(myWS.Range("B" & i).value,"HH:MM")
myWSRange("B" & i).numberformat = "HH:MM"

这实际上可能无法修复格式化,实际上可能导致字段在格式错误时报告错误信息(例如A1和'12 / 30中的'12 / 5/2013 00:00:00' / 1899 05:00:45'在B1),但我会尝试一下,看看会发生什么。您可能希望忽略将其格式化为一个数字,并将其保留为格式化字符串。这当然取决于理解没有其他代码要求时间在A列中保留,并且日期保留在B列中。如果有,那么这不是一个合适的解决方案。