2012-10-12 13 views
7

Attualmente mi trovo di fronte a un problema che mi preoccupa molto. Spero che qualcuno possa darmi una mano. Lavoro per una grande azienda in cui sono utilizzati Office 2007 (32 bit) e Office 2010 (64 bit). Scrivere dei macro per essere compatibili attraverso l'intera compagnia è stato un compito difficile per me (non ho mai programmato in VBA prima d'ora - in realtà questo forum mi ha aiutato molto). Il mio compito è di mantenere una grande tabella in un foglio Excel condiviso. Esistono diverse macro e diverse userform. Ora descriverò brevemente il problema: Foglio contiene due colonne con formato di data (data di inizio e data di chiusura). Entrambi i valori vengono importati nelle caselle di testo della forma utente della colonna (commandbutton preme MsCal -esportato in classe- che riempie quelle caselle di testo con data). Quello di cui ho semplicemente bisogno è di avere il formato della data come mm/gg/aaaa in entrambe le colonne per poter eseguire il filtraggio e altre operazioni. Quando questi valori vengono aggiornati da worker che utilizza una localizzazione diversa dalla data inglese degli Stati Uniti, viene immessa come gg.mm.aaaa. Questo rende impossibile il corretto filtraggio in base alla data. Ho provato a modificare la formattazione tramite:Stesso formato della data su più localizzazioni

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy") 

ma questo pezzo di codice si comporta in qualche modo. Su alcune macchine funziona, su alcune di esse non funziona. E questo è quello che mi sta facendo venire il mal di testa. Come dovrei procedere ora? C'è un modo per forzare Excel ad usare lo stesso formato data nel foglio e ignorare le impostazioni di localizzazione in Windows? I dipendenti non desiderano cambiare la localizzazione negli Stati Uniti d'America perché sono abituati al loro formato o ne hanno bisogno per altre applicazioni. C'è un modo per modificare temporaneamente la localizzazione solo quando questo foglio si apre? Qualsiasi consiglio sarà apprezzato. Grazie in anticipo Peter

+0

