Tách riêng số từ chuỗi

Liên hệ QC

lacquan1

Thành viên mới
Tham gia
20/6/06
Bài viết
45
Được thích
23
ô A1: 0.12mm-5.6cm*50md*180mtrs
A2: 0.15mm-11.0cm*75md*360mtrs
làm sao tách B1:0.12, B2:0.15; c1:5.6, c2:11.0; d1:180,d2:360
xin chỉ giúp cảm ơn nhiều
 
ô A1: 0.12mm-5.6cm*50md*180mtrs
A2: 0.15mm-11.0cm*75md*360mtrs
làm sao tách B1:0.12, B2:0.15; c1:5.6, c2:11.0; d1:180,d2:360
xin chỉ giúp cảm ơn nhiều
Cái này dùng VBA sẽ nhẹ hơn!
Thử code này xem:
PHP:
Function TachSo(Chuoi As String, Vitri As Long) As String
  Dim Temp1 As String, Temp2 As Variant
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9.]"
    Temp1 = .Replace(Chuoi, " ")
  End With
  Temp2 = Split(WorksheetFunction.Trim(Temp1), " ")
  TachSo = Temp2(Vitri - 1)
End Function
Không có vòng lập nào nhé
 

File đính kèm

  • Tachso_1.xls
    19.5 KB · Đọc: 1,030
(Spam tí) Ước gì mình được như anh ấy! **~**
Bạn ơi! Mấy kiến thức ấy không phải tôi tự nghĩ ra (đâu có giỏi thế)... Chẳng qua là... Google mỗi khi.. bí
Kiến thức ấy tôi tìm được ở đây:
http://groups.google.com/group/microsoft.public.excel.worksheet.functions/msg/d2d252b4201d9d22
(thật ra khi áp dụng cũng có vài chổ chưa hiểu mấy ---> Tay ngang mà)
Bạn cũng sẽ được thế (thấm chí còn giỏi hơn) nếu bạn biết khai thác tối đa thông tin trên mạng
 
ô A1: 0.12mm-5.6cm*50md*180mtrs
A2: 0.15mm-11.0cm*75md*360mtrs
làm sao tách B1:0.12, B2:0.15; c1:5.6, c2:11.0; d1:180,d2:360
xin chỉ giúp cảm ơn nhiều

Gửi bạn cách dùng bằng công thức và VBA :
PHP:
Function GetNum(Str As String, Opt As Byte) As Double
Dim Arr
Str = Replace(Replace(Replace(Replace(Replace(LCase(Str), " ", ""), _
                "mm-", " "), "cm*", " "), "md*", " "), "mtrs", "")
Arr = Split(Str, " ")
GetNum = Switch(Opt = 1, Arr(0), Opt = 2, Arr(1), Opt = 3, Arr(2), Opt = 4, Arr(3))
End Function
 

File đính kèm

  • GetNumFormString.xls
    35 KB · Đọc: 353
Gửi bạn cách dùng bằng công thức và VBA :
PHP:
Function GetNum(Str As String, Opt As Byte) As Double
Dim Arr
Str = Replace(Replace(Replace(Replace(Replace(LCase(Str), " ", ""), _
                "mm-", " "), "cm*", " "), "md*", " "), "mtrs", "")
Arr = Split(Str, " ")
GetNum = Switch(Opt = 1, Arr(0), Opt = 2, Arr(1), Opt = 3, Arr(2), Opt = 4, Arr(3))
End Function
Ái chà.... Nếu mấy chử mm, cm*, md*, mtrs là các chử khác thì sao? Replace đến bao giờ cho hết
(ví dụ thay md thành ma thì Function ấy.. tèo ngay)
 
Nhân tiện đây anh chỉ luôn cho em biết cách tách chữ thay vì số như trên.
Em cám ơn trước.
 
