簡體   English   中英

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

[英]Excel 2010 VBA sheet copy reformats dates (non US format: i.e. dd/mm/yyyy)

我試圖將整個工作表或一系列數據從一個工作簿復制到另一個工作簿。 我可以手動成功完成此操作,方法是選擇包含數據的所有單元格並粘貼到新創建的工作表中(維護日期格式)。 但是,當我嘗試通過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的日期不同。 31/7/2013添加了“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提示手動復制/粘貼。 不是很優雅!! 並容易出錯。

我過去遇到過完全相同的問題。 我可以確認使用宏打開CSV時出現問題 - 當運行vba excel默認使用美國日期格式打開時,而當手動打開CSV時,它使用您的本地日期格式。 不需要任何解決方法的簡單修復是指示VBA使用您的本地日期格式打開CSV,如下所示。

我破壞代碼的相關行:

Set wbkData = Workbooks.Open(strDataDir & strDataFName)

而固定線路:

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

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)以確切地查看導致數據更改的行。

在這個答案中,我描述了實現您描述的錯誤的兩種方法。 如果其中一種方法與您正在進行的操作相匹配,則可以修改代碼以避免錯誤。 如果這還不夠,那么在我建議補救之前,我需要查看更多代碼。 您可以將完整的代碼添加到您的答案中,或者您可以使用我的個人資料中的地址通過電子郵件發送給我。

我花了很多實驗去復制你的錯誤,但我現在可以通過兩種方式實現日期到中間格式的損壞。 (中端似乎是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有時會返回錯誤的值和日期和時間

如果導入CSV文件並將日期/時間列的格式指定為“常規”,則它將使用方法1.要破壞該日期,您需要使用以下代碼移動它:

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

如果導入CSV文件並將日期/時間列的格式指定為“文本”,則會將值保留為文本。 如果使用導致Excel評估文本的方法移動該文本值,它將使用方法2將其轉換為日期。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM