2012-10-12 24 views
7

Hiện tại, tôi đang gặp phải sự cố khiến tôi gặp khó khăn. Tôi hy vọng rằng ai đó có thể giúp tôi. Tôi làm việc cho công ty lớn, cả Office 2007 (32bit) và Office 2010 (64 bit) được sử dụng. Viết macro để được compatibile thông qua toàn bộ công ty là nhiệm vụ khó khăn cho tôi (tôi chưa bao giờ được lập trình trong VBA trước đây - thực sự diễn đàn này đã giúp tôi rất nhiều). Nhiệm vụ của tôi là duy trì một bảng lớn trong bảng tính Excel được chia sẻ. Có một số macro và một số dạng người dùng. Bây giờ tôi sẽ giải mã vấn đề một thời gian ngắn: Trang tính có chứa hai cột có định dạng ngày (ngày bắt đầu và ngày kết thúc). Cả hai giá trị được nhập vào cột dạng hộp văn bản của userform (lệnh ăn trưa MsCal -exported to class- điền vào các hộp văn bản đó với ngày tháng). Điều tôi chỉ cần có định dạng ngày là dd/mm/yyyy trong cả hai cột để thực hiện lọc và các hoạt động khác. Khi các giá trị này được cập nhật bởi nhân viên sử dụng nội địa hóa khác với ngày tiếng Anh ở Hoa Kỳ được nhập dưới dạng dd.mm.yyyy. Thats làm cho bộ lọc thích hợp dựa trên ngày không thể. Tôi đã cố gắng sửa đổi bằng cách:Cùng một định dạng ngày qua một số bản địa hóa

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy") 

nhưng đoạn mã này không đúng cách nào đó. Trên một số máy, nó hoạt động, trên một số máy, nó không hoạt động. Và đó là điều khiến tôi đau đầu. Làm thế nào tôi nên tiến hành bây giờ? Có cách nào để buộc excel sử dụng cùng một định dạng ngày trong trang tính và bỏ qua các cài đặt bản địa hóa trong Windows? Nhân viên không muốn thay đổi nội địa hóa sang tiếng Anh của Hoa Kỳ vì họ được sử dụng theo định dạng của họ hoặc cần nó cho các ứng dụng khác. Có cách nào để tạm thời thay đổi nội địa hóa khi bảng tính này mở ra không? Bất kỳ lời khuyên nào đều sẽ được đề xuất. Cảm ơn trước Peter

+0

Ngày trong ô Excel phải là ngày và không phải là chuỗi. Nếu bạn đặt định dạng ô thành định dạng Ngày trước dấu hoa thị * (thường là 2 tùy chọn đầu tiên trong tùy chọn Định dạng Ô/Ngày) thì ngày sẽ thay đổi thành định dạng ngày địa phương của người dùng. Tuy nhiên, ô bên dưới vẫn là một số ngày tháng nên có thể sử dụng được bất kể định dạng. Nếu bạn cần nhập ngày trong một hộp văn bản hoặc chuyển đổi chuỗi thành ngày thì đó là một vấn đề khác và cần xử lý thêm. Xem http://stackoverflow.com/questions/12495504/how-to-convert-a-string-into-date/12497237#12497237 – user3357963

+0

@PeterT. Trong bảng, cột ngày được định dạng dưới dạng văn bản hoặc là ngày? – CaBieberach

+0

Được định dạng là Ngày – PeterT

Trả lời

1

Điều tốt nhất bạn có thể làm là KHÔNG BAO GIỜ chuyển đổi biến ngày thành Văn bản.

nội bộ cho excel một ngày chỉ là một số liên tiếp (còn lại từ dấu phân cách thập phân là ngày và ngay từ dấu thập phân là giờ). Vì vậy, ví dụ: ngày 10 tháng 6 năm 2012, đối với excel là . Giá trị ngày này độc lập với định dạng ngày được đặt trên máy tính của bạn.

Bây giờ khi nói đến ngày đại diện (để con người hình dung) Excel sẽ định dạng giá trị nội bộ này thành một Chuỗi có định dạng được đặt trong máy tính của bạn. Vì vậy, ví dụ nếu bạn có định dạng ngày của Mỹ trong máy tính của bạn, ngày 41188 sẽ được hình thành vào ngày 6/10/2012.

Thử thách lớn với ngày tháng là nhập ngày theo định dạng đúng.Khi bạn nhập ngày tháng dưới dạng chuỗi ("6/10/2012"), Excel sẽ diễn giải nó tùy thuộc vào định dạng ngày được đặt trên máy tính của bạn. Nếu bạn có định dạng Hoa Kỳ, sau đó nó sẽ tạo ra cypher đầu tiên theo tháng, thứ hai là ngày và cuối cùng là năm. Nếu bạn có một định dạng Đức, nó sẽ đọc đầu tiên là ngày, tiếp theo là tháng và cuối cùng là năm. Vì vậy, cùng một đầu vào ("6/10/2012") cho một định dạng Hoa Kỳ Excel sẽ đọc ngày 10 tháng sáu như đối với một định dạng Đức Excel sẽ đọc thứ 6 của tháng mười.

