Jak uniemożliwić programowi Excel korzystanie z regionalnych ustawień systemu operacyjnego dla wzorców dat w formułach

21

Zgodnie z tym pytaniem mam następujący problem:

Chcę użyć funkcji programu Excel (nie formatowania komórki), np. TEKST (A1, {date_pattern})

Ale osoba, która odpowiedziała na moje poprzednie pytanie, sprawiła, że ​​wzorzec daty zmienia się zgodnie z regionalnymi ustawieniami systemu Windows.

Jednak mój system operacyjny (Windows 7) jest również w języku angielskim i pakietem Office. Przeglądając moje ustawienia regionalne, pokazuje nawet wzór przy użyciu notacji angielskiej (dd.MM.rrrr)

Region i język

Chcę wiedzieć, czy jest jakiś sposób na wyłączenie takiego zachowania z Excela, co oznacza, że ​​zawsze chcę używać wzorców angielskich, a nigdy zlokalizowanych, ponieważ nie chcę, aby zachowanie mojego arkusza Excela zmieniało się zgodnie z lokalizacją czytnika.

Prostym przypadkiem byłoby przeformatowanie pewnego pola daty na sposób skoncentrowany na komputerze, taki jak: „yyyymmdd_hhss”. Jest to rozpoznawane uniwersalnie i można je łatwo sortować w górę iw dół. Ale ponieważ jestem we francuskiej części Szwajcarii, powinienem napisać „aaaammjj_hhss”, a jeśli wyślę ten Excel do kolegi w Zurychu, nie będzie on w stanie zobaczyć właściwej daty, ponieważ uzyskał lokalizację w Szwajcarii i Niemczech (jego Excel oczekiwałby „jjjjmmtt_hhss”)

Byliśmy wystarczająco sprytni, aby zainstalować wszystkie okna i biuro w języku angielskim, ale nadal mamy do czynienia z takim problemem, ponieważ ten link do regionalnych ustawień systemu operacyjnego.

Dla mnie zmiana Ustawień systemu Windows nie jest opcją, ponieważ wszystkie inne programy używają tych ustawień.

рüффп
źródło
4
Nie mogę uwierzyć, że rozwiązano to nawet w programie Excel. Przy takim zachowaniu wynik dokumentu jest całkowicie zależny od otwarcia pliku przez komputer, co powoduje, że zawartość pliku zmienia się w zależności od komputera. Z tym problemem natknąłem się, otwierając plik pierwotnie za pomocą przecinków (,) dla wartości dziesiętnych na komputerze za pomocą kropek (.), A formuły dawały niepoprawne wyniki ...
AxeEffect

Odpowiedzi:

26

To pytanie jest trochę stare, ale do tej pory nie wydaje się, aby miało na nie odpowiedź. Widziałem również podobne pytania na wielu stronach, ale nie znalazłem jeszcze żadnej odpowiedzi, która dotyczyłaby tylko wbudowanych funkcji Excela. Jednak rozwiązanie VBA jest dość łatwe. Nie musisz nawet wiedzieć, jak programować, aby to zrobić, ponieważ wymagana funkcja jest tak prosta.

Po otwarciu skoroszytu po prostu naciśnij klawisze Alt + F11 (aby otworzyć edytor VBA). Następnie kliknij pozycję menu Wstaw > Moduł W nowym module VBA wprowadź następujące dane:

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

To po prostu używa własnej Formatfunkcji VBA zamiast funkcji Excela TEXT. To jest dokładnie to, czego chcesz.

Ta nowa funkcja sformatuje dowolną datę (lub liczbę) zgodnie z podanym ciągiem formatu. Zinterpretuje ciąg formatu przy użyciu standardowej notacji ( en-US ), niezależnie od regionalnych ustawień systemu operacyjnego.

Aby użyć tego w skoroszycie, po prostu wpisz =FMT(A1, "yyyymmdd_hhss")zamiast =TEXT(A1, "yyyymmdd_hhss"). (Oczywiście możesz w razie potrzeby zmienić odwołanie do komórki i formatować ciąg.)

