Cái này dùng VBA sẽ nhẹ hơn!ô 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
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
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í(Spam tí) Ước gì mình được như anh ấy!
ô 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
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ếtGử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
Trong code của tôi, bạn thay: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.
Function TachChu(Cell As Range) As String
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "\d"
TachChu = Temp.Replace(Cell, "")
End Function
Function TachSo(Cell As Range) As Double
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "\D"
TachSo = Temp.Replace(Cell, "")
End Function
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
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
Để 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.Á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)
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!Để 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
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ỗngMã: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
If i <= 0 Then Exit Function
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
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 các bạn, mình viết sai:If i <= 0 Then Exit Function, đúng là If vitri <= 0 Then Exit FunctionAnh 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 à!
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ụ: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 !
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
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: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ụ:
Anh thử xem!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
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
Thì.. là bài số #2 đấy anhNếu không dùng for, ndu96081631 viết thế nào?
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
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