Lần chỉnh sửa cuối:
Nhân tiện đây cho anh chỉ luôn cho em biết cách tách chữ thay vì số như trên.
Em cám ơn trước.
Trong code của tôi, bạn thay:
.Pattern = "[^0-9.]"
thành:
.Pattern = "\d"
Hoặc giả sử bạn muốn bỏ luôn dấu chấm có trong số (tưc không lấy những dấu chấm này) thì:
RegEx.Pattern = "[0-9.]"
Tham khảo thêm tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=16983
 
Lần chỉnh sửa cuối:
Cám ơn anh ndu96081631, em đã học từ anh rất nhiều,
Như vậy em tổng kết lại như sau:

1) Tách chữ và số ra cùng 1 cell:

-Tách chữ:
Mã:
Function TachChu(Cell As Range) As String
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "\d"
TachChu = Temp.Replace(Cell, "")
End Function
-Tách số:
Mã:
Function TachSo(Cell As Range) As Double
Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "\D"
  TachSo = Temp.Replace(Cell, "")
End Function
2) Tách chữ và số ra cột theo ý muốn:

-Tách chữ:
Mã:
Function cTachChu(Chuoi As String, Vitri As Long) As String
  Dim Temp1 As String, Temp2 As Variant
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[0-9.]"
    Temp1 = .Replace(Chuoi, " ")
  End With
  Temp2 = Split(WorksheetFunction.Trim(Temp1), " ")
  cTachChu = Temp2(Vitri - 1)
End Function
-Tách số:
Mã:
Function cTachSo(Chuoi As String, Vitri As Long) As String
  Dim Temp1 As String, Temp2 As Variant
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9.]"
    Temp1 = .Replace(Chuoi, " ")
  End With
  Temp2 = Split(WorksheetFunction.Trim(Temp1), " ")
  cTachSo = Temp2(Vitri - 1)
End Function
 
Ái chà.... Nếu mấy chử mm, cm*, md*, mtrs là các chử khác thì sao? Replace đến bao giờ cho hết
(ví dụ thay md thành ma thì Function ấy.. tèo ngay)
Để người dùng không phải can thiệp vào code khi các chữ cần thay bị thay đổi, hàm TachSo sẽ loại tất cả các chữ không phải số, chỉ giữ lại các số và dấu chấm, dấu phẩy. Căn cứ vào đối số vị trí, hàm sẽ tách số cần tìm.
Hàm có 2 đối số:
number: chuỗi cần tách số.
vitri: vị trí số thứ mấy trong chuỗi cần tách.
Ví dụ ô A1= 0.12mm-5.6cm*50md*180mtrs
TachSo(A1,1) > 0.12
TachSo(A1,2) > 5.6
TachSo(A1,3) > 50
TachSo(A1,4) > 180
TachSo(A1,5) > "" không tìm thấy
Mã:
Function TachSo(number As String, vitri As Long) As String
Dim tmp As String, kt As String
number = Trim(number) & " "
If i <= 0 Then Exit Function
For i = 1 To Len(number)
  kt = AscW(Mid(number, i, 1))
  If (kt > 47 And kt < 58) Or kt = 44 Or kt = 46 Then
    tmp = tmp & Mid(number, i, 1)
  Else
    tmp = Trim(tmp) & " "
  End If
  If Len(tmp) - Len(Replace(tmp, " ", "")) = vitri Then
    If InStrRev(tmp, " ", Len(tmp) - 1) = 0 Then
      TachSo = Trim(tmp)
    Else
      TachSo = Trim(Mid(tmp, InStrRev(tmp, " ", Len(tmp) - 1)))
    End If
    Exit Function
  End If
Next
End Function
 
