2012-03-08 24 views
5

Ho qualche problema durante l'apertura di un file .csv a livello di codice. Il file è una serie temporale di dati giornalieri, con diversi punti dati associati a ciascuna data.I formati/i valori della data VBA di Excel cambiano quando il file viene aperto in modo programmato

Quando si apre manualmente il file, le date si aprono correttamente, come il formato della data dd/mm/yyyy. Tuttavia, quando apro il file a livello di programmazione, le date fino al 12 di ogni mese vengono aperte come mm/dd/yyyy, sebbene il formato rimanga dd/mm/yyyy (ad esempio, il 1 luglio 1983 (1/7/1983), verrà aperto come il 7 di Gennaio 1983 (7/1/1983) - questo non è solo un problema di formattazione, anche la data giuliana (giorni dal 1 gennaio 1901) associata a queste date cambia) e le date successive al 12 di ogni mese vengono aperte correttamente, anche se come testo piuttosto che come data.

I dati che arrivano come testo non sono un problema, tuttavia, le date che cambiano non appena il file viene aperto è problematico. Potrei provare a importare l'intero file .csv come testo delimitato da virgole piuttosto che aprire effettivamente il file, tuttavia sarebbe più facile e veloce se potessi impedire che le date cambino quando apro il file.

Qualcuno ha avuto un problema simile a questo in passato? Qualunque consiglio su questo sarebbe molto apprezzato.
Cheers, Ben.

Flder = InputBox("Copy and Paste Folder path here:") 

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set SourcePath = FSO.GetFolder(Flder) 

For Each File In SourcePath.Files   
    Workbooks.Open (File) 

    FlNm = File.Name 

    StrtCol = Workbooks(FlNm).Worksheets(1).Range(Cells(4, 1), Cells(4, 30)).Find ("Mean").Column 

    Workbooks(FlNm).Worksheets(1).Range(Cells(1, 1), Cells(60000, 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("A3")) 
    Workbooks(FlNm).Worksheets(1).Range(Cells(1, StrtCol), Cells(60000, StrtCol + 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("B3")) 

    Workbooks(FlNm).Close 
Next 

Il problema sembra verificarsi nella riga Workbooks.Open (File). Scusa per non averlo buttato via per cominciare.

+0

È possibile definire "open programmatically"? Intendi tramite l'automazione di Excel? O direttamente nel codice VBA? Non c'è modo di "aprire il file" potrebbe modificare qualsiasi contenuto; è qualcosa di diverso da quello, ma non hai pubblicato nulla di pertinente nella tua domanda. L'apertura di un file .csv non fa nulla per modificare il contenuto di per sé (ad esempio, in Blocco note); pubblica del codice o altre informazioni che mostrano come lo stai leggendo e cosa stai facendo con il testo che leggi. Altrimenti, sospetto che la tua domanda verrà chiusa come "non una vera domanda". :) –

+0

Ci scusiamo per la mancanza di chiarezza su quello Ken, codice qui sotto. –

+0

Sono d'accordo con Ken qui. C'è una causa sottostante. Che aspetto ha il file nel blocco note a quel punto, come stai aprendo il file? Viene inserito in un modello. Incollato? – datatoo

risposta

0

Potrei provare a importare l'intero file .csv come testo delimitato da virgole piuttosto che in realtà l'apertura del file, tuttavia, sarebbe stato più facile e più veloce se ho potuto fermare le date di cambiare quando apro il file.

E 'ancora veloce se lo si apre come CDT. È sufficiente utilizzare .OpenText anziché .Open. Il resto del codice rimane lo stesso :)

Prova a registrare una macro e vedrai che il codice è simile a questo.

Workbooks.OpenText Filename:= File, _ 
Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ 
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ 
Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _ 
TrailingMinusNumbers:=True 
+0

La mia esperienza è OpenText non funziona se le date non sono formattate mdy – user2981639

+0

No. Ma puoi imporre l'importazione ** come testo **, manipola il testo per avere il formato corretto non ambiguo (ISO preferibile, che è YYYY-MM -DD) e applicare CDate su tale stringa manipolata. – Ister

4

Dato che la questione è già stata risolta dal PO nei commenti, ma non inviato come una risposta ufficiale metto qui nel caso in cui qualcun altro manca è come ho fatto io.

workbook = workbooks.Open(filename, Local:= true) 

Impostando locale = true utilizza il formato di macchine data locale piuttosto che assumere mdy così in luoghi come l'Australia (DMY) che cambierà il comportamento di Open()

0

ho scoperto che aveva user2981639 l'idea giusta, ma ho un errore di sintassi con 'Local: true' quindi Ho usato 'local: = True' invece

Questo problema mi stava facendo impazzire perché avevo anche 2 campi memo nel file csv. Se provassi a formattare le date in qualsiasi modo che i campi memo non importassero correttamente, sarebbero troncati a 255 caratteri o qualsiasi carattere CRLF incorporato ridurrebbe il record in pezzi a seconda di quanti ce ne fossero.

Grazie ragazzi per la pubblicazione

+0

Grazie, ho corretto la mia sintassi – user2981639

0

Qui, si vede un codice di lavoro con l'esempio. Questo problema mi ha frustrato per un po '. Stavo aprendo un file .txt in excel e la data in cui avevo usato era la conversione da gg-mm-aaaa al formato mm-gg-aaaa. Sotto vedi una soluzione. Si trova nell'ultimo comando (, Local: = True). Vedi sotto. Spero che sia d'aiuto.

Note that while trasferring .txt file to excel use File Origin as "xlWindows: 
    Workbooks.OpenText Filename:= _ 
    ThisWorkbook.Worksheets("Reporting").Cells(3, 6), Origin:=xlWindows, _ 
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(49 _ 
    , 1), Array(50, 1), Array(67, 1), Array(80, 1), Array(93, 1), Array(106, 1), Array(119, 1)) _ 
    , DecimalSeparator:=",", ThousandsSeparator:=".", TrailingMinusNumbers:= _ 
    True, Local:=True 

NOTA: riposo sopra le impostazioni per array e separatore decimale sono il mio lavoro specifico - potrebbe non essere applicabile a voi.

Problemi correlati