0

Excel 2010 专业版。

我有一个奇怪的格式问题。

它在美国运行良好,但在我在奥地利运行代码之后就不行了。在奥地利,它忽略了我的日期和时间格式。在那之后我不能改变它,即使是手动的。看看如果我尝试不同的格式,顶部的示例不会改变?

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

2013 年 14 月更新:该问题在其他网站上进行了描述,认为日期以某种方式“卡在文本中”并且无法重新格式化为其他任何内容。一个建议是对单元格做一些数学运算以强制它返回非文本。(想法:range.value = cdate(range.value) + 0)我仔细查看了我在奥地利的单元格,发现日期和时间之间有两个空格,例如 14.11.2013 15:22:19。在一种情况下,我删除了其中一个空格,然后它变成了我想要的格式 (14-NOV-13)。但是,我无法重复这一点,并且必须弄清楚如何以编程方式做某事。我还不确定正确的解决方案。在我粘贴我的变量数组后,它可能会涉及循环遍历所有日期单元格,并以某种方式修复它们。

坏(奥地利)

即使我选择不同的格式,样本也不会改变

好(美国)

在此处输入图像描述

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

  • 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 正确

同样,当我在奥地利打开文档时它看起来不错,但在我运行任何更新代码后就不行了。

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

  • A1.Value = 12/5/2013 05:00:45
  • B1.Value = 12/5/2013 05:00:45
  • A1 显示 = 2013 年 12 月 5 日 05:00:45
  • B1 节目 = 12/5/2013 05:00:45

如果我检查 NumberFormat ...

  • ?Range("A1").NumberFormat
  • dd-mm-yy
  • ?Range("B2").NumberFormat
  • 小时:毫米

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

  • 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

这没有帮助。

想法?

谢谢莎莉

4

2 回答 2

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
于 2013-12-16T16:30:47.310 回答
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/5/2013 00:00:00' 和 '12/30/1899 05 :00:45' in B1),但我会试一试,看看会发生什么。您可能希望忽略将其全部格式化为数字并将其保留为格式化字符串。这当然取决于理解没有其他代码要求将时间保留在 A 列中而日期保留在 B 列中。如果有,那么这不是一个适当的解决方案。

于 2013-11-07T20:14:03.420 回答