Cách ngăn Excel sử dụng cài đặt vùng của HĐH cho các mẫu ngày trong công thức


21

Theo câu hỏi này tôi có vấn đề sau:

Tôi muốn sử dụng một số hàm Excel (không phải định dạng ô) như TEXT (A1, {date_potype})

Nhưng người trả lời câu hỏi trước đó của tôi khiến tôi thấy rằng mẫu ngày thay đổi theo Cài đặt khu vực của Windows.

Tuy nhiên, HĐH của tôi (Windows 7) cũng bằng tiếng Anh và bộ Office. Bằng cách tìm trong cài đặt Vùng của tôi, nó hiển thị ngay cả một mẫu sử dụng ký hiệu tiếng Anh (dd.MM.yyyy)

Tôn giáo và ngôn ngữ

Tôi muốn biết liệu có cách nào để vô hiệu hóa hành vi đó khỏi Excel không, có nghĩa là tôi muốn luôn sử dụng các mẫu tiếng Anh và không bao giờ sử dụng các mẫu được bản địa hóa vì tôi không muốn hành vi của bảng Excel của mình thay đổi theo địa phương hóa của người đọc.

Một trường hợp đơn giản sẽ định dạng lại một số trường ngày theo cách tập trung vào máy tính như thế này: "yyyymmdd_hhss" điều này được nhận ra phổ biến và có thể được sắp xếp lên xuống dễ dàng. Nhưng vì tôi là người Pháp ở Thụy Sĩ nên tôi nên viết "aaaammjj_hhss" và nếu tôi gửi Excel này cho một đồng nghiệp ở Zürich, anh ta sẽ không thể xem ngày thích hợp khi anh ta nhận được bản địa hóa tiếng Đức của Thụy Sĩ (excel của anh ta sẽ mong đợi "jjjjmmtt_hhss")

Chúng tôi đủ thông minh để cài đặt tất cả các cửa sổ và văn phòng bằng tiếng Anh nhưng chúng tôi vẫn gặp phải vấn đề như thế này vì liên kết này với các cài đặt khu vực của hệ điều hành.

Đối với tôi, việc thay đổi Cài đặt Windows không phải là một tùy chọn vì tất cả các chương trình khác đang sử dụng cài đặt này.


4
Tôi không thể tin rằng điều này thậm chí đã được giải quyết trên Excel. Với hành vi này, kết quả của tài liệu hoàn toàn phụ thuộc vào máy tính mở tệp, làm cho nội dung tệp thay đổi tùy thuộc vào máy tính. Tôi đã gặp phải vấn đề này khi mở tệp ban đầu bằng dấu phẩy (,) cho các giá trị thập phân trong máy tính bằng dấu chấm (.) Và các công thức cho kết quả không chính xác ...
AxeEffect

Câu trả lời:


26

Câu hỏi này hơi cũ, nhưng đến nay nó dường như không có câu trả lời. Tôi cũng đã thấy các câu hỏi tương tự trên một số trang web, nhưng chưa tìm thấy câu trả lời nào chỉ liên quan đến các hàm Excel tích hợp. Tuy nhiên, khá dễ dàng để giải quyết điều này với VBA. Bạn thậm chí không phải biết cách lập trình để làm điều này, bởi vì chức năng cần thiết rất đơn giản.

Khi sổ làm việc của bạn mở, chỉ cần nhấn Alt + F11 (để mở trình soạn thảo VBA) Sau đó bấm vào mục menu Chèn > Mô-đun Trong mô-đun VBA mới, nhập thông tin sau:

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

Điều này chỉ đơn giản là sử dụng Formatchức năng riêng của VBA thay vì chức năng của Excel TEXT. Đây chính xác là những gì bạn muốn.

Hàm mới này sẽ định dạng bất kỳ ngày (hoặc số) nào theo bất kỳ chuỗi định dạng nào bạn chỉ định. Nó sẽ diễn giải chuỗi định dạng bằng cách sử dụng ký hiệu chuẩn ( en-US ), bất kể cài đặt khu vực của hệ điều hành.

