Bagaimana mencegah Excel untuk menggunakan pengaturan regional OS untuk pola tanggal dalam formula

21

Menurut pertanyaan ini, saya memiliki masalah berikut:

Saya ingin menggunakan beberapa fungsi Excel (bukan pemformatan sel) seperti TEXT (A1, {date_pattern})

Tetapi orang yang menjawab pertanyaan saya sebelumnya membuat saya menemukan bahwa pola tanggal berubah sesuai dengan Pengaturan Regional Windows.

Namun, OS saya (Windows 7) dalam bahasa Inggris dan Office suite juga. Dengan melihat di pengaturan Regional saya itu menunjukkan bahkan pola menggunakan notasi bahasa Inggris (dd.MM.yyyy)

Wilayah dan bahasa

Saya ingin tahu apakah ada cara untuk menonaktifkan perilaku seperti itu dari Excel, artinya saya ingin selalu menggunakan pola bahasa Inggris dan tidak pernah yang dilokalkan karena saya tidak ingin perilaku lembar Excel saya berubah sesuai dengan lokalisasi pembaca.

Sebuah kasus sederhana akan memformat ulang beberapa bidang tanggal ke cara sentris komputer seperti ini: "yyyymmdd_hhss" ini dikenali secara universal dan dapat disortir ke atas dan ke bawah dengan mudah. Tetapi karena saya berada di bagian Prancis dari Swiss bagian saya harus menulis "aaaammjj_hhss" dan jika saya mengirim Excel ini ke seorang rekan di Zürich dia tidak akan dapat melihat tanggal yang tepat ketika dia mendapat lokalisasi Jerman Jerman (unggul akan mengharapkan "jjjjmmtt_hhss")

Kami cukup pintar untuk menginstal semua jendela dan kantor dalam bahasa Inggris, tetapi kami masih menghadapi masalah seperti ini karena tautan ini ke pengaturan regional OS.

Bagi saya perubahan Pengaturan Windows bukanlah suatu pilihan karena semua program lain menggunakan pengaturan ini.

рüффп
sumber
4
Saya tidak percaya ini bahkan telah ditangani di Excel. Dengan perilaku ini, hasil dokumen sepenuhnya bergantung pada komputer yang membuka file, membuat konten file berubah tergantung pada komputer. Saya menemukan masalah ini ketika membuka file yang awalnya menggunakan koma (,) untuk nilai desimal di komputer menggunakan titik (.) Dan rumus memberikan hasil yang salah ...
AxeEffect

Jawaban:

26

Pertanyaan ini agak lama, tetapi sampai saat ini sepertinya tidak ada jawaban. Saya juga melihat pertanyaan serupa di sejumlah situs, tetapi belum menemukan jawaban yang hanya melibatkan fungsi Excel bawaan. Namun, sangat mudah untuk menyelesaikan ini dengan VBA. Anda bahkan tidak perlu tahu cara memprogram untuk melakukan ini, karena fungsi yang diperlukan sangat sederhana.

Dengan buku kerja Anda terbuka, cukup tekan Alt + F11 (untuk membuka editor VBA) Kemudian Klik item menu Sisipkan > Modul Di modul VBA baru, masukkan yang berikut ini:

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

Apa yang dilakukan adalah hanya menggunakan Formatfungsi VBA sendiri alih-alih fungsi Excel TEXT. Inilah yang Anda inginkan.

Fungsi baru ini akan memformat tanggal (atau angka) apa pun sesuai dengan string format apa pun yang Anda tentukan. Ini akan menginterpretasikan string format menggunakan notasi standar ( en-US ), terlepas dari pengaturan regional sistem operasi.

Untuk menggunakan ini di buku kerja Anda, cukup ketik =FMT(A1, "yyyymmdd_hhss")bukan =TEXT(A1, "yyyymmdd_hhss"). (Tentu saja Anda dapat mengubah referensi sel dan memformat string sesuai kebutuhan.)

Omong-omong, Anda dapat memberi nama fungsi apa pun yang Anda inginkan. Saya memilih FMTkarena itu pendek dan karena fungsinya dapat memformat angka dan tanggal. Tetapi Anda dapat memilih sesuatu yang lebih deskriptif jika Anda mau. Ingatlah untuk menggunakan nama yang sama di lembar kerja Anda seperti pada kode VBA.