Nawiasem mówiąc, możesz nazwać funkcję, jak chcesz. Wybrałem, FMTponieważ był krótki i ponieważ funkcja może formatować zarówno liczby, jak i daty. Ale jeśli chcesz, możesz wybrać coś bardziej opisowego. Pamiętaj tylko, aby użyć w arkuszu tej samej nazwy, co w kodzie VBA.

Zauważ, że ciągi formatu VBA nie są dokładnie takie same jak ciągi formatu niestandardowego Excela (na przykład używaj „n” zamiast „m” dla minut), ale są one bardzo podobne. Poszukaj tutaj szczegółów lub wyszukaj w MSDN „Format Function (Visual Basic for Applications)”. Przewiń w dół, aby wyświetlić różne specyfikatory formatu daty.

Metoda 2

Innym podejściem, które również wykorzystuje VBA, ale może być łatwiejsze w utrzymaniu, jest:

  1. Zastosuj żądany format daty do komórki, używając normalnego okna dialogowego Format komórki. Ta komórka może znajdować się na ukrytym arkuszu, jeśli wolisz - nie musi być wyświetlana użytkownikowi końcowemu. Załóżmy, że zastosowałeś format yyyymmdd\_hhssdo komórki $ A $ 1 (zwróć uwagę, że znak podkreślenia musi być poprzedzony znakiem jak pokazano).
  2. Dodaj GetFormatfunkcję (pokazaną poniżej) do modułu VBA w swoim skoroszycie.
  3. Wejdź =GetFormat($A$1, TRUE)do innej komórki (np. $ B $ 1 )
  4. Ta funkcja zwróci zlokalizowaną wersję ciągu formatu. Więc nawet jeśli pierwotnie sformatowany $ A $ 1 ze yyyymmdd\_hhsspo otwarciu skoroszytu na komputerze przy użyciu języka francuskiego (na przykład), funkcja pokaże aaaammjj\_hhss.
  5. Teraz po prostu odwołaj się do drugiej komórki we wszystkich swoich TEXTfunkcjach. Na przykład: =TEXT(F22, $B$1).

Oto kod 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

Dzięki temu możemy „sprawdzić” pierwotnie sformatowaną komórkę (1 A $ 1 USD) w celu pobrania zlokalizowanego ciągu formatu. Ten ciąg będzie reprezentował ten sam format, który zastosowałeś, ale użyje poprawnych liter do interpretacji TEKSTU (na przykład „j” zamiast „d”), więc wyświetlana wartość dat będzie stała we wszystkich lokalizacjach. Jeśli chcesz używać tylko jednego formatu daty dla całego skoroszytu, musisz wykonać kroki 1-4 tylko raz. Następnie powtórz krok 5 (funkcja TEKST) we wszystkich komórkach, w których go obecnie używasz, ale zamiast na stałe kodować format, po prostu odwołaj się do komórki zawierającej zlokalizowany ciąg formatu ( $ B $ 1 w przykładowych instrukcjach) .

Zauważ, że drugi argument GetFormatmówi funkcji, czy zwrócić zlokalizowaną wersję (która zależy od ustawień regionalnych) czy wersję „standardową” (która zawsze opiera się na en-US).

Oto kilka zrzutów ekranu, które mogą to wyjaśnić.

en-US

  • Na rysunku kolumna 1 zawiera kilka reprezentacji jednej daty z zastosowaniem różnych formatów.
  • Pamiętaj, że wiersze 2 i 3 używają formatów daty „domyślnych” w programie Excel. (Są one oznaczone wiodącą gwiazdką w oknie dialogowym Format i wskazują, że należy użyć domyślnego formatu daty użytkownika.) Należy również pamiętać, że wiersz 5 używa nawiasów LCID, które wymuszają język używany w nazwach miesięcy i dni na angielski ( różne LCID mogą być użyte do określenia innych języków).
  • Druga kolumna pokazuje wynik GetFormat(Cell, FALSE)dla każdej komórki w kolumnie 1. (Przypomnij, że FALSEdla drugiego parametru powoduje, że funkcja zwraca formaty nie zlokalizowane ).
  • Trzecia kolumna pokazuje, co GetFormat(Cell, TRUE)zwraca każda komórka w kolumnie 2. (tj. Zlokalizowane formaty).
  • Czwarta kolumna pokazuje wynik funkcji TEKST z wykorzystaniem oryginalnej, surowej wartości daty i zlokalizowanego wyniku GetFormatponownego odtworzenia formatu pokazanego w kolumnie 1. Zwróć jednak uwagę, że w tej kolumnie nie zastosowano formatowania liczbowego. Wartości są bezpośrednim wynikiem funkcji TEKST.

