lamthaiql87
Tổng số bài gửi : 201 Điểm tích lũy : 4977 Thích : 0 Tham gia : 10/02/2012
| Tiêu đề: Trích xuất dữ liệu số trong 1 chuỗi bằng VBA Mon Feb 27, 2012 11:53 am | |
|
Các giá trị số (number) trong Excel được mặc định canh lề phải và văn bản (text) thì canh lế trái. Do vậy, cách đơn giản để nhận biết các giá trị số và văn bản trong một cột trên bảng tính là bạn thiết lập chế độ canh lề mặc định cho cột đó. Bạn vào Home ➝ nhóm Alignment ➝ chọn Format Cells ➝ vào ngăn Alignment (E2003: Format ➝ Cells ➝ Alignment) ➝ chọn General tại hộp Horizontal để thiết lập việc canh lề mặc định cho cột đang chọn ➝ nhấn OK để đóng hộp thoại Format Cells lại.
Bạn kéo cột rộng ra một ít để đễ phân biệt việc canh lề, khi đó bạn sẽ thấy các giá trị số, ngày tháng sẽ được canh lề phải và văn bản sẽ được canh lề trái.
Dùng Paste Special để chuyển giá trị số dạng văn bản sang số thực
Đây là cách nhanh và dễ dàng nhất để chuyển các giá trị số dang văn bản sang số thực. Các bước thực hiện như sau:
Chọn một ô trống nào đó và nhấn lệnh Copy (Ctrl + C)➝ quét chọn vùng số liệu dạng văn bản định chuyển đổi (ví dụ như vùng A1:A9 ở hình trên) ➝ nhấp phải chuột và chọn Paste Special… ➝ chọn Add tại nhóm Operation ➝ nhấn OK để hoàn tất.
Việc làm trên sẽ giúp chuyển toàn số các con số dạng văn bản sang số thực, vì ô rỗng có giá trị là 0 và khi bạn cộng bất kỳ số nào vào một con số lưu dưới dạng văn bản trong Excel thì bạn đã làm cho con số dạng văn bản chuyển thành số thực.
Dùng các hàm TEXT để chuyển đổi
Bạn có thể áp dụng nguyên tắc như cách trên vào một số hàm có sẵn của Excel để thực hiện việc chuyển đổi. Thông thường, khi bạn dùng một hàm thuộc nhóm TEXT và kết quả trả về dưới dạng con số thì Excel vẫn xem con số đó là giá trị dạng văn bản.
Giả sử bạn có một vùng dữ liệu A1:A7 như hình sau:
Bạn dùng hai hàm trong nhóm TEXT là LEFT và FIND để tách các giá trị ra khỏi các chuỗi văn bản như sau:
=LEFT(A1,FIND(" ",A1)-1)
Sau khi dùng hàm để tách phần giá trị ra thì các kết quả trả về vẫn được Excel xem như là văn bản vì chúng được canh lề trái như hình sau:
Do vậy, bạn cần phải hiệu chỉnh công thức tác chuỗi trên một ít để kết quả trả về là các con số thực sự bằng cách cộng thêm số 0 vào sau công thức trên:
=LEFT(A1,FIND(" ",A1)-1) + 0
MỤC LỤC Những tuyệt chiêu trong Excel
Tập tin đính kèm
Hack27.zip (4.8 KB, 2284 lần tải)
thay đổi nội dung bởi: BNTT, 23-11-08 lúc 11:09 PM Danh mục bài viết tổng hợp của GPE | Mỗi ngày một "tuyệt chiêu" | Hướng dẫn sử dụng Crystal Ball | Giáo trình: Excel 2007 | Excel trong kinh tế Phần 1 | Phần 2 | PowerPoint 2010 Linh tinh: SubTotal | Hàm & Công thức mảng | Offset | Excel 97-2003 Options | Các loại tham chiếu | Vẽ biểu đồ | Custom Format | Khoá & mở khoá tập tin Excel | Định dạng theo điều kiện Câu đố: 1 | 2 | 3 | 4 | 5 ... Trả Lời Với Trích Dẫn
Có 46 thành viên cảm ơn TranThanhPhong về bài viết này:
246hanguyen,
abc 2009,
anguyen,
ararechan,
bienthuy,
binhan007,
binhnvvn,
BNTT,
bongcnhh,
carrotchip,
cadafi,
cuongnt63,
damsan1989,
dohuuthuc,
Harry_Potter,
hatnang87,
hoanbt,
Hoàng Trọng Nghĩa,
honeyphuc84,
hong gam,
HUE2007,
hung127,
hylam,
jnho,
jv251285,
knthanhkim,
Maria2005,
ngocthegian,
nhâm quân,
nonzero,
phamducthuandv,
Po_Pikachu,
rockaruouaem,
sihau,
songvui,
son_sajv,
TEX,
thanhsonhanhngo,
thehungqnu,
thuysonphuong,
titan_gpe,
tranphongvu,
tungnguyen1045,
vinhsonghinh,
welcome2mylife,
Xung_Doanh
16-11-08, 09:50 PM #33
ptm0412
Excel Ordinary Member
Tham gia ngày11 2007Nơi Cư NgụGò VấpBài gởi6,511Cảm ơn3,567Được cảm ơn 16,636 lần trong 5,794 bài viết
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(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
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 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 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 String, sttchuoi As Byte, Optional Dautp As 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 Double
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) <> "." Then
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
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.
MỤC LỤC Những tuyệt chiêu trong Excel
Tập tin đính kèm
ExtractNumber.xls (41.5 KB, 2027 lần tải)
| |
|