Come impedire ad Excel di utilizzare le impostazioni internazionali del sistema operativo per i modelli di data nelle formule


21

Secondo questa domanda ho il seguente problema:

Voglio usare alcune funzioni di Excel (non la formattazione della cella) come TEXT (A1, {date_pattern})

Ma la persona che risponde alla mia domanda precedente mi ha fatto scoprire che il modello di data cambia in base alle Impostazioni internazionali di Windows.

Tuttavia, il mio sistema operativo (Windows 7) è in inglese e anche nella suite Office. Guardando nelle mie Impostazioni regionali mostra anche uno schema usando la notazione inglese (gg.mm.aaaa)

Regione e lingua

Voglio sapere se esiste un modo per disabilitare tale comportamento da Excel, il che significa che voglio sempre usare i modelli inglesi e mai quelli localizzati perché non voglio che il comportamento del mio foglio Excel cambi in base alla localizzazione del lettore.

Un semplice caso potrebbe essere la riformattazione di un campo data in un modo incentrato sul computer in questo modo: "yyyymmdd_hhss" questo è riconosciuto universalmente e può essere ordinato su e giù facilmente. Ma dato che mi trovo nella parte francese della Svizzera, dovrei scrivere "aaaammjj_hhss" e se invio questo Excel a un collega di Zurigo, non sarebbe in grado di vedere la data corretta dato che ha ottenuto la localizzazione tedesca tedesca (il suo excel si aspetterebbe "jjjjmmtt_hhss")

Siamo stati abbastanza intelligenti da installare tutte le finestre e gli uffici in inglese, ma abbiamo ancora problemi come questo perché questo link alle impostazioni internazionali del sistema operativo.

Per me la modifica delle impostazioni di Windows non è un'opzione perché tutti gli altri programmi utilizzano queste impostazioni.


4
Non riesco a credere che questo sia stato anche affrontato su Excel. Con questo comportamento, il risultato del documento dipende totalmente dal computer che apre il file, modificando il contenuto del file in base al computer. Mi sono imbattuto in questo problema all'apertura di un file che utilizzava inizialmente le virgole (,) per i valori decimali in un computer utilizzando punti (.) E le formule davano risultati errati ...
AxeEffect,

Risposte:


26

Questa domanda è un po 'vecchia, ma ad oggi non sembra avere una risposta. Ho anche visto domande simili su un numero di siti, ma non ho ancora trovato alcuna risposta che coinvolga solo le funzioni di Excel integrate. Tuttavia, è abbastanza facile risolverlo con VBA. Non devi nemmeno sapere come programmare per farlo, perché la funzione richiesta è così semplice.

Con la tua cartella di lavoro aperta, premi semplicemente Alt + F11 (per aprire l'editor VBA) Quindi fai clic sulla voce di menu Inserisci > Modulo Nel nuovo modulo VBA, inserisci quanto segue:

Public Function FMT$(ByVal Value, ByVal strFormat)
    FMT = VBA.Format$(Value, strFormat)
End Function

Quello che fa è semplicemente usare la Formatfunzione di VBA anziché la funzione di Excel TEXT. Questo è esattamente quello che vuoi.

Questa nuova funzione formatterà qualsiasi data (o numero) in base alla stringa di formato specificata. Interpreterà la stringa di formato usando la notazione standard ( en-US ), indipendentemente dalle impostazioni internazionali del sistema operativo.

Per usarlo nella tua cartella di lavoro, digita semplicemente =FMT(A1, "yyyymmdd_hhss")invece di =TEXT(A1, "yyyymmdd_hhss"). (Ovviamente puoi cambiare il riferimento di cella e la stringa di formato secondo necessità.)

A proposito, puoi nominare la funzione come preferisci. Ho scelto FMTperché era breve e perché la funzione può formattare sia numeri che date. Ma puoi scegliere qualcosa di più descrittivo se vuoi. Ricorda solo di usare lo stesso nome nel tuo foglio di lavoro come nel codice VBA.

Si noti che le stringhe di formato VBA non sono esattamente le stesse delle stringhe di formato personalizzato di Excel (ad esempio, utilizzare "n" anziché "m" per minuti), ma sono molto simili. Cerca qui i dettagli o cerca MSDN per "Funzione formato (Visual Basic, Applications Edition)". Scorri verso il basso per vedere i vari identificatori del formato della data.

Metodo 2

Un altro approccio che utilizza anche VBA, ma che in realtà potrebbe essere più facile da mantenere, è il seguente:

  1. Applica il formato data desiderato a una cella, utilizzando la normale finestra di dialogo Formato cella. Se preferisci, questa cella può trovarsi su un foglio nascosto: non è necessario che sia visualizzata all'utente finale. Supponiamo che tu abbia applicato il formato yyyymmdd\_hhssalla cella $ A $ 1 (nota che il carattere di sottolineatura deve essere sfuggito come mostrato).
  2. Aggiungi la GetFormatfunzione (mostrata sotto) a un modulo VBA nella tua cartella di lavoro.
  3. Entra =GetFormat($A$1, TRUE)in un'altra cella (es. $ B $ 1 )
  4. Tale funzione restituirà la versione localizzata della stringa di formato. Quindi, anche se originariamente hai formattato $ A $ 1 con yyyymmdd\_hhss, quando apri la cartella di lavoro su un computer usando la lingua francese (ad esempio), la funzione mostrerà aaaammjj\_hhss.
  5. Ora fai semplicemente riferimento alla seconda cella in tutte le tue TEXTfunzioni. Ad esempio: =TEXT(F22, $B$1).

Ecco il codice VBA:

Public Function GetFormat$(Cell As Range, Optional ByVal UseLocal As Boolean)
    If UseLocal Then
        GetFormat = Cell.NumberFormatLocal
    Else
        GetFormat = Cell.NumberFormat
    End If
End Function

Questo ci consente di "ispezionare" la cella formattata originariamente ($ A $ 1) per recuperare la stringa di formato localizzata. Quella stringa rappresenterà lo stesso formato che hai applicato, ma utilizzerà le lettere corrette per l'interpretazione di TEXT (ad esempio "j" anziché "d"), quindi il valore visualizzato delle date sarà costante in tutte le versioni locali. Se si desidera utilizzare solo un formato data per l'intera cartella di lavoro, è necessario eseguire i passaggi 1-4 una sola volta. Quindi ripeti il ​​passaggio 5 (la funzione TESTO) in tutte le celle in cui lo usi attualmente, ma invece di codificare un formato, faresti semplicemente riferimento alla cella che contiene la stringa di formato localizzata ( $ B $ 1 nelle istruzioni di esempio) .

Si noti che il secondo argomento GetFormatindica alla funzione se restituire o meno la versione localizzata (che dipende dalle impostazioni internazionali) o la versione "standard" (che si basa sempre su en-US).

Ecco alcune schermate che potrebbero renderlo più chiaro.

it-IT

  • Nella figura, la colonna 1 elenca diverse rappresentazioni di una singola data con diversi formati applicati.
  • Le righe 2 e 3 utilizzano i formati di data "predefiniti di sistema" di Excel. (Questi sono indicati da un asterisco principale nella finestra di dialogo Formato e indicano che deve essere utilizzato il formato data predefinito dell'utente.) Inoltre, la riga 5 utilizza un LCID tra parentesi, che impone che la lingua utilizzata per i nomi di mese e giorno sia l'inglese ( LCID diversi possono essere utilizzati per specificare altre lingue).
  • La seconda colonna mostra il risultato di GetFormat(Cell, FALSE)per ogni cella nella colonna 1. (Ricorda che FALSEper il secondo parametro fa sì che la funzione restituisca i formati NON localizzati ).
  • La terza colonna mostra ciò che GetFormat(Cell, TRUE)restituisce per ogni cella nella colonna 2. (ovvero i formati localizzati ).
  • La quarta colonna mostra il risultato della funzione TESTO utilizzando il valore della data non elaborata originale e il risultato localizzato di GetFormatri-produrre il formato mostrato nella colonna 1. Notare che NON è stata applicata alcuna formattazione numerica a questa colonna. I valori sono il risultato diretto della funzione TEXT.

I risultati per il caso inglese (US) sopra riportato non sono molto interessanti, ma puoi confrontarli con i seguenti risultati che sono stati ottenuti modificando le Impostazioni regionali del mio sistema operativo in varie altre impostazioni locali. È importante sottolineare che, utilizzando GetFormatin combinazione con TEXTsiamo in grado di mantenere un risultato costante per i formati numerici (quelli che non includono i nomi dei giorni o dei mesi) in tutte le versioni locali. E vincolando la lingua usando un LCID (come nella riga 5) possiamo anche mantenere un formato costante includendo anche i nomi di giorno e mese.

fr-CH

nb-NO

ru-RU

Questo metodo funziona per la maggior parte dei locali, tuttavia va notato che gli script utilizzati per rappresentare i numeri indù-arabi NON sono gli stessi in tutti i locali. Pertanto impostazioni internazionali come quelle della locale nepalese (India) risulteranno in formati di data che "sembrano" diversi dalle date degli Stati Uniti. Ma questi sono in realtà nello stesso "formato" in termini di posizioni dei numeri - usano semplicemente simboli diversi per i numeri.

ne-IN


1
Grazie mille per la tua risposta (anche in ritardo) - Il metodo 1 è il migliore per me e abbastanza semplice per tutti i miei casi. Risposta molto buona e completa.
рüффп,

Potresti spiegare come posso inserire il 28.11.2015 usando il primo metodo? Dove e cosa dovrei scrivere ???????
Ilan,

3

Per le date puoi effettivamente definire un formato che faccia usare Excel a una determinata locale. Se imposti il ​​formato numerico della cella contenente la tua data su qualcosa del genere

[$-409]m/d/yy h:mm AM/PM;@

Excel visualizzerà la tua data in una locale statunitense (esadecimale 409)

Gotcha: la notazione YMD è localizzata e quindi si trasforma in JMT su un sistema tedesco, ad esempio. Quindi potresti dover adattare la stringa di formato alla tua situazione, ma mi aspetto che si comporti come le formule (autotraslate) su sistemi che usano un linguaggio diverso (come sembri essere a conoscenza).

Vedi qui per maggiori dettagli: /programming/894805/excel-number-format-what-is-409

e qui per un elenco di locali: http://support.microsoft.com/kb/221435


2
Ma non risponde alla mia domanda. Voglio poter scrivere gg / mm / aaaa nel mio foglio Excel anche se il sistema operativo vuole "jj / mm / aaaa". Ho provato a cambiare le impostazioni internazionali del mio sistema operativo e l'output sta cambiando, quindi Excel non si adatta in base alle impostazioni internazionali dell'utente. Se scrivo "jj.mm.aaaa" (come in francese) e cambio il mio locale in Stati Uniti, Excel mostra: "jj.03.aaaa" che non è adattato.
рüффп,

3

Anche se questa domanda è un po 'vecchia, mi sono imbattuta in un'altra soluzione (semplice!) E sto postando qui per motivi di completezza / riferimento.

  • Ho provato con successo la risposta di ricovox, ma volevo una soluzione senza VBA.

  • Ho testato anche la soluzione di MarinD. Ma, come sottolineato nei commenti, se è necessario soddisfare più di un formato specifico per paese, può diventare ingombrante abbastanza velocemente.

  • E ora alla mia soluzione: usare le funzioni YEAR (), MONTH () e DATE () native di Excel, racchiuse in TEXT () per riempire gli zeri davanti. Con la data in A1:

    =TEXT(YEAR(A1),"0000")&"-"&TEXT(MONTH(A1),"00")&"-"&TEXT(DAY(A1),"00")

    mi dà la data in YYYY-MM-DDformato, indipendentemente dal fatto che la locale corrente richieda YYYY-MM-DDo AAAA-MM-JJo qualsiasi altro nome localizzato per anno / mese / data.

    Excel traduce automaticamente le sue formule native.


1

Un modo molto semplice per evitare tutto il caos è creare un elenco di giorni con date conosciute e utilizzare l'elenco nella tua funzione.


4
Puoi espandere la tua risposta per includere un esempio?
Burgi,

1

Un modo semplice per risolvere il problema del formato della data delle impostazioni locali di Excel è utilizzare la CHOOSEfunzione:

CHOOSE(WEEKDAY(TODAY());"Dimanche";"Lundi";"Mardi";"Mercredi";"Jeudi";"Vendredi";"Samedi")

CHOOSE(MONTH(TODAY());"Janvier";"Fevrier";"Mars";"Avril";"Mai";"Juin";"Juillet";"Août";"Septembre";"Octobre";"Novembre";"Décembre")

In questi esempi otterrai il giorno e il mese in lettere senza utilizzare i formati locali come "Mmmm" o "Dddd" o "Jjjj".


Semplicemente finché gestisci una lingua (nel tuo caso il francese) ma se devi gestire più angolazioni, la tua formula diventerà troppo grande.
рüффп

Gestisco solo una lingua. Il punto di utilizzo di SCEGLI è proprio quello di produrre un foglio Excel a una lingua che funzionerà su qualsiasi altra versione locale di Excel.
Alexis PERROTTEY,

Il grande errore della funzione TEXT di Excel è che il formato della data dipende dalle impostazioni internazionali di Windows correnti nelle Impostazioni internazionali. Esempio = = TESTO (OGGI (); "AAAA-MM-GG") per US = TESTO (OGGI (); "AAAA-MM-JJ") per FR Quindi non è possibile creare un foglio Excel universale usando TEXT. Usa invece SCEGLI.
Alexis PERROTTEY,

Alla fine, una soluzione con un'altra funzione con valori hardcoded non sta davvero aiutando molto di più di hard-coding degli schemi di date. Personalmente andrei con VBA e la risposta accettata. Grazie comunque per aver condiviso la tua esperienza.
рüффп

1

Se la data di riferimento è nella cella A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))

