Phán đoán có phải là số hay không bằng VBA (hàm Isnumeric)

Euler

Administrator
Thành viên BQT
1. Hàm Isnumeric:
Hàm này sẽ phán đoán đối số bên trong là số hay không.
Chẳng hạn, dù cho cells của các bạn đang để định dạng là văn bản (text) nhưng nội dung bên trong ghi là "1.5" thì giá trị trả về của hàm này vẫn là True (xác nhận đây là số). Nếu không phải là số, trả giá trả về của hàm là False.
  • Isnumeric(a) = True nếu a là số
  • Isnumeric(a) = False nếu a không phải là số
2. Cấu trúc:
Function IsNumeric(Expression) As Boolean

ExpressionLà dữ liệu bạn chỉ định cho hàm để phán đoán dữ liệu này là số hay không
Giá trị trả về là kiểu BooleanLà True nếu Expression là số, là False nếu không phải là số.

3. Phạm Vi Hoạt Động:
Hàm Isnumeric có thể vẫn hoạt động dù cho tham số truyền vào là kiểu dữ liệu không rõ ràng.
Ví dụ: "-1.5" thì nó phán đoán là số. Nhưng nếu bạn thêm khoảng trống bằng dấu cách vào "-1.5 " thì nó vẫn trả về là TRUE.
Mã:
Sub test()
    If IsNumeric("-1.5 ") Then MsgBox "OK"
End Sub
Bạn cần đăng nhập để thấy đính kèm

Bạn thêm khoảng trống đằng trước hay sau, hàm này vẫn hoạt động.
Đối với các bạn Việt Nam thì không sao, nhưng với các bạn làm trong công ty Nhật, chúng ta biết tới chế độ gõ Zenkaku. Nếu bạn lo lắng Zenkaku có hoạt động hay không, câu trả lời là có. ”123” vẫn cho giá trị là TRUE.
Hoặc cách viết lũy thừa 10 như là "10e8", hàm này vẫn trả giá trị là TRUE.
Hoặc hệ Hexa "&H123", hàm này vẫn trả giá trị là TRUE...
Vì vậy, phải hiểu rõ phạm vi hoạt động của hàm này để đưa ra đối sách hợp lý, nếu không nó sẽ cho ra kết quả ngoài ý đồ của chúng ta.

4. Code mẫu:
Mã:
Sub IsNumericTest()
    Dim ar()
    Dim s
    Dim ret     As Boolean
    
    ret = IsNumeric("123456")
    If ret = True Then
        Debug.Print "La So"
    Else
        Debug.Print "Khong phai So"
    End If
    
    ReDim ar(6)
    
    ar(0) = "12345"         '// Kiểu gõ hankaku-người dùng tiếng nhật
    ar(1) = "123"        '// Kiểu gõ zenkaku-người dùng tiếng nhật
    ar(2) = "10e8"          '// Kiểu lũy thừa 10
    ar(3) = "&O123"         '// Hệ cơ số 8
    ar(4) = "&H123"         '// Hệ cơ số 16
    ar(5) = "\123,456.789"  '// Số tiền
    ar(6) = "123a"          '// Ký tự thông thường
    
    For Each s In ar
        ret = IsNumeric(s)
        '// Nếu là số
        If ret = True Then
            Debug.Print "True : " & s
        '// Không phải là số
        Else
            Debug.Print "False: " & s
        End If
    Next
End Sub
Kết quả:
Mã:
La So
True : 12345
True : 123
True : 10e8
True : &O123
True : &H123
True : \123,456.789
False: 123a
Có lẽ bạn maiban2068 (đã bị xóa nick) hiểu được tầm hoạt động này, và vận dụng vào dữ liệu mà bạn @hocmoi đã cho nên đã có xử lý trông có vẻ dài hơn bạn @NhanSu , nhưng thực ra theo tôi là rất có ý đồ.

Tham khảo ở:
 
Top