Una data in una cella di Excel deve essere una data e non una stringa. Se si imposta il formato della cella su un formato data preceduto da un asterisco * (che di solito è le prime 2 opzioni nell'opzione Formato celle/data), la data cambierà in base alla formattazione della data locale dell'utente. La cella sottostante tuttavia è ancora un numero datario che dovrebbe essere utilizzabile indipendentemente dal formato. Se è necessario inserire date in una casella di testo o convertire stringhe in date, si tratta di una questione diversa e è necessaria una gestione aggiuntiva. Vedi http://stackoverflow.com/questions/12495504/how-to-convert-a-string-into-date/12497237#12497237 – user3357963

+0

@PeterT. Nella tabella, la colonna delle date è formata come testo o come date? – CaBieberach

+0

Formato come data – PeterT

risposta

1

Il meglio che puoi fare è non trasformare MAI una variabile di data in Testo.

Internamente per Excel una data è solo un numero consecutivo (A partire dal separatore decimale sono giorni e a destra dal separatore decimale sono le ore). Ad esempio, 10 giugno 2012, per Excel è . Questo valore di data è indipendente dal formato data impostato sul tuo computer.

Ora quando si tratta di rappresentare le date (per consentire agli utenti di visualizzare), Excel formatterà questo valore interno in una stringa con il formato impostato nel computer. Ad esempio, se nel tuo computer hai un formato di data USA, la data 41188 sarà formata il 6/10/2012.

La grande sfida con le date è inserire la data nel formato corretto.Quando inserisci una data come stringa ("6/10/2012"), Excel la interpreterà in base al formato data impostato sul tuo computer. Se hai il formato USA, allora verrà visualizzato il primo cifrario come mese, il secondo come giorno e l'ultimo come anno. Se hai un formato tedesco, leggerà il primo come giorno, il prossimo come mese e l'ultimo come anno. Quindi, lo stesso input ("6/10/2012") per un formato Excel americano verrà letto il 10 giugno, mentre per un formato tedesco Excel leggerà il 6 di ottobre.

Nel tuo caso, NON devi formattare la data all'interno del Textbox10. Per un formato americano Excel non ci sono problemi, ma se hai un altro formato di data, dove il primo cifrario è il giorno invece del mese, otterrai i valori errati: Controlla questo esempio. input dell'utente 10 giugno in un formato Excel tedesco (gg.mm.aaaa)

  1. Calendar1.Value recupera un valore di data()
  2. Format(Calendar1.Value, "mm/dd/yyyy") trasforma il valore di data in una stringa "06/10/2012 "
  3. Quando si utilizza la data di formattazione (STRING), Excel dovrà interpretare la data. Poiché il formato della data del computer è il tedesco, verrà letto Giorno: 06, Mese: 10, Anno: 2012. Si prevede di utilizzare giorno invece di

Se Calendar1.Value recupera una variabile data e darvi questa variabile data in una colonna Data formattato, si allways ottenere la dale corretto nella colonna e vi essere in grado di filtrare e ordinare le date correttamente, indipendentemente dal formato data impostato all'interno delle celle della colonna o dal formato impostato nel computer degli utenti.


Ora, nel tuo caso, la cosa migliore sarebbe di assegnare direttamente il Calendar1.Value alla cella desiderata. Qualcosa di simile:

ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value 

È ancora possibile Asign Calendar1.Value nella TextBox10 per l'utente di vedere la sua selezione, ma disabilitare la TextBox10 in modo che l'unica opzione di modifica è il controllo calendario. E quando si lavora con la data, si inizia a vederlo dal TextBox10, prendendolo direttamente dallo Calendar1.Value.

Se è ancora necessario mostrare il valore selezionato da Calendar1 in una casella di testo, NON formattare la data nella casella di testo. Invece, l'uso:

UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

In questo modo, l'utente vedrà la data nel dateformat che egli ha messo nel suo computer e al quale è abituato.

+0

Grazie mille. Questo tipo di risposta che stavo cercando. – PeterT

0

Una soluzione è quella di non utilizzare il formato numero di data, ma piuttosto utilizzare solo il formato personalizzato per tutte le date delle cellule in cui si specifica "mm/dd/yyyy" come la stringa di formattazione. Tuttavia, secondo la mia esperienza, se le impostazioni internazionali del computer sono impostate per utilizzare "mm/dd/yyyy", se si tenta di creare una formattazione personalizzata della cella con la stessa stringa, excel si manterrà come un dater collegato alle impostazioni del computer in modo che non sia di aiuto. Il modo in cui ho lavorato su questo è stato quello di cambiare il formato della data sul mio computer, quindi formattare le celle come "mm/gg/aaaa" personalizzate e salvare (e quindi ripristinare le impostazioni del computer su come erano.) Ora anche se excel ancora afferma che sono celle di date, vedrai che la modifica delle impostazioni sul tuo computer non modifica il valore nella cella.

Immagino che un altro modo sia quello di avere sempre una cella accanto alla cella della data che chiama la funzione TESTO. Quindi se hai una data in A1 allora in un'altra cella =TEXT(A1, "mm/dd/yyyy") e fai riferimento solo a questa nuova cella. Ma questo potrebbe rendere il tuo foglio di lavoro molto disordinato.

Suppongo che la soluzione migliore sia quella di ottenere che il reparto IT imposti tutti gli elementi nelle impostazioni della data dell'azienda per utilizzare gli stessi formati.

+0

Dan, grazie per la risposta. Il fatto è che il cambiamento del formato delle celle in custom potrebbe causare il malfunzionamento di altre macro utilizzate per calcolare metriche, pivot, ecc. Questa macro richiede che il formato della cella venga impostato in data. Questa macro si svolge su un altro sito.Inoltre, l'intero file viene aggiornato in remoto su base debole dal programma, che imposta le celle che si configurano allo stato predefinito (impostato per programma). Se nulla aiuta, immagino che avrò bisogno di contattare l'ufficio IT come lei menziona. Ma ad essere onesti, vorrei evitare questo scenario. – PeterT

+0

Quindi, in conclusione, non posso modificare la tabella (aggiungi/rimuovi colonne/righe, cambia formato ecc.). Posso solo modificare il codice VBA che scrive i dati nella tabella. – PeterT

+0

cosa ne pensi: UserForm1.TextBox10.Value = Worksheetfunction.Text (Calendar1.Value, "mm/gg/aaaa") – Dan

Problemi correlati