Lần chỉnh sửa cuối:
Để người dùng không phải can thiệp vào code khi các chữ cần thay bị thay đổi, hàm TachSo sẽ loại tất cả các chữ không phải số, chỉ giữ lại các số và dấu chấm, dấu phẩy. Căn cứ vào đối số vị trí, hàm sẽ tách số cần tìm.
Hàm có 2 đối số:
number: chuỗi cần tách số.
vitri: vị trí số thứ mấy trong chuỗi cần tách.
Ví dụ ô A1= 0.12mm-5.6cm*50md*180mtrs
TachSo(A1,1) > 0.12
TachSo(A1,2) > 5.6
TachSo(A1,3) > 50
TachSo(A1,4) > 180
TachSo(A1,5) > "" không tìm thấy
Mã:
Function TachSo(number As String, vitri As Long) As String
Dim tmp As String, kt As String
number = Trim(number) & " "
If i <= 0 Then Exit Function
For i = 1 To Len(number)
  kt = AscW(Mid(number, i, 1))
  If (kt > 47 And kt < 58) Or kt = 44 Or kt = 46 Then
    tmp = tmp & Mid(number, i, 1)
  Else
    tmp = Trim(tmp) & " "
  End If
  If Len(tmp) - Len(Replace(tmp, " ", "")) = vitri Then
    If InStrRev(tmp, " ", Len(tmp) - 1) = 0 Then
      TachSo = Trim(tmp)
    Else
      TachSo = Trim(Mid(tmp, InStrRev(tmp, " ", Len(tmp) - 1)))
    End If
    Exit Function
  End If
Next
End Function
Anh có thể đính kèm file lên được không? Chứ em dùng code này nó toàn cho kết quả = rổng!
Em không hiểu đoạn If i <= 0 Then Exit Function là dùng để làm gì? Xóa đoạn này mới cho kết quả
Mà For như thế công nhận.. quá cực khổ anh à!
 
Lần chỉnh sửa cuối:
Mã:
Function TachSo(number As String, vitri As Long) As String
Dim tmp As String, kt As String
number = Trim(number) & " "
If [SIZE=4][COLOR=red][B]i[/B][/COLOR][/SIZE] <= 0 Then Exit Function
For [SIZE=4][COLOR=red][B]i[/B][/COLOR][/SIZE] = 1 To Len(number)
  kt = AscW(Mid(number, [SIZE=4][COLOR=red][B]i[/B][/COLOR][/SIZE], 1))
  If (kt > 47 And kt < 58) Or kt = 44 Or kt = 46 Then
    tmp = tmp & Mid(number, i, 1)
  Else
    tmp = Trim(tmp) & " "
  End If
  If Len(tmp) - Len(Replace(tmp, " ", "")) = vitri Then
    If InStrRev(tmp, " ", Len(tmp) - 1) = 0 Then
      TachSo = Trim(tmp)
    Else
      TachSo = Trim(Mid(tmp, InStrRev(tmp, " ", Len(tmp) - 1)))
    End If
    Exit Function
  End If
Next
End Function
Xin lỗi vì em mới bắt đầu học nên nó còn mù mờ lắm. Anh có thể hướng dẫn cách khai báo i như đoạn code của anh thì nó báo lỗi ở i khi bỏ dòng "Option Explicit" thì nó cho ra kết quả rỗng
Cám ơn anh
 
Xin lỗi vì em mới bắt đầu học nên nó còn mù mờ lắm. Anh có thể hướng dẫn cách khai báo i như đoạn code của anh thì nó báo lỗi ở i khi bỏ dòng "Option Explicit" thì nó cho ra kết quả rỗng
Cám ơn anh

Bạn thay i = vitri trong câu dưới và nên thêm dim i as long
PHP:
If i <= 0 Then Exit Function
lúc này code sẽ là
PHP:
Function TachSo(number As String, vitri As Long) As String
Dim tmp As String, kt As String, i As Long
number = Trim(number) & " "
If vitri <= 0 Then Exit Function
For i = 1 To Len(number)
  kt = AscW(Mid(number, i, 1))
  If (kt > 47 And kt < 58) Or kt = 44 Or kt = 46 Then
    tmp = tmp & Mid(number, i, 1)
  Else
    tmp = Trim(tmp) & " "
  End If
  If Len(tmp) - Len(Replace(tmp, " ", "")) = vitri Then
    If InStrRev(tmp, " ", Len(tmp) - 1) = 0 Then
      TachSo = Trim(tmp)
    Else
      TachSo = Trim(Mid(tmp, InStrRev(tmp, " ", Len(tmp) - 1)))
    End If
    Exit Function
  End If
