Excel'in formüllerde tarih desenleri için OS bölgesel ayarlarını kullanmasını engelleme


21

Bu soruya göre şu problemim var:

TEXT (A1, {date_pattern}) gibi bazı Excel işlevlerini (hücre biçimlendirmesini değil) kullanmak istiyorum

Ancak önceki sorumu yanıtlayan kişi, tarih düzeninin Windows Bölgesel Ayarlar'a göre değiştiğini söyledi.

Ancak, işletim sistemim (Windows 7) İngilizce ve Office paketidir. Bölgesel ayarlarıma bakarak İngilizce gösterimi (dd.MM.yyyy) kullanarak bir desen bile gösteriyor

Bölge ve dil

Bu tür davranışları Excel'den devre dışı bırakmanın herhangi bir yolu olup olmadığını bilmek istiyorum, yani her zaman İngilizce kalıpları kullanmak istemiyorum ve asla yerelleştirilmiş olanları kullanmak istemiyorum çünkü Excel sayfamın davranışının okuyucunun yerelleştirilmesine göre değişmesini istemiyorum.

Basit bir durum, bazı tarih alanlarını şu şekilde bilgisayar merkezli bir şekilde yeniden biçimlendirmek olabilir: "yyyymmdd_hhss" Bu evrensel olarak tanınır ve kolayca yukarı ve aşağı sıralanabilir. Ama İsviçre'nin Fransızca kısmında olduğum için "aaaammjj_hhss" yazmalıyım ve bu Excel'i Zürih'teki bir meslektaşa gönderirsem İsviçre Alman yerelleştirmesini aldığı için uygun tarihi göremezdi (excel'i beklerdi) "jjjjmmtt_hhss")

Tüm pencereleri ve ofisleri İngilizce olarak yükleyecek kadar zekiydik, ancak işletim sistemi bölgesel ayarlarına bu bağlantı nedeniyle hala böyle bir sorunla karşı karşıyayız.

Benim için değişen Windows Ayarları bir seçenek değil çünkü diğer tüm programlar bu ayarları kullanıyor.


4
Bunun Excel'de bile ele alındığına inanamıyorum. Bu davranışla, belgenin sonucu tamamen dosyayı açan bilgisayara bağlıdır ve dosya içeriği bilgisayara bağlı olarak değişir. Noktalar (.) Kullanarak bir bilgisayarda ondalık değerler için virgül (,) kullanarak bir dosyayı açarken bu sorunla karşılaştım ve formüller yanlış sonuçlar verdi ...
AxeEffect

Yanıtlar:


26

Bu soru biraz eski ama bugüne kadar bir cevabı yok gibi görünüyor. Bazı sitelerde de benzer sorular gördüm, ancak yalnızca yerleşik Excel işlevlerini içeren herhangi bir cevap bulamadım. Ancak, bunu VBA ile çözmek oldukça kolaydır. Bunu yapmak için nasıl programlayacağınızı bile bilmeniz gerekmez, çünkü gerekli işlev çok basittir.

Çalışma kitabınız açıkken, Alt + F11 tuşlarına basın (VBA düzenleyicisini açmak için) Sonra Ekle > Modül menü öğesini tıklatın . Yeni VBA modülüne aşağıdakileri girin:

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

Bunun yaptığı, FormatExcel'in işlevi yerine VBA'nın kendi işlevini kullanmaktır TEXT. Tam olarak istediğiniz budur.

Bu yeni işlev, herhangi bir tarihi (veya sayıyı) belirttiğiniz biçim dizesine göre biçimlendirir. İşletim sisteminin bölgesel ayarlarına bakılmaksızın standart ( en-US ) notasyonunu kullanarak biçim dizesini yorumlar .

Bunu çalışma kitabınızda kullanmak için =FMT(A1, "yyyymmdd_hhss")yerine yazın =TEXT(A1, "yyyymmdd_hhss"). (Tabii ki hücre referansını ve format dizesini gerektiği gibi değiştirebilirsiniz.)

Bu arada, işlevi istediğiniz gibi adlandırabilirsiniz. SeçtimFMTKısa olduğu ve fonksiyonun hem sayıları hem de tarihleri ​​biçimlendirebilmesi nedeniyle . Ancak isterseniz daha açıklayıcı bir şey seçebilirsiniz. Çalışma sayfanızda VBA kodundakiyle aynı adı kullanmayı unutmayın.