Perhatikan bahwa string format VBA tidak persis sama dengan string format kustom Excel (misalnya, gunakan "n" alih-alih "m" selama beberapa menit), tetapi mereka sangat mirip. Lihat di sini untuk detailnya, atau cari MSDN untuk "Fungsi Format (Visual Basic for Applications)". Gulir ke bawah untuk melihat berbagai penentu format tanggal.

Metode 2

Pendekatan lain yang juga menggunakan VBA, tetapi sebenarnya mungkin lebih mudah dipertahankan, adalah sebagai berikut:

  1. Terapkan format tanggal yang Anda inginkan ke sel, menggunakan dialog Format Sel normal. Sel ini bisa berada di lembar tersembunyi jika Anda mau - tidak perlu ditampilkan kepada pengguna akhir. Mari kita asumsikan Anda menerapkan format yyyymmdd\_hhsske sel $ A $ 1 (perhatikan bahwa garis bawah harus diloloskan seperti yang ditunjukkan).
  2. Tambahkan GetFormatfungsi (ditunjukkan di bawah) ke modul VBA di buku kerja Anda.
  3. Masukkan =GetFormat($A$1, TRUE)ke sel lain (mis. $ B $ 1 )
  4. Fungsi itu akan mengembalikan versi string format yang dilokalkan . Jadi meskipun Anda awalnya diformat $ A $ 1 dengan yyyymmdd\_hhss, ketika Anda membuka buku kerja pada komputer menggunakan bahasa Perancis (misalnya), fungsi akan menunjukkan aaaammjj\_hhss.
  5. Sekarang cukup referensi sel kedua di semua TEXTfungsi Anda . Sebagai contoh: =TEXT(F22, $B$1).

Berikut kode 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

Ini memungkinkan kita untuk "memeriksa" sel yang semula diformat ($ A $ 1) untuk mengambil format-string yang dilokalkan. String itu akan mewakili format yang sama yang Anda terapkan, tetapi akan menggunakan huruf yang benar untuk TEXT untuk menafsirkan ("j", bukan "d" misalnya), sehingga nilai yang ditampilkan dari tanggal akan konstan di semua lokal. Jika Anda ingin menggunakan hanya satu format tanggal untuk seluruh buku kerja Anda, Anda hanya perlu melakukan langkah 1-4 sekali. Kemudian ulangi langkah 5 (fungsi TEXT) di semua sel tempat Anda menggunakannya saat ini, tetapi alih-alih mengkodekan format, Anda cukup mereferensikan sel yang berisi string-format terlokalisasi ( $ B $ 1 dalam contoh instruksi) .

Perhatikan bahwa argumen kedua untuk GetFormatmemberi tahu fungsi apakah akan mengembalikan versi yang dilokalkan (yang tergantung pada pengaturan regional) atau versi "standar" (yang selalu berbasis pada en-US).

Berikut adalah beberapa cuplikan layar yang mungkin membuat ini lebih jelas.

id-AS

  • Dalam gambar, Kolom 1 mencantumkan beberapa representasi dari satu tanggal dengan format berbeda yang diterapkan.
  • Perhatikan bahwa baris 2 dan 3 menggunakan format tanggal "sistem default" Excel. (Ini ditunjukkan oleh tanda bintang utama dalam Dialog Format dan itu menunjukkan bahwa format tanggal default pengguna harus digunakan.) Juga perhatikan bahwa baris 5 menggunakan LCID kurung, yang memaksa bahasa yang digunakan untuk nama bulan dan hari menjadi bahasa Inggris ( LCID yang berbeda dapat digunakan untuk menentukan bahasa lain).
  • Kolom kedua menunjukkan hasil GetFormat(Cell, FALSE)untuk setiap sel di kolom 1. (Ingat bahwa FALSEuntuk parameter kedua menyebabkan fungsi mengembalikan format yang terlokalisasi NON ).
  • Kolom ketiga menunjukkan apa yang GetFormat(Cell, TRUE)kembali untuk setiap sel di kolom 2. (yaitu format yang dilokalkan ).
  • Kolom keempat menunjukkan hasil fungsi TEXT menggunakan nilai asli, tanggal baku dan hasil lokalGetFormat untuk menghasilkan kembali format yang ditunjukkan pada kolom 1. Namun perhatikan bahwa pemformatan NO number diterapkan ke kolom ini. Nilai adalah hasil langsung dari fungsi TEXT.

Hasil untuk kasus Bahasa Inggris (AS) di atas tidak terlalu menarik, tetapi Anda dapat membandingkannya dengan hasil berikut yang diperoleh dengan mengubah Pengaturan Regional sistem operasi saya ke berbagai lokal lainnya. Yang penting, perhatikan bahwa dengan menggunakan GetFormatdalam kombinasi dengan TEXTkami dapat mempertahankan hasil konstan untuk format numerik (yang tidak menyertakan nama hari atau bulan) di semua lokal. Dan dengan membatasi bahasa menggunakan LCID (seperti pada baris 5) kita bahkan dapat mempertahankan format konstan ketika menyertakan nama hari dan bulan juga.

fr-CH

nb-TIDAK

ru-RU

Metode ini berfungsi untuk sebagian besar lokal, namun perlu dicatat bahwa skrip yang digunakan untuk mewakili angka Hindu-Arab TIDAK sama di semua lokal. Oleh karena itu pengaturan regional seperti yang dari Nepal (India) lokal akan menghasilkan format tanggal yang "terlihat" berbeda dari tanggal en-AS. Tapi ini sebenarnya dalam "format" yang sama dalam hal posisi angka - mereka hanya menggunakan simbol yang berbeda untuk angka-angka tersebut.

ne-IN

drwatsoncode
sumber
1
Terima kasih banyak atas jawaban Anda (bahkan terlambat) - Metode 1 adalah yang terbaik untuk saya dan cukup sederhana untuk semua kasus saya. Jawaban yang sangat bagus dan lengkap.
рüффп
Bisakah Anda menjelaskan bagaimana saya bisa memasukkan 28.11.2015 menggunakan metode pertama? Di mana dan apa yang harus saya tulis ???????
Ilan
3

Untuk tanggal, Anda benar-benar dapat menentukan format yang membuat Excel menggunakan lokal tertentu. Jika Anda mengatur format angka sel yang berisi tanggal Anda menjadi seperti ini

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

Excel akan menampilkan tanggal Anda di lokal AS (hex 409)

Gotcha: Notasi YMD dilokalkan dan dengan demikian beralih ke JMT pada sistem Jerman misalnya. Jadi, Anda mungkin harus menyesuaikan string format dengan situasi Anda, tetapi saya akan mengharapkannya berperilaku seperti rumus (autotranslate) pada sistem menggunakan bahasa yang berbeda (karena Anda tampaknya sadar).

Lihat di sini untuk rincian lebih lanjut: /programming/894805/excel-number-format-what-is-409

dan di sini untuk daftar lokal: http://support.microsoft.com/kb/221435

TheUser1024
sumber
2
Tetapi itu tidak menjawab pertanyaan saya. Saya ingin dapat menulis dd / mm / yyyy di lembar Excel saya bahkan OS ingin "jj / mm / aaaa". Saya mencoba mengubah lokal OS saya dan output berubah, lalu Excel tidak beradaptasi sesuai dengan pengguna lokal. Jika saya menulis "jj.mm.aaaa" (seperti dalam bahasa Prancis) dan saya mengubah lokal saya menjadi AS, Excel menunjukkan: "jj.03.aaaa" yang tidak diadaptasi.
рüффп
3

Meskipun pertanyaan ini agak lama, saya menemukan solusi lain (sederhana!) Dan saya posting di sini demi kelengkapan / referensi.

  • Saya mencoba jawaban ricovox dengan sukses, tetapi menginginkan solusi tanpa VBA.

  • Menguji solusi MarinD juga. Tetapi, seperti yang ditunjukkan dalam komentar, jika Anda perlu memenuhi lebih dari satu format khusus negara, hal itu bisa menjadi sangat cepat.

  • Dan sekarang untuk solusi saya: menggunakan fungsi Excel YEAR (), MONTH () dan DATE () asli Excel, dibungkus dengan TEXT () untuk mengisi angka nol di depan. Dengan Tanggal dalam A1:

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

    memberi saya tanggal dalam YYYY-MM-DDformat, terlepas dari apakah lokal saat ini memerlukan YYYY-MM-DDatau AAAA-MM-JJatau nama lokal lainnya untuk tahun / bulan / tanggal.

    Excel menerjemahkan formula aslinya secara otomatis.