Next
End Function
 
Lần chỉnh sửa cuối:
Xin lỗi vì em mới bắt đầu học nên nó còn mù mờ lắm. Anh có thể hướng dẫn cách khai báo i như đoạn code của anh thì nó báo lỗi ở i khi bỏ dòng "Option Explicit" thì nó cho ra kết quả rỗng
Cám ơn anh

Option Explicit : Bắt buộc phải khai báo các biến sử dụng trong Function. Nếu có biến nào chưa khai báo sẽ báo lỗi.
 
Anh có thể đính kèm file lên được không? Chứ em dùng code này nó toàn cho kết quả = rổng!
Em không hiểu đoạn If i <= 0 Then Exit Function là dùng để làm gì? Xóa đoạn này mới cho kết quả
Mà For như thế công nhận.. quá cực khổ anh à!
Xin lỗi các bạn, mình viết sai:If i <= 0 Then Exit Function, đúng là If vitri <= 0 Then Exit Function
thunghi đã phát hiện và chỉnh dùm ở bài 13.
Chưa tìm được thuật toán nào gọn hơn. Vả lại, cái khó là không thể loại bỏ các chữ mà thay bằng khoảng trắng để cách ly các số, và giữa mỗi số chỉ duy nhất có 1 khoảng trắng. Chỉ có for mới làm được !
 
Lần chỉnh sửa cuối:
Xin lỗi các bạn, mình viết sai:If i <= 0 Then Exit Function, đúng là If vitri <= 0 Then Exit Function
thunghi đã phát hiện và chỉnh dùm ở bài 13.
Chưa tìm được thuật toán nào gọn hơn. Vả lại, cái khó là không thể loại bỏ các chữ mà thay bằng khoảng trắng để cách ly các số, và giữa mỗi số chỉ duy nhất có 1 khoảng trắng. Chỉ có for mới làm được !
Nếu anh vẫn nhất định muốn dùng For thì em nghĩ anh khai báo Number As Range sẽ thuận tiện hơn... ví dụ:
PHP:
Function TachSo(Chuoi As Range, Vitri As Long) As String
  Dim i As Long, Temp As Variant
  Temp = Chuoi.Value
  For i = 1 To Len(Chuoi.Value)
    If IsNumeric(Mid(Chuoi, i, 1)) = False And Mid(Chuoi, i, 1) <> "." Then
      Temp = Replace(Temp, Chuoi.Characters(i, 1).Text, " ", 1, 1)
    End If
  Next
  Temp = Split(WorksheetFunction.Trim(Temp), " ")
  TachSo = Temp(Vitri - 1)
End Function
Anh thử xem!
 
Nếu anh vẫn nhất định muốn dùng For thì em nghĩ anh khai báo Number As Range sẽ thuận tiện hơn... ví dụ:
PHP:
Function TachSo(Chuoi As Range, Vitri As Long) As String
  Dim i As Long, Temp As Variant
  Temp = Chuoi.Value
  For i = 1 To Len(Chuoi.Value)
    If IsNumeric(Mid(Chuoi, i, 1)) = False And Mid(Chuoi, i, 1) <> "." Then
      Temp = Replace(Temp, Chuoi.Characters(i, 1).Text, " ", 1, 1)
    End If
  Next
  Temp = Split(WorksheetFunction.Trim(Temp), " ")
  TachSo = Temp(Vitri - 1)
End Function
Anh thử xem!
Hàm viết rất gọn. Không biết cách nào để tách đúng vị trí nên phải dùng:
Mã:
If Len(tmp) - Len(Replace(tmp, " ", "")) = vitri Then
  If InStrRev(tmp, " ", Len(tmp) - 1) = 0 Then
    TachSo = Trim(tmp)
  Else
    TachSo = Trim(Mid(tmp, InStrRev(tmp, " ", Len(tmp) - 1)))
  End If
  Exit Function