Để sử dụng điều này trong sổ làm việc của bạn, chỉ cần gõ =FMT(A1, "yyyymmdd_hhss")thay vì =TEXT(A1, "yyyymmdd_hhss"). (Tất nhiên bạn có thể thay đổi tham chiếu ô và chuỗi định dạng nếu cần.)

Nhân tiện, bạn có thể đặt tên cho chức năng bất cứ điều gì bạn muốn. Tôi chọn FMTvì nó ngắn và vì hàm có thể định dạng cả số và ngày. Nhưng bạn có thể chọn một cái gì đó mô tả hơn nếu bạn muốn. Chỉ cần nhớ sử dụng cùng tên trong bảng tính của bạn như trong mã VBA.

Lưu ý rằng các chuỗi định dạng VBA không hoàn toàn giống với các chuỗi định dạng tùy chỉnh của Excel (ví dụ: sử dụng "n" thay vì "m" trong vài phút), nhưng chúng rất giống nhau. Xem ở đây để biết chi tiết hoặc tìm kiếm MSDN cho "Chức năng định dạng (Visual Basic cho các ứng dụng)". Cuộn xuống phía dưới để xem các chỉ định định dạng ngày khác nhau.

Phương pháp 2

Một cách tiếp cận khác cũng sử dụng VBA, nhưng thực sự có thể dễ bảo trì hơn, là:

  1. Áp dụng định dạng ngày mong muốn của bạn cho một ô, sử dụng hộp thoại Định dạng ô bình thường. Ô này có thể nằm trên một bảng ẩn nếu bạn thích - nó không cần hiển thị cho người dùng cuối. Giả sử bạn đã áp dụng định dạng yyyymmdd\_hhsscho ô $ A $ 1 (lưu ý rằng dấu gạch dưới phải được thoát như hiển thị).
  2. Thêm GetFormatchức năng (hiển thị bên dưới) vào mô-đun VBA trong sổ làm việc của bạn.
  3. Nhập =GetFormat($A$1, TRUE)vào một ô khác (ví dụ $ B $ 1 )
  4. Hàm đó sẽ trả về phiên bản được bản địa hóa của chuỗi định dạng. Vì vậy, ngay cả khi bạn định dạng ban đầu $ A $ 1 với yyyymmdd\_hhss, khi bạn mở bảng tính trên máy tính bằng cách sử dụng tiếng Pháp (ví dụ), hàm sẽ hiển thị aaaammjj\_hhss.
  5. Bây giờ chỉ cần tham chiếu ô thứ hai trong tất cả các TEXTchức năng của bạn . Ví dụ : =TEXT(F22, $B$1).

Đây là mã 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

Điều này cho phép chúng tôi "kiểm tra" ô mà bạn đã định dạng ban đầu ($ A $ 1) để truy xuất chuỗi định dạng được bản địa hóa. Chuỗi đó sẽ đại diện cho cùng định dạng bạn đã áp dụng, nhưng nó sẽ sử dụng các chữ cái chính xác cho văn bản để diễn giải (ví dụ "j" thay vì "d"), vì vậy giá trị hiển thị của ngày sẽ không đổi trên tất cả các địa phương. Nếu bạn muốn chỉ sử dụng một định dạng ngày cho toàn bộ sổ làm việc của mình, bạn chỉ cần thực hiện các bước 1-4 một lần. Sau đó lặp lại bước 5 (hàm TEXT) trong tất cả các ô mà bạn hiện đang sử dụng nó, nhưng thay vì mã hóa một định dạng, bạn chỉ cần tham chiếu ô chứa chuỗi định dạng được bản địa hóa ( $ B $ 1 trong hướng dẫn ví dụ) .

Lưu ý rằng đối số thứ hai để GetFormatcho biết chức năng có trả về phiên bản đã bản địa hóa hay không (tùy thuộc vào cài đặt khu vực) hoặc phiên bản "tiêu chuẩn" (luôn dựa trên en-US).