Questa è una buona soluzione se hai bisogno di gestire solo un formato aggiuntivo ... Sono sicuro che comunque i miei colleghi di Zurigo o di qualsiasi altro paese che non sia inglese né francese, non funzioneranno ancora. Se devi realizzare if(if(if...ogni singolo formato in tutto il mondo, sarebbe molto difficile da gestire.
рüффп,

Esatto, ma non sono riuscito a trovare niente di meglio senza passare attraverso una macro VBA. Non capisco perché Microsoft traduca le funzioni e le loro proprietà (il che è ancora peggio perché non le traducono automaticamente quando lo apri con un'altra lingua, come nel nostro problema qui). Nessun linguaggio di programmazione lo ha mai fatto. Sarebbe bastato solo l'inglese
MarinD,

0

Ora ho usato una logica simile al Metodo 2 fornito con i Macro. Le macro funzionano, ma in genere quando si invia un file da un'organizzazione a un'altra, le macro non riescono a passare attraverso lo scambio o l'antivirus non le consente di eseguirle. Quindi ho semplicemente rinominato ia cell come dateformat. In questa cella ho semplicemente inserito il testo gg / mm / aaaa. Quindi quando sto usando la funzione di testo sto usando il nome della cella per il formato es. = Text (C1, dateformat) e sembra funzionare (precisamente per la Svizzera funziona).

Saluti...

UN.


1
Dici che funziona in Svizzera, ma è "francese (Svizzera)", "tedesco (Svizzera)" o inglese? Se è inglese, questo non contribuisce in alcun modo a questa discussione. Se non è inglese, puoi spiegare perché =TEXT(C1,dateformat)dovrebbe funzionare (con la dateformatcella contenente dd/mm/yyyy) quando =TEXT(C1, "dd/mm/yyyy")non funziona? (O funziona?)
G-Man dice "Ripristina Monica" il

0

Non posso credere che nessuno abbia offerto i formati nominati come soluzione.

Se si formatta una data e si immette =TEXT(A1,"Short Date"), verrà automaticamente utilizzato il formato corretto in base all'impostazione regionale con zero problemi tra le regioni.

"Long Date" è anche una voce accettabile e funzionerà perfettamente tra le regioni. Si convertirà anche in una data corretta in VBA con cvdate indipendentemente dalla versione utilizzata.  


In Excel 2016, manterrà qualsiasi formattazione regionale assegnata. Se stai cercando di confrontare le date con diversi formati regionali, il confronto fallirà. Questo è così male che probabilmente è un bug.
Scuba Steve,

0

Sto solo entrando in un'altra alternativa elegante, tratta da: Stackoverflow risposta di @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])

Potrebbe non funzionare. Non conosco tutte le lingue ma fintanto che la parola per mese non inizia con "m" in alcune lingue, probabilmente non funzionerà affatto (rendering di un #VALUEerrore). Anche se la parola inizia con "m" qui ci sono più di 2 sole opzioni. Germania, Polonia e Ungheria hanno codici di formattazione diversi per nominarne solo alcuni.
Ister,

Suppongo che lo sviluppatore sappia in quale lingua si sta sviluppando (ad es. Qui il sistema inglese) e su quale vuole che la sua formula funzioni / in cui tradurla. Non dovrebbe essere un grosso problema estendere l'IF per qualunque lingua gli interessi.
GWD

Bene, ho elencato quei paesi specifici perché avevo già avuto un caso in cui dovevo adattarmi a tutte quelle lingue allo stesso tempo. Esiste anche un limite di IF integrati, ma è anche facile da evitare. Concordo sul fatto che l'idea è buona in generale e il suo vantaggio principale non è VBA necessario.
Ister,

0

Lo so, in ritardo alla festa, ma esaminando me stesso ho appena trovato una soluzione funzionante su ExcelBanter che non ha bisogno di VBA.

La strada da percorrere è usare il vecchio sistema macro Excel v4. È ancora possibile accedervi tramite intervalli denominati o macro fogli v4. È stata un'esperienza di apprendimento anche per me; una pagina su Excel fuori dalla griglia e una sul sito di Ron de Bruin erano belle presentazioni. Quest'ultimo ha anche un collegamento a una cartella di lavoro con la stessa soluzione.

Fondamentalmente, la vecchia funzione macro v4 di Excel GET.WORKSPACE può essere utilizzata per ottenere meta informazioni su molte cose, incluso il formato data localizzato in uso. GET.WORKSPACE (37) restituisce una matrice di tutti i caratteri utilizzati per tutti i tipi di separatori ecc., Dove l'indice 19-20-21 contiene la lettera utilizzata per la formattazione di anno, mese e giorno. Quindi, usando INDEX (GET.WORKSPACE (37), 19) si restituisce "y" nelle impostazioni della lingua inglese, "j" in olandese e "a" in spagnolo. Combina questo con un REPT per generare il codice di 4 lettere e il gioco è fatto. Il problema è tuttavia che le vecchie funzioni v4 (come GET.WORKSPACE) possono essere utilizzate solo dai fogli macro stile v4 e dagli intervalli denominati.

Così:

  • creare un intervallo denominato e denominarlo, ad esempio "MonthFormat"
  • dagli la formula =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • nella tua formula di testo, usa questo nome MonthFormat per specificare il formato, ad esempio =TEXT(A1, MonthFormat)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.