Trong trường hợp của bạn, bạn KHÔNG nên định dạng ngày bên trong Textbox10. Đối với định dạng Excel của Hoa Kỳ, không có vấn đề gì, nhưng nếu bạn có định dạng ngày khác, trong đó cypher đầu tiên là ngày thay vì tháng, bạn sẽ nhận được các giá trị sai: Kiểm tra ví dụ này. sử dụng đầu vào ngày 10 tháng sáu trong một định dạng Đức Excel (dd.mm.yyyy)

  1. Calendar1.Value lấy một giá trị ngày (41.188)
  2. Format(Calendar1.Value, "mm/dd/yyyy") biến đổi giá trị ngày thành một chuỗi "2012/06/10 "
  3. Khi sử dụng ngày được định dạng (STRING), Excel sẽ phải diễn giải ngày đó là ngày nào. Bởi vì định dạng ngày của máy tính là tiếng Đức, nó sẽ đọc Ngày: 06, Tháng: 10, Năm: 2012. Bạn sẽ được sử dụng ngày 41.070 thay vì

Nếu Calendar1.Value lấy một biến ngày và bạn cung cấp cho biến ngày này thành một ngày formated cột, bạn sẽ allways được dale đúng trong cột của bạn và bạn sẽ có thể lọc và sắp xếp ngày chính xác bất kể định dạng ngày được đặt bên trong ô Cột hoặc định dạng được đặt trong máy tính người dùng.


Bây giờ, tốt nhất là chỉ định trực tiếp Calendar1.Value cho ô được yêu cầu. Một cái gì đó như:

ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value 

Bạn vẫn có thể asign Calendar1.Value vào TextBox10 cho người sử dụng để xem lựa chọn của mình, nhưng vô hiệu hóa các TextBox10 để chỉnh sửa lựa chọn duy nhất là kiểm soát lịch. Và khi làm việc với ngày, istead của nó từ TextBox10, lấy nó trực tiếp từ Calendar1.Value.

Nếu bạn vẫn cần hiển thị giá trị đã chọn từ Lịch1 vào hộp văn bản thì KHÔNG định dạng ngày trong hộp văn bản. Thay vào đó, hãy sử dụng:

UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

Bằng cách này, người dùng sẽ thấy ngày trong ngày mà anh ta đã đặt trong máy tính của mình và người mà anh thường dùng.

+0

Cảm ơn bạn rất nhiều. Loại câu trả lời mà tôi đã tìm kiếm. – PeterT

0

Một giải pháp là không sử dụng định dạng số ngày mà chỉ sử dụng định dạng tùy chỉnh cho tất cả ngày di động của bạn nơi bạn chỉ định "mm/dd/yyyy" làm chuỗi định dạng. Tuy nhiên, theo kinh nghiệm của tôi, nếu cài đặt vùng của máy tính của bạn được thiết lập để sử dụng "mm/dd/yyyy" thì nếu bạn thử tạo một định dạng ô tùy chỉnh với cùng chuỗi excel này sẽ giữ như là một dater liên kết với cài đặt máy tính để không giúp bạn. Cách tôi làm việc xung quanh này là thay đổi định dạng ngày trên máy tính của tôi, sau đó định dạng các ô là "mm/dd/yyyy" tùy chỉnh và lưu (sau đó bật cài đặt của máy tính về cách chúng.) tuyên bố họ là các ô ngày, bạn sẽ thấy rằng việc thay đổi các cài đặt trên máy tính của bạn không thay đổi giá trị trong ô.

Tôi đoán một cách khác là luôn có một ô bên cạnh ô ngày của bạn gọi hàm TEXT. Vì vậy, nếu bạn có một ngày trong A1 thì trong một ô khác =TEXT(A1, "mm/dd/yyyy") và chỉ tham chiếu đến ô mới này. Nhưng điều đó có thể làm cho tấm trải giường của bạn rất lộn xộn.

Tôi đoán giải pháp tốt nhất là chỉ giúp bạn có được bộ phận CNTT để đặt mọi người trong cài đặt ngày của công ty để sử dụng cùng một định dạng.

+0

Dan, cảm ơn bạn đã trả lời. Điều đó là việc thay đổi định dạng ô thành tùy chỉnh sẽ gây ra sự cố của macro khác được sử dụng cho các chỉ số tính toán, trục xoay, v.v. Macro này yêu cầu định dạng ô được đặt vào ngày. Macro này được lưu trữ trên trang web khác.Ngoài ra, toàn bộ tập tin được cập nhật từ xa trên cơ sở yếu bởi chương trình, mà bộ tế bào hình thành trạng thái mặc định của nó (được thiết lập bởi chương trình). Nếu không có gì giúp, tôi đoán rằng tôi sẽ cần phải liên hệ với IT dept như bạn đề cập đến. Nhưng thành thật mà nói, tôi muốn tránh tình huống đó. – PeterT

+0

Vì vậy, trong kết luận, tôi không thể thay đổi bảng (thêm/loại bỏ cột/hàng, thay đổi định dạng, vv). Tôi chỉ có thể thay đổi mã VBA ghi dữ liệu vào bảng. – PeterT

+0

những gì về điều này: UserForm1.TextBox10.Value = Worksheetfunction.Text (Calendar1.Value, "mm/dd/yyyy") – Dan

Các vấn đề liên quan