istivan
sumber
1

Cara yang sangat sederhana untuk menghindari seluruh kekacauan adalah membuat daftar hari dari tanggal yang diketahui, dan menggunakan daftar itu di fungsi Anda.

Renani
sumber
4
Bisakah Anda memperluas jawaban Anda dengan memasukkan contoh?
Burgi
1

Cara sederhana untuk memecahkan masalah format tanggal lokal Excel adalah dengan menggunakan CHOOSEfungsi ini:

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

Dalam contoh-contoh ini Anda akan mendapatkan Hari dan Bulan dalam surat tanpa menggunakan format lokal seperti "Mmmm" atau "Dddd" atau "Jjjj".

Alexis PERROTTEY
sumber
Sederhana selama Anda mengelola satu bahasa (Perancis dalam kasus Anda) tetapi jika Anda harus mengelola beberapa bahasa, rumus Anda akan menjadi terlalu besar.
рüффп
Saya hanya mengelola satu bahasa. Inti dari penggunaan MEMILIH tepatnya adalah untuk menghasilkan lembar Excel satu langage yang akan bekerja pada versi Excel lokal lainnya.
Alexis PERROTTEY
Kegagalan besar fungsi Excel TEXT adalah bahwa format tanggal bergantung pada lokal Windows Anda saat ini di Pengaturan Regional. Contoh = = TEXT (TODAY (); "YYYY-MM-DD") untuk US = TEXT (TODAY (); "AAAA-MM-JJ") untuk FR Jadi tidak mungkin untuk membuat lembar Excel universal menggunakan TEXT. Gunakan PILIH sebagai gantinya.
Alexis PERROTTEY
Pada akhirnya, solusi dengan fungsi lain dengan nilai-nilai yang dikodekan tidak benar-benar membantu lebih dari pengodean pola tanggal. Secara pribadi saya akan pergi dengan VBA dan jawaban yang diterima. Bagaimanapun, terima kasih telah berbagi pengalaman Anda.
рüффп
1

