Lỗi định dạng ngày tháng khi dùng hàm format trong VBA ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị :D
Em lại gặp một lỗi trong quá trình viết code^^ mong các anh cùng em khắc phục lỗi này nhé :>
Hiện tại em có một file và muốn chỉnh sửa định dạng ngày ở cột A và em có viết code như sau:
1655545848591.png
Nhưng sau khi chạy xong thì :
Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải , còn cứ ngày nào có số đầu tiên mà khác không thì ngày đó bị nhảy sang bên trái mặc dù em kiểm tra tất cả đều là định dạng "Date"
1655545936526.png
Em không rõ nguyên nhân vì sao định dạng ngày nó bị nhảy như vậy . Mong các anh chị giải thích và khắc phục lỗi dựa vào file code em viết giúp em :> ( Em lưu code ở trong Module 1)
 

File đính kèm

  • ADBO.xlsm
    19.2 KB · Đọc: 12
mặc dù em kiểm tra tất cả đều là định dạng "Date"
Kiểm tra định dạng là Date chả nói lên điều gì. Tôi chọn ô bất kỳ và nhập Ngày mai em đi -> tôi định dạng là Date. Có được phép không? Quá được, ai cấm được tôi. Bây giờ bạn kiểm tra lại thì thấy ô có định dạng là Date. Nhưng Ngày mai em đi đâu có phải là ngày tháng. Định dạng thì thoải mái, cái quan trọng là dữ liệu có đúng thế không. Nếu dữ liệu ở dạng text thì dù có định dạng là Date thì đến mùa quít nó vẫn không thể là ngày tháng chuẩn.

Trong tất cả các trường hợp như này bạn dùng ...
Chọn dữ liệu cột A ở thời điểm ban đầu -> thẻ Data -> Text to columns -> Next -> Next -> chọn option Date -> bên cạnh chọn DMY nếu chưa có -> nhấn Finish

Nếu ai đó bắt tôi dùng code thì
Mã:
Sub Format1()
Dim lastRow As Long, r As Long, Arr()
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    If lastRow < 2 Then Exit Sub
    Arr = Sheet1.Range("A2:A" & lastRow + 1).Value  ' lay du 1 dong
    
    For r = 1 To UBound(Arr) - 1    ' khong xet dong lay du
        Arr(r, 1) = DateSerial(Mid(Arr(r, 1), 7), Mid(Arr(r, 1), 4, 2), Mid(Arr(r, 1), 1, 2))
    Next r
    Sheet1.Range("A2").Resize(UBound(Arr, 1)).Value = Arr
End Sub
 
Upvote 0
Kiểm tra định dạng là Date chả nói lên điều gì. Tôi chọn ô bất kỳ và nhập Ngày mai em đi -> tôi định dạng là Date. Có được phép không? Quá được, ai cấm được tôi. Bây giờ bạn kiểm tra lại thì thấy ô có định dạng là Date. Nhưng Ngày mai em đi đâu có phải là ngày tháng. Định dạng thì thoải mái, cái quan trọng là dữ liệu có đúng thế không. Nếu dữ liệu ở dạng text thì dù có định dạng là Date thì đến mùa quít nó vẫn không thể là ngày tháng chuẩn.
Em dựa vào cách anh trả lời thì em có thấy có chút mâu thuẫn như sau . Mong anh giải thích tiếp giúp em ^^
Theo như em biết nếu mà nhập số vào một ô bất kì thì nó giá trị đó sẽ tự động nhảy sang phải , điều này ngược lại với khi ta nhập một chữ vào trong một ô bất kì. Vậy giả sử sau khi chạy code :
Nhưng sau khi chạy xong thì :
Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải , còn cứ ngày nào có số đầu tiên mà khác không thì ngày đó bị nhảy sang bên trái mặc dù em kiểm tra tất cả đều là định dạng "Date"
1655545936526.png
Các ô có giá trị mà nhảy sang phải là có định dạng số còn các ô mà nhảy sang trái có định dạng văn bản
Lúc này có thể nói
Ô A1 tương đương với số 9
Ô A2 tương đương với "Ngày Mai em đi" :>
Tức là lúc này khi định dạng date cho các ô A1 , A2 , A3 , A4 , ... , A44 thì nó sẽ không hoạt động giống như cách định dạng date cho số 9 hoặc "Ngày Mai em đi" vậy
nhưng mà khi em thử với hàng loạt định dạng date thì có cái nó nhảy sang trái , có cái nó nhảy sang phải mà không theo quy luật gì cả . Và tất cả đều chuyển được định dạng (Mâu thuẫn với điều anh giải thích)
1655556924380.png
Còn cách khắc phục anh đưa ra thì em thấy rất ổn rồi ạ ^^
 