Wyniki powyższego przypadku w języku angielskim (USA) nie są bardzo interesujące, ale można je porównać z następującymi wynikami uzyskanymi przez zmianę ustawień regionalnych mojego systemu operacyjnego na różne inne ustawienia regionalne. Co ważne, pamiętaj, że używając GetFormatw połączeniu z, TEXTjesteśmy w stanie zachować stały wynik dla formatów numerycznych (tych, które nie zawierają nazw dni lub miesięcy) we wszystkich lokalizacjach. A ograniczając język za pomocą LCID (jak w wierszu 5), możemy nawet zachować stały format, uwzględniając również nazwy dni i miesięcy.

fr-CH

nb NIE

ru-RU

Ta metoda działa w przypadku większości ustawień narodowych, należy jednak zauważyć, że skrypty używane do reprezentowania liczb hindusko-arabskich NIE są takie same we wszystkich lokalizacjach. Dlatego ustawienia regionalne, takie jak ustawienia nepalskie (Indie), spowodują, że formaty daty będą wyglądały inaczej niż daty w USA. Ale w rzeczywistości są one w tym samym „formacie” pod względem pozycji liczb - po prostu używają różnych symboli dla liczb.

ne-IN

drwatsoncode
źródło
1
Bardzo dziękuję za odpowiedź (nawet za późno) - Metoda 1 jest dla mnie najlepsza i wystarczająco prosta dla wszystkich moich przypadków. Bardzo dobra i pełna odpowiedź.
рüффп
Czy możesz wyjaśnić, jak mogę wstawić 28.11.2015 przy użyciu pierwszej metody? Gdzie i co mam napisać ???????
Ilan
3

W przypadku dat można faktycznie zdefiniować format, w którym program Excel używa określonych ustawień regionalnych. Jeśli ustawisz format liczbowy komórki zawierającej twoją datę na coś podobnego

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

Excel wyświetli twoją datę w ustawieniach regionalnych w USA (hex 409)

Gotcha: Notacja YMD jest zlokalizowana i dlatego na przykład zwraca się do JMT w systemie niemieckim. Być może będziesz musiał dostosować ciąg formatu do swojej sytuacji, ale spodziewam się, że będzie on zachowywał się jak formuły (autotranslate) w systemach używających innego języka (jak się wydaje).

Zobacz tutaj więcej szczegółów: /programming/894805/excel-number-format-what-is-409

i tutaj, aby uzyskać listę ustawień regionalnych: http://support.microsoft.com/kb/221435

TheUser1024
źródło
2
Ale to nie odpowiada na moje pytanie. Chcę móc pisać dd / mm / rrrr w moim arkuszu Excela, nawet system operacyjny chce „jj / mm / aaaa”. Próbowałem zmienić ustawienia regionalne systemu operacyjnego, a dane wyjściowe ulegają zmianie, a następnie program Excel nie dostosowuje się zgodnie z ustawieniami regionalnymi użytkownika. Jeśli napiszę „jj.mm.aaaa” (jak w języku francuskim) i zmienię swoje ustawienia regionalne na US, Excel wyświetli: „jj.03.aaaa”, który nie jest dostosowany.
рüффп
3

Chociaż to pytanie jest nieco stare, natknąłem się na inne (proste!) Rozwiązanie i piszę tutaj w celu uzupełnienia / odniesienia.

  • Z powodzeniem wypróbowałem odpowiedź ricovox, ale szukałem rozwiązania bez VBA.

  • Przetestowałem również rozwiązanie MarinD. Ale, jak wskazano w komentarzach, jeśli musisz zadbać o więcej niż jeden format specyficzny dla kraju, może stać się niewygodny dość szybko.

  • A teraz moje rozwiązanie: za pomocą natywnych funkcji Excela ROK (), MIESIĄC () i DATA (), zawinięte w TEKST (), aby wstawić zera na początku. Z datą w A1:

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

    podaje mi datę w YYYY-MM-DDformacie, niezależnie od tego, czy wymagają tego obecne ustawienia regionalne, YYYY-MM-DDczy AAAA-MM-JJteż inne zlokalizowane nazwy na rok / miesiąc / datę.

    Excel automatycznie tłumaczy swoje natywne formuły.

