2016-11-29 163 views
0

我是Excel VBA的完全新手。最近,我設法下面的宏安裝到我個人的工作簿,以便我可以導入CSV文件的一個按鈕,點擊(選擇必要的選項):通過宏導入CSV時的日期格式不一致

Sub OpenTextFile() 

    filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv") 
    If filetoopen = Null Or filetoopen = Empty Then Exit Sub 

    Workbooks.OpenText Filename:=filetoopen, _ 
    Origin:=65001, DataType:=xlDelimited, Comma:=True 

End Sub 

它的工作原理。但是,它並不一致。我將它用於不同的CSV文件(所有這些文件都是在ISO 8601日期系統中預先格式化的),但我得到了不同的結果。在其中一些日期輸出是DD/MM/YYYY hh:mm,但在其他人中,這是我不明白的東西(如00:00,0或50:00,0)。我可以手動選擇行內容並將格式更改爲長日期,所以至少我確信Excel可以將數據識別爲日期而不是文本。

我怎樣才能確保日期都格式化?這取決於什麼?

謝謝!

+0

聽起來像問題是與格式,而不是內容或導入。您可以擴展該宏以將日期格式應用於日期列。但要做到這一點,你需要一個系統來識別這些。所有的日期列都包含* date *的字段名稱嗎? –

回答

2

由於windows本地化(使用默認分隔符,日期和數字格式)很難處理,所以當導入到excel中時,不同的日期格式出了名。

不要亂搞windows本地化只是爲了導入一個文件。

當反覆導入CSV檔案,我用下面的辦法:

  1. 我建立schema.ini -file爲CSV檔案有問題。見this進一步信息

  2. 我要麼

    • 查詢的CSV文件,SQL和ADODB,它允許簡單SELECT *簡單的預處理(重新排序列,篩選記錄,...) 。我可以將生成的ADODB.Recordset輸出到我的工作簿中或者我在工作簿中設置了一個鏈接表ADODB.Connection。數據可以用一個簡單的宏或右擊來更新。

無論哪種方式:與schema.ini -files IMO工作具有以下優點

  • 讓你處理任何帶有日期和號碼的格式,而無需調整的Excel工作簿或VBA代碼
  • 簡單透明的結構,可讀
  • 一套設置。每個Excel表或數據庫都可以使用相同的schema.ini文件來處理您的數據。

編輯:這可以提供一個起點。

  1. 創建您存儲您的CSV
  2. 在記事本打開該文件夾名爲schema.ini一個新的文本文件(或更好:記事本+ +),粘貼到它

    [yourfile.csv] 
    CharacterSet = ANSI 
    ColNameHeader = FALSE 
    Format = Delimited(;) 
    DateFormat = "DD.MM.YYYY" 
    DateTimeFormat = "DD.MM.YYYY hh:nn,ss" 
    Col1 = yourdatefield DateTime 
    Col2 = somelongfield Long 
    
  3. 調整後如下讀enter link description here

    • 文件名
    • 格式(什麼分隔符,或者是固定的)
    • DateFormat和/或DateTimeFormat。意識到分鐘是nn而不是常見的mm
    • 您想要的列標題和列數據類型。你需要ColNameHeader = FALSE
  4. 在VBA中設置ADO連接,使您可以運行SQL語句並返回ADO記錄集。

  5. 運行的SQL語句像這樣的

    SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv

  6. 工作,記錄

注:你提到的一些混合時小數寫入(50:00,0)。只要列中的任何數字都指時間單位,例如幾秒或幾分鐘,宣佈字段DateTime-字段沒有問題。

不過:如果像00:00,50意味着半分鐘,而不是50秒時,可能需要閱讀文本,然後用SQL的東西轉換它像FORMAT()LEFT()在導入-SQL

+0

感謝您的意見。但我並不是在尋找最佳的工作流程,而是在導入時專門詢問通過VBA處理日期格式的可能性。 「數據源和文件連接」是我第一個和本能的方法。但這並不是我所需要的,因爲我需要的是能夠告訴我的部門同事「嘿,您可以單擊我安裝在功能區上的這個按鈕,並將您自己的數據 - >導入 - >從文本 - >分隔&UTF8->逗號「。我不想教他們Excel,只是幫助他們節省時間。 –

+0

完全有效的點,可以聯繫! –

0

解決:該問題不適用於Excel,而是使用爲我提供CSV文件的服務。顯然,他們有兩種選擇從他們的網站下載CSV,並且他們的日期格式不同。其中一個正確使用ISO-8601,但另一個在日期字符串末尾添加「.0」,因此Excel將其翻轉並將其視爲文本字符串。

無論如何感謝您的回覆。