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 Format
chứ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 FMT
vì 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à:
- Á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\_hhss
cho ô $ A $ 1 (lưu ý rằng dấu gạch dưới phải được thoát như hiển thị).
- Thêm
GetFormat
chứ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.
- Nhập
=GetFormat($A$1, TRUE)
vào một ô khác (ví dụ $ B $ 1 )
- 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
.
- Bây giờ chỉ cần tham chiếu ô thứ hai trong tất cả các
TEXT
chứ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 để GetFormat
cho 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.
- 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óa
GetFormat
để 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 GetFormat
kết hợp với TEXT
chú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.
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ố.