istivan
źródło
1

Bardzo prostym sposobem na uniknięcie całego bałaganu jest utworzenie listy dni znanych dat i użycie jej w swojej funkcji.

Renani
źródło
4
Czy możesz rozszerzyć swoją odpowiedź o przykład?
Burgi
1

Prostym sposobem rozwiązania problemu formatu daty regionalnej Excel jest użycie CHOOSEfunkcji:

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")

W tych przykładach otrzymasz Dzień i Miesiąc w literach bez użycia formatów regionalnych, takich jak „Mmmm”, „Dddd” lub „Jjjj”.

Alexis PERROTTEY
źródło
To proste, o ile zarządzasz jednym językiem (w twoim przypadku francuski), ale jeśli musisz zarządzać wieloma problemami, twoja formuła stanie się o wiele za duża.
рüффп
Zarządzam tylko jednym językiem. Celem użycia WYBIERZ jest właśnie utworzenie arkusza Excela z jednym językiem, który będzie działał na każdej innej wersji językowej Excela.
Alexis PERROTTEY,
Duża awaria funkcji Excel TEXT polega na tym, że format daty zależy od bieżących ustawień regionalnych systemu Windows w ustawieniach regionalnych. Przykład = = TEKST (DZISIAJ (); „RRRR-MM-DD”) dla US = TEKST (DZISIAJ (); „AAAA-MM-JJ”) dla FR Nie jest więc możliwe utworzenie uniwersalnego arkusza Excel za pomocą TEKSTU. Zamiast tego użyj WYBIERZ.
Alexis PERROTTEY,
Na koniec rozwiązanie z inną funkcją z zakodowanymi wartościami tak naprawdę nie pomaga bardziej niż zakodowanie wzorców dat. Osobiście wybrałbym VBA i zaakceptowaną odpowiedź. W każdym razie dziękuję za podzielenie się swoimi doświadczeniami.
рüффп
1

