Excel 2010 Pro。
我遇到了一个奇怪的格式化问题。
它在美国运行正常,但在我在奥地利运行代码之后却没有。 在奥地利,它忽略了我的日期和时间格式。之后我甚至不能手动改变它。 看看我如何尝试不同的格式,顶部的样本没有改变?
单元格值包含整个日期和时间非常重要,但要使用所需的时间和日期格式。
更新了14Nov13:该问题在其他网站上有所描述,认为日期不知何故被“卡住了文本”,无法重新格式化为其他任何内容。一个建议是对单元格做一些数学操作,强制它回到非文本。 (想法:range.value = cdate(range.value)+ 0)我仔细观察了我在奥地利的牢房,注意到日期和时间之间有两个空格,如14.11.2013 15:22:19。在一个案例中,我删除了其中一个空格,并按照我想要的格式(14-NOV-13)。但是,我无法重复这一点,并且必须弄清楚如何以编程方式执行某些操作。我还不确定正确的解决方案。在粘贴我的变体数组后,它可能会涉及在所有日期单元格中循环,并以某种方式修复它们。
BAD(奥地利)
好(美国)
更多细节: 在我的应用程序中,我通过数组向两个单元格写日期,然后使用两种自定义日期格式之一格式化它们。我检查时单元格格式是正确的。当我查看美国的工作表时,它是正确的,如:
然后我将XLSM复制到奥地利的服务器并打开它。看起来很正确。
然后我运行我的代码,将新数据写入这些时间字段并对其进行格式化。这会让我在奥地利看到的东西变得混乱,但在美国则不然。
我进行了调试,直到找到导致问题的部分,即从数组中将数据写入工作表时。在调试中,我可以看到当我复制数组时,所有格式都会丢失。没关系。
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
在我的美国版本上,这会产生正确格式化的单元格。例如
同样,当我在奥地利打开文档时它看起来没问题,但是在我运行任何更新代码之后它没有。
在奥地利运行更新代码后,我看到了:
如果我检查NumberFormat ......
如果我右键单击每个单元格以检查格式,我看到......
由于那不起作用,我进入并明确地重新格式化每个循环中的单元格如下:
for i = lFirst to lLast
myWS.Range("A" & i).numberformat = "DD-MMM-YY"
myWSRange("B" & i).numberformat = "HH:MM"
next i
这没有帮助。
想法?
由于 斜里
答案 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列中。如果有,那么这不是一个合适的解决方案。