Excel 2010 VBA工作表副本重新格式化日期(非美国格式:即dd / mm / yyyy)

时间:2013-08-05 07:36:54

标签: excel-vba vba excel

我正在尝试将整个工作表或一系列数据从一个工作簿复制到另一个工作簿。我可以手动成功完成此操作,方法是选择包含数据的所有单元格并粘贴到新创建的工作表中(维护日期格式)。但是,当我尝试通过VBA执行此操作时,任何日期大于12的日期都会转换为文本[US(m / dd / yyyy)/ Australian(dd / mm / yyyy)格式更改]。我已经尝试将这些单元格首先格式化为美国格式日期,但这并没有帮助。任何sugestions?

仅供参考 - 源数据来自VBA打开的CSV文件 - 日期值为文本(例如" 2/08 / 2013"或" 31/07 / 2013")在打开时自动转换为日期(IsNumber = True和IsText = False)。

打开时的CSV看起来像这样(3000多行的样本): 请注意"日期"和"上次更新"字段为dd / mm / yyyy hh:mm格式

Id          Title     Division  Status  Date                Last update
REQ:7619    Job Details ICTIS   InProg  31/07/2013 13:03    6/08/2013 15:51
REQ:7617    Job Details ICTIS   InProg  31/07/2013 12:06    2/08/2013 11:34
REQ:6994    Job Details ICTIS   Open    31/07/2013 12:05    31/07/2013 12:05
REQ:7613    Job Details MNHD    User    31/07/2013 12:01    1/08/2013 15:59
INC:79210   Job Details ICTIS   Open    31/07/2013 12:00    31/07/2013 12:00

简单的代码摘录:

'Select all Data Cells
Sheets(1).Cells(1, 1).Activate
ActiveCell.SpecialCells(xlLastCell).Select
LastRow = ActiveCell.Row

'Format Date Fields to avoid automatic translation issue
'This does not help problem... so commented out
'Columns("M:M").Select
'Selection.NumberFormat = "m/d/yyyy"

'Select all data in sheet and copy
range("A2:" & LastCol & LastRow).Select
selection.Copy

'Rest of code moves to previous sheet and copies into cell A8
运行上面的代码后

相同的文件。 请注意,日期> 12的日期与日期< = 12的日期不同。 2013年7月31日已经" PM"添加,而2013年6月8日和2013年2月8日有交换日期和月份!

Id          Title     Division  Status  Date                Last update
REQ:7619    Job Details ICTIS   In Progress 31/07/2013 1:03:49 PM   8/06/2013 15:51
REQ:7617    Job Details ICTIS   In Progress 31/07/2013 12:06:31 PM  8/02/2013 11:34
REQ:6994    Job Details ICTIS   Open    31/07/2013 12:05:50 PM  31/07/2013 12:05:50 PM
REQ:7613    Job Details MNHD    With User   31/07/2013 12:01:46 PM  8/01/2013 15:59
INC:79210   Job Details ICTIS   Open    31/07/2013 12:00:52 PM  31/07/2013 12:00:52 PM

我的快速解决方法是将代码分成两部分 - 由MsgBox提示手动复制/粘贴。不是很优雅!!并容易出错。

3 个答案:

答案 0 :(得分:3)

过去我遇到过完全相同的问题。我可以确认使用宏打开CSV时出现问题 - 当运行vba excel默认使用美国日期格式打开时,而当手动打开CSV时,它使用您的本地日期格式。不需要任何解决方法的简单修复是指示VBA使用您的本地日期格式打开CSV,如下所示。

我破码的相关部分:

Set wbkData = Workbooks.Open(strDataDir & strDataFName)

固定线路:

Set wbkData = Workbooks.Open(strDataDir & strDataFName, local:=True)

答案 1 :(得分:0)

Excel使用您的默认系统格式来确定在单元格中键入日期时如何解释日期。在美国,如果您输入“3/2/2013”​​,它会将其解释为3月2日。在澳大利亚,它将解释与2月3日相同的击键。更改单元格格式与您发现的没有任何区别。

当您复制与您的系统格式不兼容的日期时,将发生转换为文本(例如,月份为20)。我真的认为问题实际上是在您打开CSV文件时发生的。

如果问题出在复制操作中,您可以在使用之前将日期转换为文本。 =Text(a1, "m/d/yyyy")

编辑:必须是一个工作簿采用美国格式,另一个是澳大利亚格式。我对发生的事情有一些想法,但我不能肯定地说。确保在同一个Excel实例中打开两个工作簿。如果您的代码打开了两个工作簿,那么它应该不是问题。检查任务管理器进程列表以确保Excel.exe仅出现一次。

此外,我不确定您的代码是否意外导致重新计算,并且可能以某种方式导致问题。此代码应修复:

'get source worksheet
Dim ws As Worksheet
Set ws = Sheets(1)
ws.Activate

'copy all but first row
Call ws.UsedRange.Offset(1, 0).Resize(rowsize:=ws.UsedRange.Rows.Count - 1).Copy

'activate second sheet
Dim wsDest As Worksheet
Set wsDest = Sheets(2)
wsDest.Activate
wsDest.Paste

'de-activate copy mode
Application.CutCopyMode = False

此外,您可以使用代码编辑器窗口逐步执行代码(按F8)以确切地查看导致数据更改的行。

答案 2 :(得分:0)

在这个答案中,我描述了实现您描述的错误的两种方法。如果其中一种方法与您正在进行的操作相匹配,则可以修改代码以避免错误。如果这还不够,那么在我建议补救之前,我需要查看更多代码。您可以将完整的代码添加到您的答案中,或者您可以使用我的个人资料中的地址通过电子邮件发送给我。

我花了很多实验去复制你的错误,但我现在可以通过两种方式实现日期到中间格式的损坏。 (中端似乎是m / d / y日期格式的首选学术描述,d / m / y和y / m / d格式称为小端和大端。)

问题在于,Excel总是有几种方法可以达到同样的效果。这里的效果是将字符串转换为日期。

方法1是使用国家/地区代码来确定本地日期格式。如果您居住的地方日期格式为d / m / y,那么使用此方法“06/08/2013”​​将转换为“2013年8月6日”。

方法2是使用Excel默认日期格式,在英国,澳大利亚和许多其他国家/地区是“* dd / mm / yyyy”但是如果你要求VBA代表对应于“* dd / mm / yyyy”的NumberFormat,你是给出“m / d / yyyy”。方法2将“06/08/2013”​​转换为“2013年6月8日”。我的问题更详细地解释了这一点:.NumberFormat sometimes returns the wrong value with dates and times

如果您导入CSV文件并将日期/时间列的格式指定为“常规”,则它将使用方法1.要破坏该日期,您需要使用以下代码移动它:

Dim CopyDate As String
CopyDate = Cell1.Value
Cell2.Value = CopyDate          ' This uses Approach 2

如果导入CSV文件并将日期/时间列的格式指定为“文本”,则会将值保留为文本。如果使用导致Excel评估文本的方法移动该文本值,它将使用方法2将其转换为日期。

希望这有帮助。