Jeśli data odniesienia znajduje się w komórce A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
źródło
To dobre obejście, jeśli potrzebujesz zarządzać tylko jednym dodatkowym formatem ... Jestem pewien, że tak czy inaczej moi koledzy z Zurychu lub innego kraju, który nie jest językiem angielskim ani francuskim, to nadal nie zadziała. Jeśli musisz stworzyć if(if(if...każdy format na całym świecie, zarządzanie nim byłoby bardzo trudne.
рüффп
Zgadza się, ale nie mogłem znaleźć nic lepszego bez przejrzenia makra VBA. Nie rozumiem, dlaczego Microsoft tłumaczy funkcje i ich właściwości (co jest jeszcze gorsze, ponieważ nie tłumaczą ich automatycznie po otwarciu w innym języku, tak jak w naszym wydaniu tutaj). Żaden język programowania nigdy tego nie zrobił. Wystarczyłby angielski
MarinD
0

Użyłem teraz logiki podobnej do metody 2 podanej w makrach. Makra działają, ale zwykle, gdy wysyłasz plik z jednej organizacji do drugiej, makra nie przechodzą przez wymianę lub program antywirusowy nie pozwala na ich uruchomienie. Po prostu zmieniłem nazwę komórki ia na dateformat. W tej komórce po prostu wpisałem tekst dd / mm / rrrr. Więc kiedy używam funkcji tekstowej, używam nazwy komórki dla formatu np. = Tekst (C1, dateformat) i wydaje się, że działa (dokładnie w Szwajcarii działa).

Twoje zdrowie...

ZA.

użytkownik867292
źródło
1
Mówisz, że to działa w Szwajcarii, ale czy to jest „francuski (Szwajcaria)”, „niemiecki (Szwajcaria)”, czy też angielski? Jeśli jest to angielski, to tak naprawdę nic nie wnosi do tej dyskusji. Jeśli to nie jest angielski, czy możesz wyjaśnić, dlaczego =TEXT(C1,dateformat)miałby działać (z dateformatkomórką zawierającą dd/mm/yyyy), kiedy =TEXT(C1, "dd/mm/yyyy")nie działa? (Czy to działa?)
G-Man mówi „Przywróć Monikę”
0

Nie mogę uwierzyć, że nikt nie zaproponował nazwanych formatów jako rozwiązania.

Jeśli sformatujesz datę i =TEXT(A1,"Short Date")ją wprowadzisz , automatycznie użyje odpowiedniego formatu w oparciu o ustawienie regionalne, przy zerowych problemach między regionami.

„Długa data” jest również dopuszczalnym hasłem i będzie działać płynnie w różnych regionach. Konwertuje również z powrotem na właściwą datę w VBA z cvdate, niezależnie od używanej wersji.  

Chris Puckett
źródło
W programie Excel 2016 zachowa wszelkie przypisane do niego formatowanie regionalne. Jeśli próbujesz porównać daty z różnymi formatami regionalnymi, porównanie się nie powiedzie. Jest tak źle, że prawdopodobnie jest to błąd.
Scuba Steve
0

Wystarczy dodać kolejną elegancką alternatywę imho zaczerpniętą z: Odpowiedź Stackoverflow autorstwa @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
źródło
To może nie działać. Nie znam wszystkich języków, ale dopóki słowo „miesiąc” nie zaczyna się od „m” w niektórych językach, prawdopodobnie nie zadziała (renderowanie #VALUEbłędu). Nawet jeśli słowo zaczyna się od „m”, są tutaj więcej niż tylko 2 opcje. Niemcy, Polska i Węgry mają różne kody formatowania, aby wymienić tylko kilka.
Ister
Zakładam, że deweloper wie, w jakim języku się rozwija (np. Tutaj system angielski) i w którym chce, aby jego formuła działała / tłumaczyła go. Nie powinno być wielkim problemem, aby rozszerzyć IF dla dowolnego interesującego go języka.
GWD
Wymieniłem te konkretne kraje, ponieważ miałem już przypadek, w którym musiałem dostosować się do wszystkich tych języków jednocześnie. Istnieje również limit wbudowanych IF, jednak jest to również łatwe do uniknięcia. Zgadzam się, że pomysł jest ogólnie dobry, a jego główną zaletą jest brak konieczności używania VBA.
Ister
0

Wiem, późno na imprezę, ale patrząc na to sam, właśnie znalazłem działające rozwiązanie na ExcelBanter, które nie wymaga VBA.

Najlepszym sposobem jest użycie starego systemu makr Excel v4. Nadal można uzyskać do niego dostęp za pośrednictwem nazwanych zakresów lub arkuszy makr v4. To było również dla mnie doświadczenie edukacyjne; strona w Excelu poza tabelą i jedna na stronie Rona de Bruina były miłymi wprowadzeniami. Ten ostatni zawiera również link do skoroszytu z tym samym rozwiązaniem.

Zasadniczo stara funkcja makr programu Excel v4 GET.WORKSPACE może być używana do uzyskiwania meta informacji o wielu rzeczach, w tym o używanym zlokalizowanym formacie daty. GET.WORKSPACE (37) zwraca tablicę wszystkich znaków używanych dla wszelkiego rodzaju separatorów itp., Gdzie indeks 19-20-21 zawiera literę używaną do formatowania roku, miesiąca i dnia. Tak więc użycie INDEKSU (GET.WORKSPACE (37), 19) zwraca „y” w ustawieniach języka angielskiego, „j” w języku niderlandzkim i „a” w języku hiszpańskim. Połącz to z REPT, aby wygenerować 4-literowy kod i gotowe. Problem w tym, że stare funkcje v4 (takie jak GET.WORKSPACE) mogą być używane tylko przez arkusze makr w stylu v4 i nazwane zakresy.

A zatem:

  • utwórz nazwany zakres i nazwij go np. „MonthFormat”
  • nadaj mu wzór =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • w formule tekstowej użyj tej nazwy MonthFormat, aby określić format, np =TEXT(A1, MonthFormat)
Carl Colijn
źródło