Ngày tháng bị đảo ngược trong dictionary

Liên hệ QC

Anhduong2015

Thành viên chính thức
Tham gia
29/7/21
Bài viết
51
Được thích
12
Nhờ anh/chị giúp đỡ cụ thể: khi em xuất dữ liệu Dictionary nếu không dùng Tranpose thì hiện ngày/tháng/năm bình thường nhưng khi dùng Tranpose để dữ liệu hiển thị trong một cột thì hiển thị sai định dạng ngày tháng
Do kiến thức hạn hẹp cám ơn mọi sự giúp đỡ hoặc gợi ý ạ.
Help.jpg
 

File đính kèm

  • Copy.xlsb
    90.3 KB · Đọc: 10
Lần chỉnh sửa cuối:
Không liên quan gì chỗ nào khác.

Dính chưởng ở ngay đây này:

1650858979467.png

1/ Lần sau chụp hình thì chụp phun không che toàn màn hình để biết cái DateTime của máy tính là gì.
2/ Gửi file và code lên, chứ ảnh đẹp chỉ ngắm thôi.
 
Không liên quan gì chỗ nào khác.

Dính chưởng ở ngay đây này:

View attachment 274969

1/ Lần sau chụp hình thì chụp phun không che toàn màn hình để biết cái DateTime của máy tính là gì.
2/ Gửi file và code lên, chứ ảnh đẹp chỉ ngắm thôi.
Không phải chỗ Cdate đó anh ạ vì chỗ đó em đã Comment Block rồi.
Em test thử thì không có Transpose đổ ra dòng thì ra đúng mà thêm Transpose để chuyển qua cột thì không ra dạng Date.
Em có đính kèm lại file #1 rồi ạ. mong anh xem giúp
 

Đoán đúng luôn.
Dùng User form thì đừng có bao giờ dùng CDate() mà phải dùng DateSerial().
Nhiều bài nói cái này rồi.

Bằng chứng là ngày tháng ghi từ Form xuống bảng tính là ăn chuỗi chứ có phải DateTime xịn đâu. Nhìn E13 trở xuống đó.

1650870612435.png

1650870496683.png


* Thêm một cái nữa. Dữ liệu Number, DateTime đừng có canh lề, cứ để mặc định nhảy về bên phải của Cell. Để nhìn một phát là biết dữ liệu có đúng chuẩn không.
 
Đoán đúng luôn.
Dùng User form thì đừng có bao giờ dùng CDate() mà phải dùng DateSerial().
Nhiều bài nói cái này rồi.

Bằng chứng là ngày tháng ghi từ Form xuống bảng tính là ăn chuỗi chứ có phải DateTime xịn đâu. Nhìn E13 trở xuống đó.

View attachment 274988

View attachment 274987


* Thêm một cái nữa. Dữ liệu Number, DateTime đừng có canh lề, cứ để mặc định nhảy về bên phải của Cell. Để nhìn một phát là biết dữ liệu có đúng chuẩn không.
Không đúng nha anh. Cái này em dùng Sub trên Module s3_laytenngay không phải ghi từ Userform ạ.
 
Không đúng nha anh. Cái này em dùng Sub trên Module s3_laytenngay không phải ghi từ Userform ạ.

Tôi chỉ ra cái sai tận gốc rễ.

DateTime từ Form xuống bảng tính: Sai một phát nếu định dạng chuỗi DateTime đó khác thiết lập hệ thống.
DateTime lấy từ bảng tính lên mảng: Sai thêm một phát nữa nếu định dạng chuỗi DateTime đó khác thiết lập hệ thống.

Bạn từ từ tìm hiểu mà làm. Bí kíp, kỹ thuật tôi nêu hết rồi.

Đọc ----- thật ------ chậm ------ thôi.
 
Tôi chỉ ra cái sai tận gốc rễ.

DateTime từ Form xuống bảng tính: Sai một phát nếu định dạng chuỗi DateTime đó khác thiết lập hệ thống.
DateTime lấy từ bảng tính lên mảng: Sai thêm một phát nữa nếu định dạng chuỗi DateTime đó khác thiết lập hệ thống.

Bạn từ từ tìm hiểu mà làm. Bí kíp, kỹ thuật tôi nêu hết rồi.

Đọc ----- thật ------ chậm ------ thôi.
1. Đầu tiên cám ơn anh đã góp ý giúp em. Tuy nhiên trong trường hợp này thì cái gốc rễ không phải là ở điểm gán dữ liệu ngày tháng sử dụng Cdate từ Userform xuống Sheet vì em đã xóa trắng (Clear All) dữ liệu cột ngày tháng và nhập tay lại vẫn như cũ.
2. Vấn đề em thấy và đã chạy thực tế là khi sử dụng Application.WorksheetFunction.Transpose nó sẽ ra ngày tháng đảo ngược, ngược lại thì đúng.
 
1. Đầu tiên cám ơn anh đã góp ý giúp em. Tuy nhiên trong trường hợp này thì cái gốc rễ không phải là ở điểm gán dữ liệu ngày tháng sử dụng Cdate từ Userform xuống Sheet vì em đã xóa trắng (Clear All) dữ liệu cột ngày tháng và nhập tay lại vẫn như cũ.
2. Vấn đề em thấy và đã chạy thực tế là khi sử dụng Application.WorksheetFunction.Transpose nó sẽ ra ngày tháng đảo ngược, ngược lại thì đúng.
Đã kiểm tra thử thì đúng là sau khi transpose dic.keys ngày tháng bị đảo ngược. Mà lạ là nếu add key thông qua một biến long gán ngày tháng thì không lỗi, mà add trực tiếp thì lỗi.
Nguyên nhân thì không rõ, còn khắc phục thì add key ngày tháng bằng hàm Dateserial cho đảm bảo
File kiểm tra lỗi:
 

File đính kèm

  • Copy.xlsb
    32 KB · Đọc: 19
Đã kiểm tra thử thì đúng là sau khi transpose dic.keys ngày tháng bị đảo ngược. Mà lạ là nếu add key thông qua một biến long gán ngày tháng thì không lỗi, mà add trực tiếp thì lỗi.
Nguyên nhân thì không rõ, còn khắc phục thì add key ngày tháng bằng hàm Dateserial cho đảm bảo
File kiểm tra lỗi:
Cám ơn bạn nhiều nhé, mình đã thêm một biến long vào thì kết quả đã ra đúng. mặc dù không rõ tại sao nhưng kết quả đúng yêu cầu là tuyệt vời.
 

File đính kèm

  • Test_.2.xlsb
    17.9 KB · Đọc: 16
Không hề bị làm sao.
Vụ DateTime này mình nói rồi. Bạn để ý các bài của mình đều xử lý vậy.
Đúng là em cũng đọc nhiều bài và tìm hiểu thì Date Time nên dùng value2.
Nhưng vì sao thì thật tình cũng chưa tường tận lắm
Em cũng từng đọc qua bài này, có vẻ như họ khuyên nên dùng value2
1650881935122.png
Nhưng thắc mắc là tại sao trong nhiều bài code lại không dùng hẳn value2 (thấy hầu như value - trừ date time) , trong khi nó nhanh hơn và lấy giá trị chuẩn hơn???

https://stackoverflow.com/questions/17359835/what-is-the-difference-between-text-value-and-value2
 
Bill Gate luôn tạo ra những điều thú vị bất ngờ cho chúng ta xem. Kiểu long đã được đổi thành double, kiểu date thì lại thành string, Đây chính là điều mà chủ thớt này đã ngờ ngợ nhân ra. Sau khi chuyển về string, lúc viết xuống sheet thì excel lại can thiệt thêm một bước nữa gây ra kết quả khó đoán. Cái này chắc nhờ bạn nào viết cho cái hàm quay tay mới cho nhanh mà bảo đảm.


1650899932686.png
 
Nhân tiện các anh/ chị cho em hỏi thêm là trong câu lệnh: .Range("F10").Resize(, c2).Value = dic2.Keys làm sao để các kết quả cách nhau xen kẽ một cột. chỗ này hơi khó diễn tả anh/chị quan tâm xin vui lòng xem hình giúp em. Do cùng bài toán em sợ mở nhiều chủ đề không hay nên có gì không đúng mong anh/chị thông cảm giúp.
Xin cám ơn rất nhiều.
1.jpg

2.jpg
 

File đính kèm

  • Copy.xlsb
    87.2 KB · Đọc: 3
Nhân tiện các anh/ chị cho em hỏi thêm là trong câu lệnh: .Range("F10").Resize(, c2).Value = dic2.Keys làm sao để các kết quả cách nhau xen kẽ một cột. chỗ này hơi khó diễn tả anh/chị quan tâm xin vui lòng xem hình giúp em. Do cùng bài toán em sợ mở nhiều chủ đề không hay nên có gì không đúng mong anh/chị thông cảm giúp.
Xin cám ơn rất nhiều.
View attachment 275008

View attachment 275009
Không biết ai làm thế nào chứ với tôi thì tôi sẽ dùng 1 vòng lặp duyệt qua hết keys lấy kết quả vào 1 mảng thì mới chen vị trí chứa giá trị rỗng vào được.
 
Không biết ai làm thế nào chứ với tôi thì tôi sẽ dùng 1 vòng lặp duyệt qua hết keys lấy kết quả vào 1 mảng thì mới chen vị trí chứa giá trị rỗng vào được.
Anh/chị có thể giúp em đoạn code lấy key từ dic ra được không? Em viết mà mãi không được ạ.
 
Không biết ai làm thế nào chứ với tôi thì tôi sẽ dùng 1 vòng lặp duyệt qua hết keys lấy kết quả vào 1 mảng thì mới chen vị trí chứa giá trị rỗng vào được.
Hiện tại em mới nghĩ ra được code chạy thủ công như thế này kết quả đúng nhưng nhìn hơi củ chuối xíu.
Capture.PNG
 
Không biết ai làm thế nào chứ với tôi thì tôi sẽ dùng 1 vòng lặp duyệt qua hết keys lấy kết quả vào 1 mảng thì mới chen vị trí chứa giá trị rỗng vào được.

Ở bước làm việc với Dictionary object, anh ghi luôn keys cần lấy vào một mảng là được.

Dim mangTieuDe as variant, chiso as long
''
Redim mangTieuDe( 1 to so_phan_tu_xet_nghiem * 2)
chiso=1
''
'Trong vòng lặp '
objDic.add skey, item
mangTieuDe(chiso) = skey
chiso = chiso + 2

'Ghi kết quả vào bảng tính'
If chiso> 0 then Target.resize(1, chiso).value = mangTieuDe
 
Hiện tại em mới nghĩ ra được code chạy thủ công như thế này kết quả đúng nhưng nhìn hơi củ chuối xíu.
View attachment 275020
Tạo riêng cho nó cái mảng. Đưa nó vào mảng ngay từ lúc add key. Nếu Dic chưa có gì thì add vào cột đầu trong mảng rồi cho biến cột tăng dần, khi dic đã tồn tại key thì tăng biến cột thêm 1 nữa rồi add vào mảng... nếu khó hiểu thì bỏ qua nha...
 
Web KT
Back
Top Bottom