Wednesday, April 25, 2012

Chiêu 28: Trích xuất dữ liệu số trong 1 chuỗi bằng VBA


Chiêu 28: Trích xuất dữ liệu số trong 1 chuỗi bằng VBA


Bạn thường lấy dữ liệu từ nguồn ngoài, chẳng hạn từ Internet, trong đó có dữ liệu số xen lẫn chữ như: "1,254.00VND" hoặc "USD 2,500.00", thậm chí còn phức tạp hơn.
Và cũng có khi bạn đã nhập liệu hỗn hợp text và số không theo quy luật nào để có thể lấy riêng số ra bằng các hàm tách chuỗi thông thường.
Dùng 1 hàm tự tạo viết bằng VBA, bạn có thể trích xuất riêng phần số ra, dù cho chuỗi có kiểu dạng gì đi nữa.
Bạn hãy nhấn Alt-F11 để vào cửa sổ VBA, insert 1 module và dán đoạn code sau vào:

PHP Code:

Function ExtractNumber(rCell As Range)
Dim lCount As Long
Dim sText As String
Dim lNum As String
sText rCell
For lCount Len(sTextTo 1 Step -1
If IsNumeric(Mid(sTextlCount1)) Then
lNum Mid(sTextlCount1) & lNum
End If
Next lCount
ExtractNumber CLng(lNum)
End Function 

Vào lại Excel, trong ô B1 gõ dữ liệu số xen lẫn text tuỳ ý, trong ô kế bên C1 gõ công thức:
=ExtractNumber(B1)
Ta sẽ có kết quả như hình:



Bổ sung:

Vẫn còn chút vấn đề: nếu dữ liệu là số thập phân như ô B5, hoặc dữ liệu gồm 2 nhóm số riêng biệt trở lên như ô B4, kết quả sẽ không như ý muốn.

1. Để giải quyết vấn đề số thập phân, ptm0412 có 1 hàm khác:

PHP Code:

Function CtoN(Mystr As StringOptional Dautp As String) As Double
Dim KqngKqtpNeg  As DoubleKqtam As String
Dim Sotp As DoubleLe As Byte
Neg 1
Le 0
For 1 To Len(Mystr)
    tam Mid(Mystri1)
    Select Case tam
        Case 0 To 9
            Kqtam Kqtam tam
        Case "-"
            Neg = -1
        Case Dautp
            Kqng Kqtam
            Le 1
            Mystr Right(MystrLen(Mystr) - i)
            Kqtp CtoN(Mystr)
            Sotp Kqtp 10 ^ (-Len(Kqtp))
        End Select
Next i
Select Case Le
Case 0
CtoN IIf(Kqtam ""0Kqtam)
Case 1
CtoN Kqng Sotp
End Select
CtoN CtoN Neg
End Function 

Ghi chú:- Khi sử dụng hàm này, bạn sẽ thêm vào hàm 1 tham số cho biết dấu thập phân là dấu nào, "," hay ".". Thí dụ =CtoN("USD 14255.20","."), và nếu bạn biết chắc là số nguyên thì không cần thêm.
- Hàm này đọc được cả số âm nếu ký hiệu số âm là dấu trừ và đứng trước số.


2. Để giải quyết vấn đề nhiều nhóm số khác nhau trong chuỗi, Ptm0412 cũng có 1 hàm:

PHP Code:

 Function CtoNPlus(Mystr As Stringsttchuoi As ByteOptional Dautp As String) As Double
Newstr Mystr
For 1 To sttchuoi
If Len(Newstr) < 2 Then Exit For
CtoNPlus CtoN1st(NewstrDautp)
Next i
Newstr ""
End Function 

PHP Code:

Function CtoN1st(ByVal Mystr As StringOptional Dautp As String) As Double
Dim KqngKqtpNeg  As DoubleKqtam As String
Dim Sotp As DoubleLe As ByteNewStr2 As String
Neg 1
Le 0
For 1 To Len(Mystr)
    tam Mid(Mystri1)
    Select Case tam
        Case 0 To 9
            Kqtam Kqtam tam
        If IsNumeric(Mid(Mystr11)) = False And _
        Mid(Mystr11) <> "," And Mid(Mystr11) <> "." Then
      Newstr Right(MystrLen(Mystr) - i)

        Exit For
        End If
        Case "-"
            Neg = -1
        Case Dautp
            Kqng Kqtam
            Le 1
            NewStr2 Right(MystrLen(Mystr) - i)
            Kqtp CtoN1st(NewStr2)
            Sotp Kqtp 10 ^ (-Len(Kqtp))

        End Select
Next i
Select Case Le
Case 0
CtoN1st IIf(Kqtam ""0Kqtam)
Case 1

CtoN1st Kqng Sotp
End Select
CtoN1st CtoN1st Neg
End Function 


Cú pháp hàm: CtoNPlus(Mystr , sttchuoi, [Dautp])
Sttchuoi là số thứ tự nhóm số trong chuỗi, Dautp là ký tự dấu phân cách thập phân.

Xem file kèm theo.

 

 

No comments:

Post a Comment