Chiêu 28: Trích xut d liu s trong 1 chui bng VBA
Bạn thường ly d liu t ngun ngoài, chng hn từ Internet, trong đó có dữ liu s
xen ln chữ như: “1,254.00VND” hoặc “USD 2,500.00”, thm chí còn phc tạp hơn.
cũng có khi bạn đã nhp liu hn hp text và s không theo quy lut nào để có th
ly riêng s ra bng các hàm tách chuỗi thông thường.
Dùng 1 hàm t to viết bng VBA, bn có th trích xut riêng phn s ra, dù cho chui
có kiu dng gì đi nữa.
Bn hãy nhn Alt-F11 để vào ca 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(sText) To 1 Step -1
If IsNumeric(Mid(sText, lCount, 1)) Then
lNum = Mid(sText, lCount, 1) & lNum
End If
Next lCount
ExtractNumber = CLng(lNum)
End Function
o li Excel, trong ô B1 gõ d liu s xen ln text tu ý, trong ô kế bên C1 gõ công
thc:
=ExtractNumber(B1)
Ta s kết quả như hình:
B sung:
Vn còn chút vn đề: nếu d liu là s thp phân như ô B5, hoặc d liu gm 2 nhóm s
riêng bit trn như ô B4, kết qu sẽ không như ý mun.
1. Để gii quyết vấn đề s thp phân, ptm0412 có 1 hàm khác:
PHP Code:
Comment [1]:
BEGIN TEMPLATE:
bbcode_php
Comment [2]:
END TEMPLATE:
bbcode_php
Comment [3]:
BEGIN TEMPLATE:
bbcode_php
Function CtoN(Mystr As String, Optional Dautp As String) As Double
Dim Kqng, Kqtp, Neg As Double, Kqtam As String
Dim Sotp As Double, Le As Byte
Neg = 1
Le = 0
For i = 1 To Len(Mystr)
tam = Mid(Mystr, i, 1)
Select Case tam
Case 0 To 9
Kqtam = Kqtam & tam
Case "-"
Neg = -1
Case Dautp
Kqng = Kqtam
Le = 1
Mystr = Right(Mystr, Len(Mystr) - i)
Kqtp = CtoN(Mystr)
Sotp = Kqtp * 10 ^ (-Len(Kqtp))
End Select
Next i
Select Case Le
Case 0
CtoN = IIf(Kqtam = "", 0, Kqtam)
Case 1
CtoN = Kqng + Sotp
End Select
CtoN = CtoN * Neg
End Function
Ghi c:- Khi s dng hàmy, bn s thêm vào hàm 1 tham s cho biết du thp phân
du nào, “,” hay .”. Thí d =CtoN(“USD 14255.20”,”.”), và nếu bn biết chc là s
nguyên thì không cn thêm.
- Hàm này đọc đưc c s âm nếu ký hiu s âm du trừ và đứng trưc s.
2. Để gii quyết vấn đề nhiu nhóm s khác nhau trong chui, Ptm0412 cũng có 1
hàm:
PHP Code:
Comment [4]:
END TEMPLATE:
bbcode_php
Comment [5]:
BEGIN TEMPLATE:
bbcode_php
Function CtoNPlus(Mystr As String, sttchuoi As Byte, Optional Dautp A
s String) As Double
Newstr = Mystr
For i = 1 To sttchuoi
If Len(Newstr) < 2 Then Exit For
CtoNPlus = CtoN1st(Newstr, Dautp)
Next i
Newstr = ""
End Function
PHP Code:
Function CtoN1st(ByVal Mystr As String, Optional Dautp As String) As D
ouble
Dim Kqng, Kqtp, Neg As Double, Kqtam As String
Dim Sotp As Double, Le As Byte, NewStr2 As String
Neg = 1
Le = 0
For i = 1 To Len(Mystr)
tam = Mid(Mystr, i, 1)
Select Case tam
Case 0 To 9
Kqtam = Kqtam & tam
If IsNumeric(Mid(Mystr, i + 1, 1)) = False And _
Mid(Mystr, i + 1, 1) <> "," And Mid(Mystr, i + 1, 1) <> "." Th
en
Newstr = Right(Mystr, Len(Mystr) - i)
Exit For
End If
Case "-"
Neg = -1
Case Dautp
Kqng = Kqtam
Le = 1
NewStr2 = Right(Mystr, Len(Mystr) - i)
Kqtp = CtoN1st(NewStr2)
Sotp = Kqtp * 10 ^ (-Len(Kqtp))
End Select
Next i
Select Case Le
Case 0
CtoN1st = IIf(Kqtam = "", 0, Kqtam)
Case 1
CtoN1st = Kqng + Sotp
End Select
Comment [6]:
END TEMPLATE:
bbcode_php
Comment [7]:
BEGIN TEMPLATE:
bbcode_php
CtoN1st = CtoN1st * Neg
End Function
Cú pháp hàm: CtoNPlus(Mystr , sttchuoi, [Dautp])
Sttchuoi là s th t nhóm s trong chui, Dautp là ký t du phân cách thp phân.
Xem file kèm theo.
Comment [8]:
END TEMPLATE:
bbcode_php