File đính kèm

  • ADBO.xlsm
    24.4 KB · Đọc: 10
Upvote 0
Em dựa vào cách anh trả lời thì em có thấy có chút mâu thuẫn như sau . Mong anh giải thích tiếp giúp em ^^
Theo như em biết nếu mà nhập số vào một ô bất kì thì nó giá trị đó sẽ tự động nhảy sang phải , điều này ngược lại với khi ta nhập một chữ vào trong một ô bất kì. Vậy giả sử sau khi chạy code :
Không có gì mâu thuẫn cả. Tôi nói là dữ liệu phải là ngày tháng còn nếu là text thì chỉ với cách định dạng không thể đưa chúng về ngày tháng chuẩn. Tôi nói về cách định dạng bằng tay trong cửa sổ mà bạn phải chuột bằng tay rồi chọn Date. Thực ra bạn thắc mắc là tại sao định dạng là Date mà dữ liệu không là Date. Vì thế tôi mới cố tình chỉ ra cho bạn là định dạng Date chả là cái đinh gì khi dữ liệu không được cho là ngày tháng. Đực rựa dù có mặc váy, tô son độn ngực mặc áo 2 dây thì muôn đời chỉ là đực rựa, không thể là hot girl nóng bỏng đươc.

Có chỗ nào tôi bàn tới hàm Format của bạn đâu? Dù là nửa từ.

Mà hàm Format ở bài #1 cho kết quả lỗi còn gì. Ngay cả những kết quả nằm bên phải. Vd. khi mở trên máy tôi thì A4 = 02.09.2016 (mồng 2 tháng 9 năm 2016) trong khi nhìn dữ liệu gốc thì kết quả phải là A4 = 09.02.2016

Ở bài #1 bạn cho là "cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải". Không phải thế, vd. A22 = 12.12.2016 làm gì có chữ số 0 ở đầu. Thực ra những chỗ mà 2 ký tự đầu tạo thành số <= 12 (dạng mmddyyyy) thì được chuyển sang phải.
 
Upvote 0
Nhưng sau khi chạy xong thì :
Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải , còn cứ ngày nào có số đầu tiên mà khác không thì ngày đó bị nhảy sang bên trái mặc dù em kiểm tra tất cả đều là định dạng "Date"
Ngoài cái sai mà bài 2 đã chỉ ra, còn mấy cái sai mà bạn nhận định sai:
1. "Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải"

Các ô tôi tô màu trong hình sau, có số 0 ở đầu đâu mà cũng chạy sang phải?

1655563930133.png

Nhận định sau đây đúng hơn: Tất cả ô có 2 số đầu nhỏ hơn 13 đều nhảy sang phải

2. Kết quả nhảy sang phải là đúng
Trong hình sau, những ô tô màu xanh có vẻ khác nhau mà đúng chỗ nào? Ví dụ ô A1 và C1 là "một tháng sáu" hay "sáu tháng một"?

1655564384864.png

Cho nên vấn đề không chỉ ở chỗ dữ liệu gốc là text, mà còn ở chỗ không biết rằng trong VBA, chỉ hiểu ngày dạng text chỉ duy nhất 1 dạng là tháng trước ngày sau. Hậu quả:
- Hai số đầu là 12 trở xuống, thì được. 13 trở lên thì trong lịch không có tháng đó
- 06.01.2016 thay thế chấm bằng gạch xéo, trở thành 06/01/2016, được VBA hiểu là ngày một tháng sáu.
 
Upvote 0
Vụ số 0 ở đầu tôi cũng có nói trong bài #4.
 
Upvote 0
Upvote 0
Em chào các anh chị :D
Em lại gặp một lỗi trong quá trình viết code^^ mong các anh cùng em khắc phục lỗi này nhé :>
Hiện tại em có một file và muốn chỉnh sửa định dạng ngày ở cột A và em có viết code như sau:
View attachment 277517
Nhưng sau khi chạy xong thì :
Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải , còn cứ ngày nào có số đầu tiên mà khác không thì ngày đó bị nhảy sang bên trái mặc dù em kiểm tra tất cả đều là định dạng "Date"
View attachment 277518
Em không rõ nguyên nhân vì sao định dạng ngày nó bị nhảy như vậy . Mong các anh chị giải thích và khắc phục lỗi dựa vào file code em viết giúp em :> ( Em lưu code ở trong Module 1)
Tôi thì không biết nhiều về lý thuyết, nhưng dựa vào thực tiễn thực hành thì chỉ cho bạn cách nhận biết như sau:
Nếu khi chọn định dạng cho một ô ngày tháng, mà tất cả cả định dạng đều hiển thị giống nhau thì nó là dạng text
1655566283543.png

