Vấn đề về 1 và 001

giaiphapvba

Administrator
Thành viên BQT
Nếu bây giờ bạn nhập "001" bằng bàn phím vào cells rồi ấn Enter. Cái cells đó sẽ được hiển thị như thế nào nhỉ?
Câu trả lời chính xác là: Tùy thuộc vào thiết định định dạng cells mà hiển thị sẽ khác nhau. Giả sử như phạm vi A1:A5 được thiết định hiển thị là Text.
Bạn cần đăng nhập để thấy đính kèm


Bây giờ bạn nhập là 001, hay 002 hay 003 thì nó sẽ hiển thị đúng như vậy.
Bạn cần đăng nhập để thấy đính kèm


Bây giờ ta sẽ thử chạy đoạn code sau nhé:
Mã:
Sub Sample2()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "General" 'Đây là định dạng tiêu chuẩn. Nó có thể là số hoặc là ký tự. Tức là nó tùy biến thay đổi.
            .Value = Mid(.Value, 2)
        End With
    Next i
End Sub
Nếu dùng phím F5 để chạy lần lượt từng dòng lệnh, ta thấy rằng ở dòng lệnh thiết định Format, thì ký tự hiển thị vẫn là 001. Cho tới khi ta tách lấy ký tự, ở câu lệnh Mid, và giá trị cells bị thay đổi, định dạng cũng lập tức thay đổi theo. Kết quả của code trên sẽ là : 1,2,3 được hiển thị.
Do đó, nếu cần thiết, thì bạn nên thiết định rõ ràng định dạng là dạng số (Number), đừng để chung chung là General.
Quay trở về dữ liệu ban đầu:
Bạn cần đăng nhập để thấy đính kèm

Nếu bây giờ tôi thay đổi code:
Mã:
Sub Sample3()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "@"
            .Value = Mid(.Value, 2)
        End With
    Next i
End Sub
Kết quả được hiển thị bây giờ là : 01,02,03. Tức là các số 0 không bị mất đi, kết quả của lệnh Mid theo đúng ý đồ của chúng ta.

Bây giờ ta sang với vấn đề dữ liệu ngày tháng. Máy tính của mình đang thiết định là Năm tháng ngày. Do đó dữ liệu dưới đây cũng viết theo như vậy.
Nếu máy tính bạn thiết định là ngày tháng năm thì viết theo thứ tự đó nhé.
Bạn cần đăng nhập để thấy đính kèm

Bây giờ ta chạy code:
Mã:
Sub Sample4()
    Dim i As Long
    For i = 1 To 5
        Cells(i, 1) = Month(Cells(i, 1))
    Next i
End Sub
Kết quả không hề trơn tru tẹo nào.
Bạn cần đăng nhập để thấy đính kèm

Tôi can thiệp vào định dạng bằng đoạn code dưới đây và chạy lại:
Mã:
Sub Sample5()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "General"
            .Value = Month(.Value)
        End With
    Next i
End Sub
Kết quả bây giờ là :8,3,6,9,5. Đó cũng là kết quả theo đúng ý đồ của chúng ta, đó là lấy giá trị Tháng.
Như vậy, topic này tôi đã giới thiệu cho các bạn về định dạng cells có thể làm ảnh hưởng tới kết quả macro như thế nào. Do đó, để có kết quả chính xác, chúng ta phải xác định rõ định dạng của cells để can thiệp. Nếu không thì code của chúng ta mang ra các máy tính có thiết định khác nhau, không biết chừng sẽ cho ra kết quả rất khác nhau. Và có sự khác biệt rất lớn giữa code của một người có kinh nghiệm so với người mới bắt đầu học code, đó là họ phán đoán được các tình huống không mong muốn, và tỉ mỉ xử lý những vấn đề đó trong code.
Hiện nay các bạn tập trung vào các vấn đề nhỏ, các hàm hay thủ tục nhỏ lẻ. Phải chờ cho tới khi các bạn tự code được, thay vì đi nhờ hỗ trợ code, khi các bạn code cho nhiều người sử dụng, có các phản hồi về lỗi, kinh nghiệm của bạn sẽ nhiều lên. Tuy nhiên chờ tới lúc đó, chắc là cần nhiều thời gian. Vì vậy, thỉnh thoảng có những bài viết như thế này, tôi hi vọng hữu ích cho các bạn ngay từ quá trình bắt đầu học VBA.
Bài viết được diễn đàn tuhocvba.net tham khảo và dịch từ:
 
Top