Dưới đây là một số ảnh chụp màn hình có thể làm cho điều này rõ ràng hơn.

en-Mỹ

  • Trong hình, Cột 1 liệt kê một số biểu diễn của một ngày với các định dạng khác nhau được áp dụng.
  • Lưu ý rằng hàng 2 và 3 sử dụng định dạng ngày "mặc định hệ thống" của Excel. (Chúng được biểu thị bằng dấu hoa thị hàng đầu trong Hộp thoại Định dạng và chúng chỉ ra rằng nên sử dụng định dạng ngày mặc định của người dùng.) Cũng lưu ý rằng hàng 5 sử dụng LCID được đặt dấu ngoặc, buộc ngôn ngữ được sử dụng cho tên tháng và ngày là tiếng Anh ( LCID khác nhau có thể được sử dụng để chỉ định các ngôn ngữ khác).
  • Cột thứ hai hiển thị kết quả của GetFormat(Cell, FALSE)từng ô trong cột 1. (Nhắc lại rằng FALSEđối với tham số thứ hai làm cho hàm trả về các định dạng NON cục bộ ).
  • Cột thứ ba hiển thị những gì GetFormat(Cell, TRUE)trả về cho mỗi ô trong cột 2. (tức là các định dạng được bản địa hóa ).
  • Cột thứ tư hiển thị kết quả của hàm TEXT bằng cách sử dụng giá trị ban đầu, ngày thô và kết quả được bản địa hóaGetFormat để tạo lại định dạng được hiển thị trong cột 1. Lưu ý rằng tuy nhiên định dạng số KHÔNG được áp dụng cho cột này. Các giá trị là kết quả trực tiếp của hàm TEXT.

Các kết quả cho trường hợp tiếng Anh (Hoa Kỳ) ở trên không thú vị lắm, nhưng bạn có thể so sánh chúng với các kết quả sau đây có được bằng cách thay đổi Cài đặt khu vực của hệ điều hành của tôi sang nhiều địa phương khác. Điều quan trọng, lưu ý rằng bằng cách sử dụng GetFormatkết hợp với TEXTchúng tôi có thể giữ lại kết quả không đổi cho các định dạng số (những định dạng không bao gồm tên ngày hoặc tháng) trên tất cả các địa phương. Và bằng cách hạn chế ngôn ngữ sử dụng LCID (như trong hàng 5), chúng tôi thậm chí có thể giữ lại một định dạng không đổi khi bao gồm cả tên ngày và tháng.

fr-CH

nb-KHÔNG

ru-RU

Phương pháp này hoạt động đối với hầu hết các địa phương, tuy nhiên, cần lưu ý rằng các tập lệnh được sử dụng để thể hiện các chữ số Hindu-Ả Rập KHÔNG giống nhau ở tất cả các địa phương. Do đó, các cài đặt khu vực như địa phương của Nepal (Ấn Độ) sẽ dẫn đến các định dạng ngày "trông" khác với ngày ở Hoa Kỳ. Nhưng những cái này thực sự có cùng "định dạng" về vị trí của các số - chúng chỉ sử dụng các ký hiệu khác nhau cho các số.

ne-IN


1
Cảm ơn rất nhiều vì câu trả lời của bạn (thậm chí muộn) - Phương pháp 1 là tốt nhất cho tôi và đủ đơn giản cho tất cả các trường hợp của tôi. Rất tốt và đầy đủ câu trả lời.
hôm nay

Bạn có thể giải thích làm thế nào tôi có thể chèn 28.11.2015 bằng phương pháp đầu tiên không? Tôi nên viết ở đâu và viết gì ???????
Ilan

3

Đối với ngày, bạn thực sự có thể xác định định dạng khiến Excel sử dụng một ngôn ngữ nhất định. Nếu bạn đặt định dạng số của ô chứa ngày của bạn thành một cái gì đó như

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

Excel sẽ hiển thị ngày của bạn theo ngôn ngữ Hoa Kỳ (hex 409)

Gotcha: Ký hiệu YMD được bản địa hóa và do đó chuyển sang JMT trên một hệ thống tiếng Đức chẳng hạn. Vì vậy, bạn có thể phải điều chỉnh chuỗi định dạng theo tình huống của mình nhưng tôi hy vọng nó sẽ hoạt động giống như các công thức (tự động truyền) trên các hệ thống sử dụng ngôn ngữ khác (như bạn có thể nhận thấy).

Xem tại đây để biết thêm chi tiết: /programming/894805/excel-number-format-what-is-409

và ở đây để xem danh sách các địa phương: http://support.microsoft.com/kb/221435


2
Nhưng nó không trả lời câu hỏi của tôi. Tôi muốn có thể viết dd / mm / yyyy trong bảng Excel của mình ngay cả HĐH muốn "jj / mm / aaaa". Tôi đã cố gắng thay đổi ngôn ngữ hệ điều hành của mình và đầu ra đang thay đổi, sau đó Excel không điều chỉnh theo Locale của người dùng. Nếu tôi viết "jj.mm.aaaa" (như tiếng Pháp) và tôi thay đổi ngôn ngữ của mình thành Hoa Kỳ, thì Excel hiển thị: "jj.03.aaaa" không phù hợp.
2014

3

Mặc dù câu hỏi này hơi cũ, tôi đã tìm thấy một giải pháp khác (đơn giản!) Và đang đăng ở đây vì mục đích hoàn chỉnh / tham khảo.

  • Tôi đã thử thành công câu trả lời của ricovox, nhưng muốn có một giải pháp mà không cần VBA.

  • Đã thử nghiệm giải pháp của MarinD. Nhưng, như đã chỉ ra trong các ý kiến, nếu bạn cần phục vụ cho nhiều định dạng cụ thể theo quốc gia, nó có thể trở nên khó sử dụng khá nhanh.

  • Và bây giờ là giải pháp của tôi: sử dụng các hàm NĂM (), MONTH () và DATE () gốc của Excel, được gói trong tệp TEXT () để đệm các số 0 ở phía trước. Với ngày ở A1:

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

    cung cấp cho tôi ngày ở YYYY-MM-DDđịnh dạng, bất kể địa phương hiện tại yêu cầu YYYY-MM-DDhoặc AAAA-MM-JJhoặc bất kỳ tên địa phương hóa nào khác cho năm / tháng / ngày.

    Excel tự động dịch các công thức riêng của nó.


1

Một cách rất đơn giản để tránh toàn bộ sự lộn xộn là tạo một danh sách các ngày đã biết và sử dụng danh sách này trong chức năng của bạn.


4
Bạn có thể mở rộng câu trả lời của bạn để bao gồm một ví dụ?
Burgi

1

Một cách đơn giản để giải quyết vấn đề định dạng ngày địa phương Excel là sử dụng CHOOSEhàm:

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

Trong các ví dụ này, bạn sẽ nhận được Ngày và Tháng bằng chữ mà không sử dụng các định dạng miền địa phương như "Mmmm" hoặc "Dddd" hoặc "Jjjj".


Đơn giản miễn là bạn đang quản lý một ngôn ngữ (tiếng Pháp trong trường hợp của bạn) nhưng nếu bạn phải quản lý nhiều nỗi đau, công thức của bạn sẽ trở nên quá lớn.
hôm nay

Tôi chỉ quản lý một langage. Điểm chính của việc sử dụng CHOOSE là chính xác để tạo một bảng Excel langage sẽ hoạt động trên bất kỳ phiên bản địa phương nào khác của Excel.
Alexis PERROTTEY