Tất cả đều hiển thị 23/01/2016 thì nó là dạng text
Và tại sao 2 ký tự đầu mà lớn thì dạng text, mà nhỏ thì lại date. Lúc đó đặt ngay nghi vấn là có lẽ định dạng đang là mm/dd/yyyy nên không có dụ tháng >12. Lúc đó lại thử tiếp:
Đặt công thức month(a2) xem nó ra cái gì, thì đúng là 6/1/2016 có month bằng 6 tức là chính xác định dạng đang là mm/dd/yyyy
1655566518874.png

Đấy là cách xác định vấn đề. biết được vấn đề thì tìm cách xử lý code thôi
Cách thì củ chuối nhưng đảm bảo với bạn là nếu chọn vào định dạng của 1 ngày mà tất cả đều hiển thị giống nhau tức là chuỗi đó đang là text. Cách để phát hiện nhanh thôi
 
Upvote 0
Tôi thì nghĩ là cứ chọn Alignment = General mà thấy nó nằm bên trái thì là TEXT (không là số chuẩn). Chả phải kiểm tra gì thêm.
 
Upvote 0
Dạ vâng ạ ! Em đã đọc hết bài của các anh rồi ạ. Và cũng đã hiểu được lý do tại sao gây ra lỗi , cách phát hiện và truy dấu vết lỗi (mạch tư duy khi gặp lỗi) . Em cảm ơn các anh nhiều lắm <3 Cảm ơn các anh đã chịu bỏ thời gian ra để cùng em sửa những thứ chưa được hoàn thiện ^^ . Em cảm ơn !
 
Upvote 0
Cô bé này đang ở giai đoạn học tập, lý ra học về bảng tính trải rộng trước, không có lý do gì tiếp cận ngược, đốt cháy giai đoạn.
Tìm hiểu các đối tượng của bảng tính, học cách xây dựng bảng tính đúng chuẩn, các loại dữ liệu... thành thạo rồi mới tới VBA.
 
Upvote 0
Cô bé này đang ở giai đoạn học tập, lý ra học về bảng tính trải rộng trước, không có lý do gì tiếp cận ngược, đốt cháy giai đoạn.
Tìm hiểu các đối tượng của bảng tính, học cách xây dựng bảng tính đúng chuẩn, các loại dữ liệu... thành thạo rồi mới tới VBA.
Mai Siêu Phong luyện Cửu âm chân kinh thời @
 
Upvote 0
Em chào các anh chị :D
Em lại gặp một lỗi trong quá trình viết code^^ mong các anh cùng em khắc phục lỗi này nhé :>
Hiện tại em có một file và muốn chỉnh sửa định dạng ngày ở cột A và em có viết code như sau:
View attachment 277517
Nhưng sau khi chạy xong thì :
Cứ ngày nào có số 0 ở đầu thì nó nhảy sang bên tay phải , còn cứ ngày nào có số đầu tiên mà khác không thì ngày đó bị nhảy sang bên trái mặc dù em kiểm tra tất cả đều là định dạng "Date"
View attachment 277518
Em không rõ nguyên nhân vì sao định dạng ngày nó bị nhảy như vậy . Mong các anh chị giải thích và khắc phục lỗi dựa vào file code em viết giúp em :> ( Em lưu code ở trong Module 1)
MÌNH NGHĨ DO BẠN CHỌN ĐỊNH DẠNG NGÀY KHÁC VỚI ĐỊNH DẠNG NGÀY GIỜ CỦA MÁY TÍNH
1655577152784.png
 
Upvote 0
MÌNH NGHĨ DO BẠN CHỌN ĐỊNH DẠNG NGÀY KHÁC VỚI ĐỊNH DẠNG NGÀY GIỜ CỦA MÁY TÍNH
View attachment 277537
Không đúng. VBA luôn hiểu ngày dạng text (04.01.2016) là tháng trước ngày sau bất kể thiết lập của control panel ("NGÀY GIỜ CỦA MÁY TÍNH").
Một việc khác mà VBA độc lập tự chủ với thiết lập control panel là định dạng dấu phân cách hàng ngàn và dấu thập phân. Dù cho thiết lập dấu phân cách hàng ngàn kiểu Việt nam là 1.234,50, nhưng muốn hiển thị như vậy thì câu lệnh VBA cũng cứ phải viết "#,###.#0" mới còn nguyên là dạng number.
 
Upvote 0
Tôi thì không biết nhiều về lý thuyết, nhưng dựa vào thực tiễn thực hành thì...
Không phải do lý thuyết với thực hành gì cả. Đương sự chỉ thiếu kinh nghiệm thôi.
Những gì bạn biết và chỉ dẫn ở trên, cũng như các người khác chỉ dẫn ở đây nó là tích tụ của kinh nghiệm nhiều năm.