Jika tanggal referensi Anda ada di sel A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
sumber
Itu adalah solusi yang baik jika Anda perlu mengelola hanya satu format tambahan ... Saya tetap yakin rekan-rekan saya dari Zurich atau negara lain yang bukan bahasa Inggris atau Perancis, ini masih tidak akan berfungsi. Jika Anda harus membuat if(if(if...untuk setiap format tunggal di seluruh dunia, itu akan sangat sulit untuk dikelola.
рüффп
Itu benar, tetapi saya tidak dapat menemukan sesuatu yang lebih baik tanpa melalui makro VBA. Saya tidak mengerti mengapa Microsoft menerjemahkan fungsi dan propertinya (yang lebih buruk karena mereka tidak menerjemahkannya secara otomatis ketika Anda membukanya dengan bahasa lain, seperti dalam terbitan kami di sini). Tidak ada bahasa pemrograman yang pernah melakukan itu. Bahasa Inggris saja sudah cukup
MarinD
0

Saya sekarang telah menggunakan logika yang mirip dengan Metode 2 yang diberikan dengan makro. Macro berfungsi, tetapi biasanya ketika Anda mengirim file dari satu organisasi ke organisasi lain, makro tidak akan berhasil melalui pertukaran atau antivirus tidak akan membiarkannya berjalan. Jadi saya hanya mengubah nama selnya menjadi dateformat. Di sel ini saya cukup memasukkan teks dd / mm / yyyy. Jadi ketika saya menggunakan fungsi teks saya menggunakan nama sel untuk format misalnya = teks (C1, dateformat) dan sepertinya berfungsi (tepatnya untuk Swiss berfungsi).

Bersulang...

SEBUAH.

pengguna867292
sumber
1
Anda mengatakan ini bekerja di Swiss, tetapi apakah itu "Prancis (Swiss)", "Jerman (Swiss)", atau apakah itu bahasa Inggris? Jika ini bahasa Inggris, ini tidak benar-benar berkontribusi apa pun pada diskusi ini. Jika ini bukan bahasa Inggris, dapatkah Anda menjelaskan mengapa =TEXT(C1,dateformat)akan berfungsi (dengan dateformatsel yang berisi dd/mm/yyyy) ketika =TEXT(C1, "dd/mm/yyyy")tidak berfungsi? (Atau apakah itu berhasil?)
G-Man Mengatakan 'Reinstate Monica'
0

Saya tidak percaya tidak ada yang menawarkan format bernama sebagai solusi.

Jika Anda memformat tanggal dan memasukkannya =TEXT(A1,"Short Date")secara otomatis akan menggunakan format yang tepat berdasarkan pengaturan regional tanpa masalah antar wilayah.

"Long Date" juga merupakan entri yang dapat diterima dan akan bekerja mulus di seluruh wilayah. Itu juga akan mengkonversi kembali ke tanggal yang tepat di VBA dengan cvdate terlepas dari versi yang digunakan.  

Chris Puckett
sumber
Di Excel 2016, itu akan menjaga pemformatan regional apa pun yang ditugaskan padanya. Jika Anda mencoba membandingkan tanggal dengan format regional yang berbeda, perbandingannya akan gagal. Ini sangat buruk itu mungkin bug.
Scuba Steve
0

Hanya memasukkan alternatif imho elegan lain yang diambil dari: Stackoverflow jawab oleh @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
sumber
Itu mungkin tidak bekerja. Saya tidak tahu semua bahasa tetapi selama kata untuk bulan tidak dimulai dengan "m" di beberapa bahasa, ini mungkin tidak akan berfungsi sama sekali (membuat #VALUEkesalahan). Bahkan jika kata itu dimulai dengan "m" ada lebih dari hanya 2 opsi di sini. Jerman, Polandia, dan Hongaria masing-masing memiliki kode pemformatan berbeda untuk beberapa nama.
Ister
Saya berasumsi bahwa pengembang tahu pengaturan bahasa apa yang sedang ia kembangkan (mis. Di sini sistem bahasa Inggris) dan di mana ia ingin formulanya bekerja di / untuk menerjemahkannya. Seharusnya bukan masalah besar untuk memperpanjang IF untuk bahasa apa pun yang dia minati.
GWD
Yah, saya sudah mendaftar negara-negara tertentu karena saya sudah punya kasus di mana saya harus beradaptasi dengan semua bahasa pada saat yang sama. Ada juga batas IF yang tertanam, namun ini juga mudah dihindari. Saya setuju bahwa idenya bagus secara umum dan keunggulan utamanya adalah VBA tidak diperlukan.
Ister
0

Saya tahu, terlambat ke pesta, tetapi melihat ke dalam ini sendiri, saya baru saja menemukan solusi yang berfungsi di ExcelBanter yang tidak membutuhkan VBA.

Cara untuk pergi adalah menggunakan sistem makro Excel v4 lama. Itu masih dapat diakses melalui rentang bernama atau lembar makro v4. Itu juga merupakan pengalaman belajar bagi saya; sebuah halaman di Excel di luar jaringan dan satu di situs Ron de Bruin adalah perkenalan yang bagus. Yang terakhir ini juga memiliki tautan ke buku kerja dengan solusi yang sama di dalamnya.

Pada dasarnya, fungsi makro Excel v4 lama GET.WORKSPACE dapat digunakan untuk mendapatkan informasi meta tentang banyak hal, termasuk format tanggal lokal yang digunakan. GET.WORKSPACE (37) mengembalikan array dari semua karakter yang digunakan untuk semua jenis pemisah dll, di mana indeks 19-20-21 memegang huruf yang digunakan untuk format tahun, bulan dan hari. Jadi menggunakan INDEX (GET.WORKSPACE (37), 19) mengembalikan "y" pada pengaturan bahasa Inggris, "j" pada bahasa Belanda dan "a" pada bahasa Spanyol. Gabungkan itu dengan REPT untuk menghasilkan kode 4 huruf dan Anda selesai. Masalahnya adalah bahwa fungsi v4 lama (seperti GET.WORKSPACE) hanya dapat digunakan oleh lembar makro gaya v4 dan rentang bernama.

Jadi:

  • buat rentang bernama, dan beri nama misalnya "MonthFormat"
  • berikan formula =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • dalam rumus teks Anda, gunakan nama MonthFormat ini untuk menentukan format, seperti =TEXT(A1, MonthFormat)
Carl Colijn
sumber