Thất bại lớn của chức năng Excel TEXT là định dạng ngày phụ thuộc vào ngôn ngữ Windows hiện tại của bạn trong Cài đặt khu vực. Ví dụ = = TEXT (TODAY (); "YYYY-MM-DD") cho US = TEXT (TODAY (); "AAAA-MM-JJ") cho FR Vì vậy không thể tạo một bảng Excel phổ quát bằng cách sử dụng TEXT. Sử dụng CHỌN thay thế.
Alexis PERROTTEY

Cuối cùng, một giải pháp với chức năng khác với các giá trị được mã hóa cứng không thực sự giúp ích nhiều hơn việc mã hóa các mẫu ngày. Cá nhân tôi sẽ đi với VBA và câu trả lời được chấp nhận. Dù sao cũng cảm ơn vì đã chia sẻ kinh nghiệm của bạn.
hôm nay

1

Nếu ngày tham chiếu của bạn nằm trong ô A1:

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

Đó là một cách giải quyết tốt nếu bạn chỉ cần quản lý một định dạng bổ sung ... Tôi chắc chắn dù sao các đồng nghiệp của tôi từ Zurich hoặc bất kỳ quốc gia nào khác không phải là tiếng Anh cũng không phải tiếng Pháp, điều này vẫn sẽ không hoạt động. Nếu bạn phải thực hiện if(if(if...cho mọi định dạng duy nhất trên toàn thế giới, sẽ rất khó quản lý.
рüффп

Điều đó đúng, nhưng tôi không thể tìm thấy bất cứ điều gì tốt hơn nếu không thông qua macro VBA. Tôi không hiểu tại sao Microsoft dịch các chức năng và thuộc tính của chúng (thậm chí còn tệ hơn vì chúng không dịch chúng tự động khi bạn mở nó bằng ngôn ngữ khác, như trong vấn đề của chúng tôi ở đây). Không có ngôn ngữ lập trình nào từng làm điều đó. Chỉ cần tiếng Anh là đủ
MarinD 18/03/2015

0

Bây giờ tôi đã sử dụng một logic tương tự như Phương pháp 2 được cung cấp với các Macro. Các macro hoạt động, nhưng thông thường khi bạn gửi một tệp từ tổ chức này sang tổ chức khác, các macro sẽ không thực hiện được thông qua trao đổi hoặc phần mềm chống vi-rút sẽ không cho phép chúng chạy. Vì vậy, tôi chỉ đơn giản đổi tên tế bào ia là dateformat. Trong ô này tôi chỉ cần nhập văn bản dd / mm / yyyy. Vì vậy, khi tôi đang sử dụng chức năng văn bản, tôi đang sử dụng tên ô cho định dạng eg = text (C1, dateformat) và nó dường như đang hoạt động (preisey cho Thụy Sĩ nó hoạt động).

Chúc mừng ...

A.


1
Bạn nói cái này hoạt động ở Thụy Sĩ, nhưng nó là Pháp Pháp (Thụy Sĩ),, Đức, Thụy Sĩ, hay là tiếng Anh? Nếu đó là tiếng Anh, điều này thực sự không đóng góp gì cho cuộc thảo luận này. Nếu đó không phải là tiếng Anh, bạn có thể giải thích tại sao =TEXT(C1,dateformat)sẽ hoạt động (với dateformatô chứa dd/mm/yyyy) khi =TEXT(C1, "dd/mm/yyyy")không hoạt động? (Hay nó hoạt động?)
G-Man nói 'Phục hồi Monica'

0

Tôi không thể tin rằng không ai đưa ra các định dạng được đặt tên như một giải pháp.

Nếu bạn định dạng một ngày và nhập =TEXT(A1,"Short Date")nó sẽ tự động sử dụng định dạng phù hợp dựa trên cài đặt khu vực với các vấn đề không giữa các khu vực.

"Ngày dài" cũng là một mục được chấp nhận và sẽ hoạt động trơn tru giữa các khu vực. Nó cũng sẽ chuyển đổi trở lại một ngày thích hợp trong VBA với cvdate bất kể phiên bản được sử dụng.  


Trong Excel 2016, nó sẽ giữ bất kỳ định dạng khu vực nào được gán cho nó. Nếu bạn đang cố gắng so sánh ngày với các định dạng khu vực khác nhau, việc so sánh sẽ thất bại. Điều này rất tệ, nó có thể là một lỗi.
Scuba Steve

0

Chỉ cần thả vào một thay thế thanh lịch imho khác được lấy từ: Câu trả lời của Stackoverflow bởi @Taosique

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

Nó có thể không hoạt động. Tôi không biết tất cả các ngôn ngữ nhưng miễn là từ trong tháng không bắt đầu bằng "m" trong một số ngôn ngữ, điều này có thể sẽ không hoạt động ( #VALUEgây ra lỗi). Ngay cả khi từ bắt đầu bằng "m", có nhiều hơn 2 tùy chọn ở đây. Mỗi nước Đức, Ba Lan và Hungary đều có một mã định dạng khác nhau để chỉ một vài tên.
Ister

Tôi giả sử mũ nhà phát triển biết anh ta đang phát triển cài đặt ngôn ngữ nào (ví dụ ở đây là hệ thống tiếng Anh) và anh ta muốn công thức của mình hoạt động trong / để dịch nó sang ngôn ngữ nào. Không nên có vấn đề lớn để mở rộng IF cho bất kỳ ngôn ngữ nào mà anh ấy / cô ấy quan tâm.
GWD

Chà, tôi đã liệt kê những quốc gia cụ thể đó bởi vì tôi đã có một trường hợp tôi phải thích nghi với tất cả các ngôn ngữ đó cùng một lúc. Ngoài ra còn có một giới hạn của IF nhúng, tuy nhiên điều này cũng dễ dàng vượt qua. Tôi đồng ý rằng ý tưởng này nói chung là tốt và ưu điểm chính của nó là không cần VBA.
Ister

0

Tôi biết, đến bữa tiệc muộn, nhưng nhìn vào bản thân tôi, tôi chỉ tìm thấy một giải pháp làm việc trên ExcelBanter không cần VBA.

Cách để đi là sử dụng hệ thống macro Excel v4 cũ. Nó vẫn có thể được truy cập thông qua các phạm vi được đặt tên hoặc các bảng macro v4. Đó là một kinh nghiệm học tập cho tôi là tốt; một trang trên Excel tắt lưới và một trang trên Ron de Bruin là những lời giới thiệu hay. Cái sau cũng có một liên kết đến một bảng tính với giải pháp tương tự trong đó.

Về cơ bản, hàm macro Excel v4 cũ GET.WORKSPACE có thể được sử dụng để lấy thông tin meta về rất nhiều thứ, bao gồm cả định dạng ngày được bản địa hóa đang sử dụng. GET.WORKSPACE (37) trả về một mảng gồm tất cả các ký tự được sử dụng cho tất cả các loại dấu phân cách, v.v., trong đó chỉ mục 19-20-21 giữ chữ cái được sử dụng cho định dạng năm, tháng và ngày. Vì vậy, sử dụng INDEX (GET.WORKSPACE (37), 19) sẽ trả về "y" trên cài đặt ngôn ngữ tiếng Anh, "j" trên tiếng Hà Lan và "a" trên tiếng Tây Ban Nha. Kết hợp điều đó với REPT để tạo mã gồm 4 chữ cái và bạn đã hoàn thành. Vấn đề là mặc dù các hàm v4 cũ (như GET.WORKSPACE) chỉ có thể được sử dụng bởi các bảng macro kiểu v4 và các phạm vi được đặt tên.

Như vậy:

  • tạo một phạm vi được đặt tên và đặt tên cho nó, ví dụ: "MonthFormat"
  • cho nó công thức =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • trong công thức Văn bản của bạn, hãy sử dụng tên MonthFormat này để chỉ định định dạng, như =TEXT(A1, MonthFormat)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.