Tôi làm quản lý phát triển đồ án phần mềm nhiều năm, kinh nghiệm làm với bọn Lập Trình Viên, Sếp LTV,... cho thấy: học là mọt chuyện, lúc gặp vấn đề, liên hệ đến cái mình đã học và đem ra áp dụng là chuyện khác. Khả năng giải quyết vấn đề cần 3 yếu tố:
1. Khả năng tư duy (trí tuệ)
2. Kiến thức học
3. Kiến thức kinh nghiệm.

Cô bé này đang ở giai đoạn học tập, lý ra học về bảng tính trải rộng trước, không có lý do gì tiếp cận ngược, đốt cháy giai đoạn.
Tìm hiểu các đối tượng của bảng tính, học cách xây dựng bảng tính đúng chuẩn, các loại dữ liệu... thành thạo rồi mới tới VBA.
Như tôi nói ở trên. Chỉ thiếu kinh nghiệm thôi.
Ở thớt trước tôi có nhắc nhở chuyện "thử cho nhiều vào"
Thử không mất tiền. Hỏi cũng không mất tiền. Nhưng các bạn trẻ thường chọn cái thứ hai bởi vì "tự tin" rằng đầu óc mình có thể học nhanh. Quan niệm chung là: hỏi thì vận não, thực hành thử thì vận sức, và tốn thì giờ.
Tôi thì qua kinh nghiệm huấn luyện lập trình viên (*1), biết rằng: kinh nghiệm quan trọng không kém trí tuệ. Cách duy nhất để tích lũy kinh nghiệm là ra sức làm thật nhiều. Học thì làm bài tập thật nhiều.
Ngày xưa đi học toán, có ai không mang bài tập về nhà làm? Có ai làm toán nhân mà không cần thuộc lòng bảng cửu chương? (*2)

(*1) tôi không huấn luyện theo trường lớp. Tôi thường dạy cho mấy thằng LTV trong đồ án của tôi, khi cần. Các sếp của chúng (các bạn gọi là Leader) chưa đủ kinh nghiệm về huấn luyện.
(xin lỗi tôi quen gọi tụi nhỏ là "thằng", tuy rằng cũng có nhiều "con bé")

(*2) quan niệm "thuộc lòng bảng cửu chương" hiện nay còn đúng nhưng có thể trong tương lai gần sẽ sai, khi mà người ta có thể mang cái máy gì đó ngay trong người, nói nhỏ vào lỗ tai kết quả các con tính.
Hiện nay, ở nhiều nước Âu Tây, hay nhiều tiểu bang Mẽo, người ta đã không dạy tiểu học cách chia cho các số trên 10 (gọi là long division). Cách dạy ấy dựa vào quan điểm "các con toán khó đã có máy tính"

Mai Siêu Phong luyện Cửu âm chân kinh thời @
Tạ Tốn học kiến thức thiên hạ chứ.
Mai Siêu Phong chỉ luyện võ. Tạ Tốn là văn võ kiêm toàn. Trong đại hội khoe đao, Kim Mao Sư Vương thách mọi người đấu với y bằng bất cứ môn gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải do lý thuyết với thực hành gì cả. Đương sự chỉ thiếu kinh nghiệm thôi.
Đúng vậy. Hồi tôi còn đi làm kế toán, in báo cáo từ excel để nộp phải định dạng ngày VN, dấu phân cách hàng ngàn là dấu chấm. Khi ti toe lập trình thấy kết quả sai. Làm lại cho đúng và nhớ tới giờ. Chỉ cần sai 1 lần thôi.

hỏi thì vận não, thực hành thử thì vận sức, và tốn thì giờ.

Thực hành thử thì nhớ lâu hơn. Hỏi thì có khi gặp lão ct vừa trả lời vừa mắng cho.
 
Upvote 0
Đúng vậy. Hồi tôi còn đi làm kế toán, in báo cáo từ excel để nộp phải định dạng ngày VN, dấu phân cách hàng ngàn là dấu chấm. Khi ti toe lập trình thấy kết quả sai. Làm lại cho đúng và nhớ tới giờ. Chỉ cần sai 1 lần thôi.



Thực hành thử thì nhớ lâu hơn. Hỏi thì có khi gặp lão ct vừa trả lời vừa mắng cho.
Cho mình hỏi, các bác có học khóa excel với Vba nào không sao đỉnh quá vậy, mình thì đang tự học đây mà khó quá
 
Upvote 0
Cho mình hỏi, các bác có học khóa excel với Vba nào không sao đỉnh quá vậy, mình thì đang tự học đây mà khó quá
K-i-n-h N-g-h-i-ệ-m, do chí kiên trì ra.
Cha nội này làm việc với Excel ít nhất là 25 năm.

Nếu bạn học dưới 5 năm thì đừng nói đến từ "khó quá".
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom