Tách riêng số từ chuỗi (1 người xem)

  • Thread starter Thread starter lacquan1
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

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

(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

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

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:
Tách rieng số

Nhờ mọi người giúp em tách riêng mã hàng hóa ra từ trong chuỗi, em co đính kèm file,, chúc mọi người moy65 ngày mới vui ve ,, Thank !!!
 

File đính kèm

Nhờ mọi người giúp em tách riêng mã hàng hóa ra từ trong chuỗi, em co đính kèm file,, chúc mọi người moy65 ngày mới vui ve ,, Thank !!!
Dựa vào kí tự VH để tìm rồi tách nó ra
E9=RIGHT(C9,LEN(C9)-FIND("VH",C9)+1) --> bạn kéo xuống nhé

Lưu ý còn 1 số mã chưa đúng, bạn tiếp tục xử lý, tìm tiếp và dùng hàm Left
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu minh muốn bỏ luôn 2 chữ "VH- " thì làm như thế nào ah ,,, Thank mọi người đã giúp
 
rất tuyệt nhug khi keo công thức xuống gặp vấn đề như sau :
thung giặt VH- 2200151 ( hàng thô ) _--> ct sẽ cho ra --> 2200151 ( hàng thô )
hichic,, mình ko muốn vậy ,, chỉ lấy con số thui
va thêm nữa ,, nhiều cái ko bắt đầu bằng " VH- " --> ct báo lỗi #value!
hichcic
 
rất tuyệt nhug khi keo công thức xuống gặp vấn đề như sau :
thung giặt VH- 2200151 ( hàng thô ) _--> ct sẽ cho ra --> 2200151 ( hàng thô )
hichic,, mình ko muốn vậy ,, chỉ lấy con số thui
va thêm nữa ,, nhiều cái ko bắt đầu bằng " VH- " --> ct báo lỗi #value!
hichcic
ko bắt đầu bằng " VH- " là sao bạn, mình thấy có đủ VH mà
Nếu không có VH thì cũng phải có cái gì làm chuẩn để cắt chứ
Tạm thời muốn lấy số không thôi bạn sử dụng cái hàm này xem kq là chuỗi muốn thành số thì value nó(đk: đằng sau mã này không còn số nào nữa nhé)
Mã:
Public Function ma(vung As Range) As String
    Const dk = "1234567890/"
    Dim i, j As Integer, tam, kq As String
        i = InStr(1, vung, "VH")
            For j = i To Len(vung)
                tam = Mid(vung, j, 1)
                If InStr(1, dk, tam) Then kq = kq & tam
            Next
ma = kq
End Function
 
rất tuyệt nhug khi keo công thức xuống gặp vấn đề như sau :
thung giặt VH- 2200151 ( hàng thô ) _--> ct sẽ cho ra --> 2200151 ( hàng thô )
hichic,, mình ko muốn vậy ,, chỉ lấy con số thui
va thêm nữa ,, nhiều cái ko bắt đầu bằng " VH- " --> ct báo lỗi #value!
hichcic
Vậy thì dùng VBA, bạn xem lại bài số #2 nhé.
 

File đính kèm

rất tuyệt nhug khi keo công thức xuống gặp vấn đề như sau :
thung giặt VH- 2200151 ( hàng thô ) _--> ct sẽ cho ra --> 2200151 ( hàng thô )
hichic,, mình ko muốn vậy ,, chỉ lấy con số thui
va thêm nữa ,, nhiều cái ko bắt đầu bằng " VH- " --> ct báo lỗi #value!
hichcic

Thì đây bạn:
Cho công thức tại D9 rồi fill xuống:
PHP:
=IF(ISERR(FIND(" ",SUBSTITUTE(RIGHT(C9,LEN(C9)-FIND("VH",C9)-2),"_"," "))),RIGHT(C9,LEN(C9)-FIND("VH",C9)-2),LEFT(SUBSTITUTE(RIGHT(C9,LEN(C9)-FIND("VH",C9)-2),"_"," "),FIND(" ",SUBSTITUTE(RIGHT(C9,LEN(C9)-FIND("VH",C9)-2),"_"," "))-1))
 
Xin góp một kiểu khác:

Tôi đặt 3 Name:

FindChr10 =ISERROR(FIND(" ", $C17, FIND("VH", $C17)))

FindVH =ISERROR(FIND("VH", $C17))

MaHang =IF(FindVH, "", MID($C17, FIND("VH", $C17), IF(FindChr10, LEN(TRIM($C17)) - FIND("VH", $C17) +1, FIND(" ", $C17, FIND("VH", $C17)) - FIND("VH", $C17))))​

Và tại cột Mã Hàng chỉ cần gõ =MaHang

Nếu thích bỏ chữ VH- ở trước mã hàng, thì dễ thôi, nhưng với kinh nghiệm của riêng tôi, một người đã từng làm công việc quản lý kho vật tư hàng hóa, thì không cần thiết bỏ cái chữ VH-.
 

File đính kèm

rất tuyệt ,, nhug dữ liệu của em,, đã bị bỏ chữ " VH-" từ trước rồi ah,, người lam trước ko co nhập chữ " VH- ", mà chỉ nhập
301152
301153/5
30992152/M
3000526/L
.... .. giờ e không thể ngồi sửa lại dc,, dữ liệu nhiều lắm ah ..
nhờ mọi người giúp đỡ
 
rất tuyệt ,, nhug dữ liệu của em,, đã bị bỏ chữ " VH-" từ trước rồi ah,, người lam trước ko co nhập chữ " VH- ", mà chỉ nhập
301152
301153/5
30992152/M
3000526/L
.... .. giờ e không thể ngồi sửa lại dc,, dữ liệu nhiều lắm ah ..
nhờ mọi người giúp đỡ

Bây giờ thì sao?
Thống nhất cho vui cửa vui nhà là như vầy phải không ?
=> Lấy tất cả các ký tự số liên tục (bắt đầu từ sau "VH-" cho đến trước các khoảng trắng, ký tự "_", ký tự "/",...)
Tác giả cho ý kiến qua file?
 

File đính kèm

Lần chỉnh sửa cuối:
rất tuyệt ,, nhug dữ liệu của em,, đã bị bỏ chữ " VH-" từ trước rồi ah,, người lam trước ko co nhập chữ " VH- ", mà chỉ nhập
301152
301153/5
30992152/M
3000526/L
.... .. giờ e không thể ngồi sửa lại dc,, dữ liệu nhiều lắm ah ..
nhờ mọi người giúp đỡ
Bạn sửa lại công thức trong các Name:
FindChr10 =ISERROR(FIND(" ", $C9, FIND("VH", $C9)))

FindVH =ISERROR(FIND("VH", $C9))

MaHang =IF(FindVH, "", MID($C9, FIND("VH",$C9)+2, IF(FindChr10, LEN(TRIM($C9))-FIND("VH", $C9)-1, FIND(" ",$C9,FIND("VH",$C9))-FIND("VH",$C9)-1)))

Và ở cột mã hàng, dùng công thức này: =SUBSTITUTE(MaHang,"-","")

Lưu ý một điều, khi tạo công thức cho các Name như ở trên đây, bạn phải chắc chắn rằng bạn đang chọn một ô nào đó ở hàng 9.
 
Không biết em có làm sai cái gì không mà sao khi chỉnh sửa công thức nó bị như vầy ,, em không biết cách sửa , nhờ mọi người
IF(FindVH, "", MID($C9, FIND("VH",$C9)+2, IF(FindChr10, LEN(TRIM($C9))FIND("VH", $C9)1, FIND(" ",$C9,FIND("VH",$C9))FIND("VH",$C9)1)))
nó không chạy công thức ,,,, hichic

domfootwear: Lần sau bạn nên viết Tiếng Việt có dấu và không sử dụng từ chát chít nhé.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Không biết em có làm sai cái gì không mà sao khi chỉnh sửa công thức nó bị như vầy ,, em không biết cách sửa , nhờ mọi người
IF(FindVH, "", MID($C9, FIND("VH",$C9)+2, IF(FindChr10, LEN(TRIM($C9))FIND("VH", $C9)1, FIND(" ",$C9,FIND("VH",$C9))FIND("VH",$C9)1)))
nó không chạy công thức ,,,, hichic

domfootwear: Lần sau bạn nên viết Tiếng Việt có dấu và không sử dụng từ chát chít nhé.

Bạn có xem kỹ bài số #35 của anh BNTT chưa?
-Bạn phải đặt name cho nó

FindChr10 =ISERROR(FIND(" ", $C9, FIND("VH", $C9)))

FindVH =ISERROR(FIND("VH", $C9))

MaHang =IF(FindVH, "", MID($C9, FIND("VH",$C9)+2, IF(FindChr10, LEN(TRIM($C9))-FIND("VH", $C9)-1, FIND(" ",$C9,FIND("VH",$C9))-FIND("VH",$C9)-1)))


Và ở cột mã hàng, dùng công thức này: =SUBSTITUTE(MaHang,"-","")

 
Không biết em có làm sai cái gì không mà sao khi chỉnh sửa công thức nó bị như vầy ,, em không biết cách sửa , nhờ mọi người
IF(FindVH, "", MID($C9, FIND("VH",$C9)+2, IF(FindChr10, LEN(TRIM($C9))FIND("VH", $C9)1, FIND(" ",$C9,FIND("VH",$C9))FIND("VH",$C9)1)))
nó không chạy công thức ,,,, hichic

domfootwear: Lần sau bạn nên viết Tiếng Việt có dấu và không sử dụng từ chát chít nhé.
Có lẽ khi tạo Name, bạn không để ý cái chuyện này:
Lưu ý một điều, khi tạo công thức cho các Name như ở trên đây, bạn phải chắc chắn rằng bạn đang chọn một ô nào đó ở hàng 9.
Nghĩa là, nếu trong công thức, bạn dùng C9, thì phải đang chọn một ô nào đó ở hàng thứ 9, nếu trong công thức, bạn dùng C17, thì phải đang chọn một ô nào đó ở hàng thứ 17, v.v...
 
Rồi ,, em làm như mọi người rồi ,, nhưng nó báo em làm sai ,, xin mọi người xem giúp em ah ,, em xin chân thành cảm ơn mọi người,, và sẽ lưu ý những gì mọi người nói,, xin cảm ơn,,
không biết là làm sai chỗ nào nữa hichichic...
 

File đính kèm

Rồi ,, em làm như mọi người rồi ,, nhưng nó báo em làm sai ,, xin mọi người xem giúp em ah ,, em xin chân thành cảm ơn mọi người,, và sẽ lưu ý những gì mọi người nói,, xin cảm ơn,,
không biết là làm sai chỗ nào nữa hichichic...
Name FindChr10 của bạn sai, một tí ti thôi, bạn xem nì:

Của tôi:
=ISERROR(FIND(" ",$C9,FIND("VH",$C9)))​
Của bạn:
=ISERROR(FIND("",$C9,FIND("VH",$C9)))
Cả cái ni cũng rứa:

Của tôi:
=IF(FindVH,"",MID($C9,FIND("VH",$C9)+2,IF(FindChr10,LEN(TRIM($C9))-FIND("VH",$C9)-1,FIND(" ",$C9,FIND("VH",$C9))-FIND("VH",$C$9)-1)))​
Của bạn:
=IF(FindVH,"",MID($C9,FIND("VH",$C9)+2,IF(FindChr10,LEN(TRIM($C9))-FIND("VH",$C9)-1,FIND("",$C9,FIND("VH",$C9))-FIND("VH",$C$9)-1)))​
Bạn chộ ra chỗ bị sai khôn?
 
Tách số từ chuỗi và tìm diện tích

Đọc các bài tách số mà chưa áp dụng được, các bạn giải giúp mình yêu cầu sau:
Mình có 1 ô chứa kích thước được ghi theo qui ước cạnh*cạnh.
Muốn tách các ký tự số ở bên trái dấu "*" và bên phải dấu "*" để tìm diện tích
Ví dụ: 75*105 thì diện tích sẽ bằng số 75 nhân số 105 = 7.875
Ví dụ: 32.5*54.5 thì diện tích sẽ bằng số 32.5 nhân số 54.5 = 1.771.25
Ví dụ: 26.5*50 thì diện tích sẽ bằng số 26.5 nhân số 50 = 1.325
 
Đọc các bài tách số mà chưa áp dụng được, các bạn giải giúp mình yêu cầu sau:
Mình có 1 ô chứa kích thước được ghi theo qui ước cạnh*cạnh.
Muốn tách các ký tự số ở bên trái dấu "*" và bên phải dấu "*" để tìm diện tích
Ví dụ: 75*105 thì diện tích sẽ bằng số 75 nhân số 105 = 7.875
Ví dụ: 32.5*54.5 thì diện tích sẽ bằng số 32.5 nhân số 54.5 = 1.771.25
Ví dụ: 26.5*50 thì diện tích sẽ bằng số 26.5 nhân số 50 = 1.325
VD: Ô A1 bạn có công thức là 75*105 => Tại B1 Bạn nhập công thức sau:
1/Cách 1:
Mã:
LEFT(A1;FIND("*";A1)-1)*RIGHT(A1;LEN(A1)-FIND("*";A1))
2/Cách 2: Đặt con trỏ tại ô B1 -> Vào Insert /name/Define
- Trong ô names in workbook bạn đặt tên (VD tên là KQ)
- Trong ô Refers to bạn nhập công thức sau:
Mã:
=EVALUATE($A1)
=> Bấm OK và ra ngoài tại ô B1 bạn nhập =KQ (để xem kết quả)
 
Hay quá!
Cảm ơn bạn MinhCong nhiều, mình cứ tìm hòai các Left, Right, Mid, Len mà không ra; bây giờ thì Ok rồi.

Nhưng mà mình còn vướng chỗ tách số này nữa, sao cho chỉ dùng 1 công thức để lấy đúng số mình muốn:
C80 sẽ lấy ra số 80
C90(1s) sẽ lấy ra số 90
C100 sẽ lấy ra số 100
D250(2s) sẽ lấy ra số 250
F150BB sẽ lấy ra số 150
F120TM sẽ lấy ra số 120
KRAFT180 sẽ lấy ra số 180
(Các số 80, 90, 100, 250, 150, 120,180, v.v... là các số mình muốn tách ra, các ký tự đứng trước và sau ký tự số (nếu có) là các ký hiệu do nhà cung cấp họ đặt tên)
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhưng mà mình còn vướng chỗ tách số này nữa, sao cho chỉ dùng 1 công thức để lấy đúng số mình muốn:
C80 sẽ lấy ra số 80
C90(1s) sẽ lấy ra số 90
C100 sẽ lấy ra số 100
D250(2s) sẽ lấy ra số 250
F150BB sẽ lấy ra số 150
F120TM sẽ lấy ra số 120
KRAFT180 sẽ lấy ra số 180
(Các số 80, 90, 100, 250, 150, 120,180, v.v... là các số mình muốn tách ra, các ký tự đứng trước và sau ký tự số (nếu có) là các ký hiệu do nhà cung cấp họ đặt tên)[/QUOTE]
Có thể nêu hết các ký hiệu do nhà cung cấp đặt tên không?
Tạm thời với cấu trúc dữ liệu như thế này dùng hàm " xi-ma-chao" này "xử" nó cũng ổn:
Mã:
Public Function Cat(Cll As Range) As Long
    Dim i, Kq As Long
    Const So = "0123456789"
        For i = 1 To Len(Cll)
            If InStr(1, So, Mid(Cll, i, 1)) Then Kq = Kq & Mid(Cll, i, 1)
            If Mid(Cll, i, 1) = "(" Then Exit For
        Next
    Cat = Kq
End Function
Khi nào có đủ dữ liệu thì "xử" nó tiếp
Cú pháp:
=cat(cell muốn lọc)
Thân
 
Các ký hiệu do nhà cung cấp đặt tên là như vậy đó anh, phía trước ký tự số là 1 hoặc vài ký tự text, phía sau nó cũng là 1 hoặc nhiều ký tự text.
Cảm ơn bác concògià và hàm "xi-ma-chao".
Cảm ơn bác MinhCong với 2 cách xử lý chuỗi ký tự.
Cảm ơn bác ndu với hàm TachSo.
 
Hàm của ConCoGia cần viết lại như thế này

PHP:
Option Explicit
Function TachSo(StrC As String)
 Dim jJ As Byte, DDai As Byte:               Dim Asc_ As String
 
  StrC = "GPE" & StrC:                           DDai = Len(StrC)
 For jJ = 1 To DDai
   Asc_ = Mid(StrC, jJ, 1)
   If Asc(Asc_) > 47 And Asc(Asc_) < 58 Then
      StrC = Mid(StrC, jJ, DDai) & "GPE":    Exit For
   End If
 Next jJ
 For jJ = 1 To Len(StrC)
   Asc_ = Mid(StrC, jJ, 1)
   If Asc(Asc_) > 47 And Asc(Asc_) < 58 Then
      TachSo = TachSo & Mid(StrC, jJ, 1)
   Else
      Exit For
   End If
 Next jJ
 TachSo = CLng(TachSo)
End Function
 
Nhưng mà mình còn vướng chỗ tách số này nữa, sao cho chỉ dùng 1 công thức để lấy đúng số mình muốn:
C80 sẽ lấy ra số 80
C90(1s) sẽ lấy ra số 90
C100 sẽ lấy ra số 100
D250(2s) sẽ lấy ra số 250
F150BB sẽ lấy ra số 150
F120TM sẽ lấy ra số 120
KRAFT180 sẽ lấy ra số 180
(Các số 80, 90, 100, 250, 150, 120,180, v.v... là các số mình muốn tách ra, các ký tự đứng trước và sau ký tự số (nếu có) là các ký hiệu do nhà cung cấp họ đặt tên)[/QUOTE]
Có thể nêu hết các ký hiệu do nhà cung cấp đặt tên không?
Tạm thời với cấu trúc dữ liệu như thế này dùng hàm " xi-ma-chao" này "xử" nó cũng ổn:
Mã:
Public Function Cat(Cll As Range) As Long
    Dim i, Kq As Long
    Const So = "0123456789"
        For i = 1 To Len(Cll)
            If InStr(1, So, Mid(Cll, i, 1)) Then Kq = Kq & Mid(Cll, i, 1)
            If Mid(Cll, i, 1) = "(" Then Exit For
        Next
    Cat = Kq
End Function
Khi nào có đủ dữ liệu thì "xử" nó tiếp
Cú pháp:
=cat(cell muốn lọc)
Thân

Cho mình tham gia một tý
cái hàm của bác cò già nên sửa lại như thế này sẽ sử lý tổng quát hơn
Code:

PHP:
Public Function Cat(target)
    Dim i, spos, epos
    spos = 0: epos = 0
    ' tim vitri cua ki tu so dau tien
    For i = 1 To Len(target)
        Kq = Mid(target, i, 1)
        If IsNumeric(Kq) Then
            spos = i
            Exit For
        End If
    Next
    ' tim vitri cua ki tu so cuoi cung
    For i = spos To Len(target)
        Kq = Mid(target, i, 1)
        If Not IsNumeric(Kq) Then
            epos = i - 1
            Exit For
        End If
    Next
    ' Truong hop so nam cuoi chuoi
    If epos = 0 Then epos = i
    Cat = Mid(target, spos, epos - spos + 1)
End Function
 
Tách lấy số từ chuỗi để đưa vào công thức

Em có nhiều chuỗi trong đó có chứa các giá trị số ở gần cuối, giờ em muốn tách lấy số để lồng vào công thức tính.
Ví dụ:
Bonny 25SL-100ml tách lấy 100
Bonny 25SL-250ml tách lấy 250
Beam 75WP-8gr tách lấy 8
Beam 75wp-25gr tách lấy 25
Carbenda Super 25SC-500ml tách lấy 500

Có file đính kèm

Mong mọi người giúp đỡ
 

File đính kèm

Em có nhiều chuỗi trong đó có chứa các giá trị số ở gần cuối, giờ em muốn tách lấy số để lồng vào công thức tính.
Ví dụ:
Bonny 25SL-100ml tách lấy 100
Bonny 25SL-250ml tách lấy 250
Beam 75WP-8gr tách lấy 8
Beam 75wp-25gr tách lấy 25
Carbenda Super 25SC-500ml tách lấy 500

Có file đính kèm

Mong mọi người giúp đỡ
Copy hàm tự tao này vào module
Mã:
Private Function iNum(Cll As Range, ch As Variant)
iNum = Val(Trim(Right(Cll, Len(Cll) - InStr(Cll, ch))))
End Function
Cú pháp: =iNum(Ô nào đó, "dấu nối nào đó")
Hàm này sẽ tách lấy phần số sau dấu nối cho Bạn
Chẳng hạn:
[A14] = "CARBENDA SUPPER 50 SC - 500ml"
Tại ô nào đó, gõ =inum(A14,"-") kết quả là --> 500
 
mọi người giúp em tách chữ ra khỏi chuỗi có dạng như 24d, 30d, 115d . Các chuỗi này nằm trên các ô theo hàng ngang.
Em có gửi bảng excel dưới ạ
 

File đính kèm

mọi người giúp em tách chữ ra khỏi chuỗi có dạng như 24d, 30d, 115d . Các chuỗi này nằm trên các ô theo hàng ngang.
Em có gửi bảng excel dưới ạ
Công thức này:
Mã:
=SUMPRODUCT(1*LEFT(D3:Y3,LEN(D3:Y3)-1))
Hoặc cái này:
Mã:
=SUMPRODUCT(1*SUBSTITUTE(D3:Y3,"d",""))
 
Ồ!!! tách cái nyaf thì ok rồi tks bồ còn tách số thập phân ra ví như abc1,234 thì làm ntn zậy bồ
 
Ồ!!! tách cái nyaf thì ok rồi tks bồ còn tách số thập phân ra ví như abc1,234 thì làm ntn zậy bồ

Theo mình nếu mà chuỗi ( gồm số và chữ ) có quy luật thì có thể dùng hàm trong cel, còn nếu chuỗi và số lẫn lộn bạn có thể tham khảo code tách số và chữ của pác ndu

ví dụ : nếu chỉ có dang ạbc1,234 có thể dùng :

PHP:
 = Right("số cần tách ", Len("so can tach")-3)
 
cho em hỏi file excel của em có 1 ô chứa cả tên, địa chỉ sđt, và ko theo thứ tự vậy phải tách ntn ?
VD:
ô A1 có nội dung:
1. nguyen van a
2. Sdt: 0909999999
3. Dia chi 123,HCM
ô A2 có nội dung:
1. nguyen van b
2. Dia chi 123,DN
3. Sdt: 0169777777
Giờ em muốn tách sđt ra phải làm sao?
 
cho em hỏi file excel của em có 1 ô chứa cả tên, địa chỉ sđt, và ko theo thứ tự vậy phải tách ntn ?
VD:
ô A1 có nội dung:
1. nguyen van a
2. Sdt: 0909999999
3. Dia chi 123,HCM
ô A2 có nội dung:
1. nguyen van b
2. Dia chi 123,DN
3. Sdt: 0169777777
Giờ em muốn tách sđt ra phải làm sao?

Mã:
Function GetNumPhone(source) As String
    Dim str$
        str = source
        With CreateObject("vbscript.regexp")
            .MultiLine = True
            .ignorecase = True
            .Pattern = "sdt\s*:\s*(\d+)"
            If .test(str) Then GetNumPhone = .Execute(str)(0).submatches(0)
        End With
End Function
ở ô B2 nhập công thức :
PHP:
=GetNumPhone(A1)
 
Thắc mắc

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é

Nếu muốn tách số âm, ví dụ a1bg-2 (lấy số -2) thì làm thế nào ạ
 
Thử thay
.Pattern = "[^0-9.]"
thành

.Pattern = "[a-zA-Z]+"

nhập =tachso("a1bg-2",2)
---
cụ thể thì phải có file đính kèm

Làm như thế chỉ lấy số thứ 2 trong chuỗi chứ không nhất thiết đúng điều kiện số âm.

Muốn lấy số âm thì phải dùng pattern "-\d+(\.\d+)?", và lấy match chứ không replace. Thay \. bằng dấy phẩy, tuỳ theo hệ thống
 
Lần chỉnh sửa cuối:
Lần chỉnh sửa cuối:

File đính kèm

Lần chỉnh sửa cuối:

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

Back
Top Bottom