VBA biçim dizelerinin Excel'in özel biçim dizeleriyle tam olarak aynı olmadığını unutmayın (örneğin, dakikalar boyunca "m" yerine "n" kullanın), ancak çok benzerler. Ayrıntılar için buraya bakın veya MSDN'de "Biçim İşlevi (Uygulamalar için Visual Basic)" için arama yapın. Çeşitli tarih biçimi belirteçlerini görmek için aşağı doğru kaydırın.

Yöntem 2

VBA'yı kullanan, ancak aslında bakımı daha kolay olabilecek başka bir yaklaşım şudur:

  1. Normal Hücre Biçimi iletişim kutusunu kullanarak istediğiniz tarih biçimini bir hücreye uygulayın. İsterseniz bu hücre gizli bir sayfada olabilir - son kullanıcıya gösterilmesine gerek yoktur. $ A $ 1yyyymmdd\_hhss hücresine biçimi uyguladığınızı varsayalım. (alt çizginin gösterildiği gibi çıkması gerektiğini unutmayın).
  2. Ekle GetFormatsizin çalışma kitabındaki bir VBA modülüne (aşağıda gösterilmiştir) işlevini.
  3. =GetFormat($A$1, TRUE)Başka bir hücreye girin (ör. $ B $ 1 )
  4. Bu işlev , biçim dizesinin yerelleştirilmiş sürümünü döndürür. Bu nedenle, başlangıçta $ A $ 1 ile biçimlendirmiş olsanız bile yyyymmdd\_hhss, çalışma kitabını bir bilgisayarda Fransızca dilini kullanarak açtığınızda (örneğin), işlev gösterilir aaaammjj\_hhss.
  5. Şimdi tüm TEXTfonksiyonlarınızda ikinci hücreye referans veriniz . Örneğin: =TEXT(F22, $B$1).

İşte VBA kodu:

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

Bu, yerelleştirilmiş biçim dizesini almak için başlangıçta biçimlendirdiğiniz hücreyi ($ A $ 1) "incelememizi" sağlar. Bu dize uyguladığınız biçimi temsil eder, ancak TEXT'in yorumlaması için doğru harfleri kullanır (örneğin "d" yerine "j"), böylece tarihlerin görüntülenen değeri tüm yerel ayarlarda sabit kalır. Tüm çalışma kitabınız için yalnızca bir tarih biçimi kullanmak istiyorsanız, 1-4 arası adımları yalnızca bir kez yapmanız gerekir. Ardından, şu anda kullandığınız tüm hücrelerde 5. adımı (TEXT işlevi) tekrarlayın, ancak bir biçimi sabit kodlamak yerine, yerelleştirilmiş biçim dizesini içeren hücreye başvurmanız yeterlidir ( örnek talimatlarda $ B $ 1 ). .

İkinci argümanın GetFormat, işleve yerelleştirilmiş sürümü (bölgesel ayarlara bağlı olan) veya "standart" sürümü (her zaman en-US tabanlı olan) döndürüp döndürmeyeceğini bildireceğini unutmayın.

İşte bunu daha net hale getirebilecek bazı ekran görüntüleri.

tr-TR

  • Şekilde, Sütun 1, farklı formatların uygulandığı tek bir tarihin çeşitli gösterimlerini listeler.
  • Satır 2 ve 3'ün Excel'in "sistem varsayılanı" tarih biçimlerini kullandığını unutmayın. (Bunlar, Biçim İletişim Kutusunda önde gelen bir yıldız işareti ile gösterilir ve kullanıcının varsayılan tarih biçiminin kullanılması gerektiğini belirtir.) Ayrıca, 5. satırın ay ve gün adları için kullanılan dili İngilizce olmaya zorlayan köşeli bir LCID kullandığını unutmayın ( farklı dilleri belirlemek için farklı LCID'ler kullanılabilir).
  • İkinci sütun, GetFormat(Cell, FALSE)sütun 1'deki her hücrenin sonucunu gösterir . ( FALSEİkinci parametre için işlevin yerelleştirilmemiş formatları döndürmesine neden olduğunu hatırlayın ).
  • Üçüncü sütun, GetFormat(Cell, TRUE)2. sütundaki her hücre için neyin döndürüldüğünü gösterir (yani yerelleştirilmiş biçimler).
  • Dördüncü sütun, orijinal, ham tarih değerini ve 1. sütunda gösterilen biçimi yeniden üretmek için yerelleştirilmiş sonucu kullanan TEXT işlevinin sonucunu gösterir. GetFormatAncak bu sütuna NO sayı biçimlendirmesi uygulandığını unutmayın. Değerler METİN işlevinin doğrudan sonucudur.

Yukarıdaki İngilizce (ABD) davasının sonuçları çok ilginç değil, ancak işletim sistemimin Bölgesel Ayarlarını diğer yerel ayarlara değiştirerek elde edilen aşağıdaki sonuçlarla karşılaştırabilirsiniz. Önemlisi, GetFormatile birlikte kullanarak , TEXTtüm yerel alanlarda sayısal biçimler (gün veya ay adları içermeyen) için sabit bir sonuç tutabileceğimizi unutmayın . Ve dili LCID kullanarak (satır 5'teki gibi) kısıtlayarak gün ve ay adlarını da dahil ederken sabit bir formatı koruyabiliriz.

fr = CH

nb-NO

ru-RU

Bu yöntem çoğu yerel ayar için geçerlidir, ancak Hindu-Arap rakamlarını temsil etmek için kullanılan komut dosyalarının tüm yerel ayarlarda aynı OLMADIĞINA dikkat edilmelidir. Bu nedenle Nepalce (Hindistan) yerel ayarları gibi bölgesel ayarlar, ABD tarihlerinden farklı görünen tarih biçimleriyle sonuçlanacaktır. Ama bunlar aslında sayıların pozisyonları açısından aynı "formatta" - sadece rakamlar için farklı semboller kullanıyorlar.

ne-IN


1
Cevabınız için çok teşekkürler (hatta geç) - Yöntem 1 benim için en iyisi ve tüm vakalarım için yeterince basit. Çok iyi ve eksiksiz bir cevap.
рüффп

İlk yöntemi kullanarak 28.11.2015'i nasıl ekleyebilirim açıklayabilir misiniz? Nereye ve ne yazmalıyım ???????
Ilan

3

Tarihler için, Excel'in belirli bir yerel ayarı kullanmasını sağlayan bir biçim tanımlayabilirsiniz. Tarihinizi içeren hücrenin sayı biçimini aşağıdaki gibi bir değere ayarlarsanız

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

Excel, tarihinizi bir ABD yerel ayarında görüntüler (onaltılık 409)

Gotcha: YMD gösterimi yerelleştirildi ve örneğin bir Alman sisteminde JMT'ye dönüşüyor. Bu nedenle, biçim dizesini durumunuza uyarlamanız gerekebilir, ancak farklı bir dil kullanan (bildiğiniz gibi) sistemlerde formül (otomatik çeviri) gibi davranmasını beklerim.

Daha fazla ayrıntı için buraya bakın: /programming/894805/excel-number-format-what-is-409

ve burada yerel ayarların listesi için: http://support.microsoft.com/kb/221435


2
Ama soruma cevap vermiyor. İşletim sistemi "jj / mm / aaaa" isterse bile Excel sayfamda gg / aa / yyyy yazabilmek istiyorum. İşletim sistemimin yerel ayarını değiştirmeye çalıştım ve çıktı değişiyor, ardından Excel kullanıcının Yerel Ayarına göre uyarlanmıyor. "Jj.mm.aaaa" (Fransızca dilinde olduğu gibi) yazar ve yerel ayarımı ABD olarak değiştirirsem, Excel şunu gösterir: uyarlanmamış "jj.03.aaaa".
рüффп

3

Bu soru biraz eski olsa da, başka bir (basit!) Çözümle karşılaştım ve burada eksiksizlik / referans uğruna gönderiyorum.

  • Ricovox'un cevabını başarıyla denedim, ancak VBA'sız bir çözüm istedim.

  • MarinD'nin çözümünü de test etti. Ancak, yorumlarda belirtildiği gibi, birden fazla ülkeye özgü formata ihtiyaç duyarsanız, oldukça hızlı bir şekilde hantal olabilir.

  • Ve şimdi benim çözümüm: Excel'in yerel YEAR (), MONTH () ve DATE () işlevlerini kullanarak, sıfırları ön plana çıkarmak için TEXT () içine sarılmış. A1'deki Tarih ile:

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

    YYYY-MM-DDgeçerli yerel ayar gerektiriyorsa YYYY-MM-DDveya AAAA-MM-JJyıl / ay / tarih için başka herhangi bir yerelleştirilmiş addan bağımsız olarak tarihi biçim olarak verir .

    Excel yerel formüllerini otomatik olarak çevirir.


1

Tüm karmaşadan kaçınmanın çok basit bir yolu, bilinen tarihlerin bir gün listesini oluşturmak ve listeyi işlevinizde kullanmaktır.


4
Cevabınızı bir örnek içerecek şekilde genişletebilir misiniz?
Burgi

1

Excel yerel tarih biçimi sorununu çözmenin basit bir yolu CHOOSEişlevi kullanmaktır :

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

Bu örneklerde Gün ve Ay'ı "Mmmm" veya "Dddd" veya "Jjjj" gibi yerel ayarlar kullanmadan harflerle alacaksınız.


Tek bir dili (sizin durumunuzda Fransızca) yönettiğiniz sürece basittir, ancak birden fazla dili yönetmeniz gerekiyorsa, formülünüz çok büyük olacaktır.
рüффп

Sadece bir dili yönetiyorum. CHOOSE kullanımının amacı, Excel'in diğer yerel ayarları üzerinde çalışacak tek bir Excel sayfası oluşturmaktır.
Alexis PERROTTEY

Excel METİN işlevinin en büyük başarısızlığı, tarih biçiminin Bölgesel Ayarlar'daki geçerli Windows yerel ayarınıza bağlı olmasıdır. Örnek = = MET için US = TEXT (TODAY (); "AAAA-MM-JJ") için TEXT (TODAY (); "YYYY-AA-GG") TEXT kullanarak evrensel bir Excel sayfası oluşturmak mümkün değildir. Bunun yerine CHOOSE kullanın.
Alexis PERROTTEY

Sonunda, sabit kodlanmış değerlere sahip başka bir işleve sahip bir çözüm, tarih desenlerini zor kodlamaktan daha fazla yardımcı olmaz. Şahsen ben VBA ve kabul edilen cevap ile giderdim. Yine de deneyiminizi paylaştığınız için teşekkürler.
рüффп

1

Referans tarihiniz A1 hücresindeyse:

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

Sadece bir ekstra formatı yönetmeniz gerekiyorsa iyi bir çözüm ... Zaten meslektaşlarım Zürih'ten ya da İngilizce veya Fransızca olmayan başka bir ülkeden eminim, bu hala işe yaramayacak. if(if(if...Dünyanın her yerindeki her bir format için yapmak zorunda kalırsanız, yönetmek çok zor olurdu.
рüффп

Bu doğru, ama VBA makrosundan geçmeden daha iyi bir şey bulamadım. Microsoft'un neden işlevleri ve özelliklerini çevirdiğini anlamıyorum (daha da kötüsü, çünkü burada sorunumuzda olduğu gibi başka bir dille açtığınızda bunları otomatik olarak çevirmezler). Hiçbir programlama dili bunu yapmadı. Sadece İngilizce yeterli olurdu
MarinD

0

Şimdi Makrolar ile verilen Yöntem 2 benzer bir mantık kullandım. Makrolar çalışır, ancak genellikle bir kuruluştan diğerine dosya gönderdiğinizde, makrolar exchange üzerinden yapmaz veya antivirüs çalışmasına izin vermez. Bu yüzden ia hücresini dateformat olarak yeniden adlandırdım. Bu hücrede dd / aa / yyyy metnini girdim. Metin işlevini kullandığımda, örneğin = text (C1, dateformat) biçimi için hücre adını kullanıyorum ve çalışıyor gibi görünüyor (İsviçre için tam olarak çalışır).

Şerefe ...

A.


1
Bunun İsviçre'de işe yaradığını söylüyorsunuz, ancak “Fransızca (İsviçre)”, “Almanca (İsviçre)” ya da İngilizce mi? İngilizce ise, bu tartışmaya hiçbir şey katmaz. İngilizce değilse, =TEXT(C1,dateformat)işe yaramadığında neden ( dateformathücre içeren dd/mm/yyyy) işe yarayacağını açıklayabilir misiniz =TEXT(C1, "dd/mm/yyyy")? (Yoksa işe yarıyor mu?)
G-Man, '

0

Kimsenin adı verilen formatları bir çözüm olarak sunmadığına inanamıyorum.

Bir tarihi biçimlendirir ve girerseniz =TEXT(A1,"Short Date"), bölgeler arasında sıfır sorun bulunan bölgesel ayara göre otomatik olarak uygun biçimi kullanır.

"Uzun Tarih" de kabul edilebilir bir giriştir ve bölgeler arasında sorunsuz çalışır. Ayrıca, kullanılan sürüme bakılmaksızın cvdate ile VBA'da uygun bir tarihe dönecektir.  


Excel 2016'da, kendisine atanan tüm bölgesel biçimlendirmeleri koruyacaktır. Tarihleri ​​farklı bölgesel biçimlerle karşılaştırmaya çalışıyorsanız karşılaştırma başarısız olur. Bu çok kötü, muhtemelen bir hata.
Scuba Steve

0

Sadece alınan başka bir imho zarif alternatif bırakarak: Stackoverflow answer by @Taosique

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

Çalışmayabilir. Tüm dilleri bilmiyorum ama ay için kelime bazı dillerde "m" ile başlamadığı sürece, bu muhtemelen hiç işe yaramaz (bir #VALUEhata oluşturma ). Kelime "m" ile başlasa bile, burada sadece 2'den fazla seçenek vardır. Almanya, Polonya ve Macaristan'ın her birinin sadece birkaçı için farklı bir biçimlendirme kodu vardır.
Ister

Geliştiricinin hangi dil ayarını geliştirdiğini (örn. Burada İngilizce sistemi) bildiğini ve formülünün çalışmasını / çevirmesini istediğini varsayıyorum. İlgilendiği dilin IF'sini genişletmek için büyük bir sorun olmamalıdır.
GWD

Bu ülkeleri listeledim çünkü zaten tüm bu dillere aynı anda uyum sağlamak zorunda olduğum bir vakam vardı. Ayrıca gömülü IF'lerin bir sınırı vardır, ancak bunun kaldırılması da kolaydır. Fikrin genel olarak iyi olduğunu ve ana avantajının VBA'ya gerek olmadığına katılıyorum.
Ister

0

Biliyorum, partiye geç, ama kendime baktığımda ExcelBanter'da VBA'ya ihtiyaç duymayan çalışan bir çözüm buldum .

Gidilecek yol eski Excel v4 makro sistemini kullanmaktır. Yine de adlandırılmış aralıklar veya v4 makro sayfaları aracılığıyla erişilebilir. Benim için de bir öğrenme deneyimiydi; ızgarada Excel'de bir sayfa ve Ron de Bruin'in sitesinde bir sayfa güzel tanıtımlardı. İkincisinin aynı çözümü içeren bir çalışma kitabına da bağlantısı vardır.

Temel olarak, eski Excel v4 makro işlevi GET.WORKSPACE, kullanımdaki yerelleştirilmiş tarih biçimi de dahil olmak üzere birçok şey hakkında meta bilgi almak için kullanılabilir. GET.WORKSPACE (37), her türlü ayırıcı vb. İçin kullanılan tüm karakterlerin bir dizisini döndürür; burada 19-20-21 dizini yıl, ay ve gün biçimlendirmesi için kullanılan harfi tutar. Bu nedenle INDEX (GET.WORKSPACE (37), 19) kullanıldığında İngilizce dil ayarlarında "y", Felemenkçe'de "j" ve İspanyolca'da "a" döndürülür. 4 harfli kodu oluşturmak için bunu bir REPT ile birleştirin. Sorun eski v4 işlevlerinin (GET.WORKSPACE gibi) yalnızca v4 stili makro sayfaları ve adlandırılmış aralıklar tarafından kullanılabilmesidir.

Böylece:

  • adlandırılmış bir aralık oluşturun ve adlandırın, örneğin "MonthFormat"
  • ona formül ver =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • Metin formülünüzde, biçimi belirtmek için bu MonthFormat adını kullanın. =TEXT(A1, MonthFormat)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.