End If
Dùng Split tách hay quá !
Nếu không dùng for, ndu96081631 viết thế nào?
 
Lần chỉnh sửa cuối:
Tách số từ chuỗi phức tạp

Chuỗi phức tạp có thể là số có dấu phân cách hàng ngàn, có thể không, có thể là số nguyên và cũng có thể là số thập phân.
Ngoài ra chuỗi có thể chứa số hệ Anh (dấu chấm thập phân) hoặc hệ Pháp (dấu phẩy thập phân). lại còn có thể là số âm.
Hàm CtoNPlus sau đây có thể tách đúng số tại từng vị trí với đúng giá trị dương âm, thập phân, dấu phân cách hàng ngàn.

Code có thể hơi dài dòng, nhưng ngon. Cú pháp:
=CtoNPlus(chuỗi, STT số trong chuỗi, dấu thập phân)

Sử dụng linh hoạt 1 tí sẽ có cả định dạng thí dụ giờ, phút, giây :

=TIME(CtoNPlus(A10;1;",");CtoNPlus(A10;2;",");0)

text​
|
Giờ​
|
Kinh độ​
|
Vĩ độ​
|
Nhiệt độ (oC)​
|
Độ ẩm %​
|
Lượng mưa / tuyết (mm)​
|
Thời lượng đo (phút)​
|
14h30m-115DegreeEast16DegreeNorth15CDegree50,3%212,5mm20minute|
14:30​
|
-115​
|
16​
|
15​
|
50,3​
|
212,5​
|
20​
|
15h30m120DegreeEast80DegreeNorth-15CDegree30%1.500mm30minute|
15:30​
|
120​
|
80​
|
-15​
|
30​
|
1.500​
|
30​
|
9h25m-150degreewest85DegreeSouth-5CDegree75.5%1,240mm15.5minutes|
09:25​
|
-150​
|
85​
|
-5​
|
75,5​
|
1.240​
|
15,5​
|
 

File đính kèm

  • CtoNPlusPtm2.xls
    40 KB · Đọc: 115
Lần chỉnh sửa cuối:
Nếu không dùng for, ndu96081631 viết thế nào?
Thì.. là bài số #2 đấy anh
PHP:
Function TachSo(Chuoi As String, Vitri As Long) As String
  Dim Temp1 As String, Temp2 As Variant
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9.]"
    Temp1 = .Replace(Chuoi, " ")
  End With
  Temp2 = Split(WorksheetFunction.Trim(Temp1), " ")
  TachSo = Temp2(Vitri - 1)
End Function
Em vẫn cho rằng việc tách ký tự ta dùng CreateObject("VBScript.RegExp") là tuyệt hảo nhất
Hãy xem chỉ tiết tại đây:
Giới thiệu thư viện vbscript.dll tại Câu lạc bộ Visual Basic
 
Lần chỉnh sửa cuối:
hỏi về cắt ký tự

mình đang sử dụng excel 2003..,, nho mọi người chỉ giúp mình hàm cắt bỏ ký tự chỉ giử lại con số mà thui
VD: TN03598641 --> 03598641
745632( hàng thành phẩm ) --> 745632
NK123654/M ---> 123654
Cảm ơn mọi người nhiều ah
 
mình đang sử dụng excel 2003..,, nho mọi người chỉ giúp mình hàm cắt bỏ ký tự chỉ giử lại con số mà thui
VD: TN03598641 --> 03598641
745632( hàng thành phẩm ) --> 745632
NK123654/M ---> 123654
Cảm ơn mọi người nhiều ah

File của bạn chỉ có 3 kiểu trên hay còn nhiều kiểu khác nữa ?
Bạn gửi file lên thì dễ thực hiện và có kết quả tốt hơn?
Hoặc tham khảo: http://www.giaiphapexcel.com/forum/...cách-tách-số-từ-một-chuỗi&p=206494#post206494
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom