Tách nội dung ra khỏi chuỗi - nhờ giúp đỡ

Liên hệ QC

caovanhau1507

Thành viên chính thức
Tham gia
17/7/12
Bài viết
79
Được thích
3
Chào các ACE của GPE,
Hiện tại e đang tổng hợp dữ liệu từ nhiều nguồn nên format đầu vào không đồng bộ với nhau. Em cần lấy 1 nội dung từ dữ liệu mô tả.
Cấu trúc nội dung cần lấy có dạng AAA/BB/C, trong đó:
- AAA, BB, C đều là số;
- AAA có thể là 1 hoặc 2 hoặc 3 chữ số;
- BB có thể là 1 hoặc 2 chữ số;
- C là 1 hoặc 0 chữ số.
Nhờ các anh chị GPE hướng dẫn giúp em.
Trân trọng.
 

File đính kèm

  • Book2.xlsx
    11.7 KB · Đọc: 38
Chào các ACE của GPE,
Hiện tại e đang tổng hợp dữ liệu từ nhiều nguồn nên format đầu vào không đồng bộ với nhau. Em cần lấy 1 nội dung từ dữ liệu mô tả.
Cấu trúc nội dung cần lấy có dạng AAA/BB/C, trong đó:
- AAA, BB, C đều là số;
- AAA có thể là 1 hoặc 2 hoặc 3 chữ số;
- BB có thể là 1 hoặc 2 chữ số;
- C là 1 hoặc 0 chữ số.
Nhờ các anh chị GPE hướng dẫn giúp em.
Trân trọng.

Bạn không được gửi bài nhiều nơi như vậy.
http://www.giaiphapexcel.com/forum/showthread.php?121039-Trích-xuất-dữ-liệu-từ-chuỗi-nhờ-giúp-đỡ

Chép đoạn sau vào 1 module:
Mã:
Function Tchuoi(ByVal chuoi As String) As String
Dim Reg As Object, i As Integer, j As Integer, k As Long
Set Reg = CreateObject("VBScript.RegExp")
chuoi = " " & chuoi & " "
k = InStr(chuoi, "/")
If k Then
    j = InStr(k, chuoi, " ")
    For i = k To 1 Step -1
        If Mid(chuoi, i, 1) = " " Then Exit For
    Next i
    chuoi = Mid(chuoi, i + 1, j - i)
    With Reg
        .Global = True: .Pattern = "[^0-9/]"
        Tchuoi = .Replace(chuoi, "")
    End With
End If
End Function
Công thức ở bảng tính:
=Tchuoi(A2)
 
Cảm ơn anh,

Em đã thực hiện được.
Bài kia e post nhầm chỗ nhưng ko tìm ra đc chỗ xóa bài thành ra spam mong admin thông cảm xóa giùm em.

Em cảm ơn!
 
Chào các ACE của GPE, Hiện tại e đang tổng hợp dữ liệu từ nhiều nguồn nên format đầu vào không đồng bộ với nhau. Em cần lấy 1 nội dung từ dữ liệu mô tả. Cấu trúc nội dung cần lấy có dạng AAA/BB/C, trong đó: - AAA, BB, C đều là số; - AAA có thể là 1 hoặc 2 hoặc 3 chữ số; - BB có thể là 1 hoặc 2 chữ số; - C là 1 hoặc 0 chữ số. Nhờ các anh chị GPE hướng dẫn giúp em. Trân trọng.
Bạn dùng thử CT cho bài này xem, CT tại B2:
Mã:
B2=LOOKUP(2,1/SEARCH(ROW($1:$1000)&"*/*",MID(A2,FIND("/",A2)-4,5)),ROW($1:$1000))&"/"&LOOKUP(2,MATCH("*/"&ROW($1:$1000)&"*",A2,),ROW($1:$1000))&IFERROR("/"&LOOKUP(2,MATCH("*/*/"&ROW($1:$10)&"*",A2,),ROW($1:$10)),"")
Fill xuống!!!
 
Bạn không được gửi bài nhiều nơi như vậy.
http://www.giaiphapexcel.com/forum/showthread.php?121039-Trích-xuất-dữ-liệu-từ-chuỗi-nhờ-giúp-đỡ

Chép đoạn sau vào 1 module:
Mã:
Function Tchuoi(ByVal chuoi As String) As String
Dim Reg As Object, i As Integer, j As Integer, k As Long
Set Reg = CreateObject("VBScript.RegExp")
chuoi = " " & chuoi & " "
k = InStr(chuoi, "/")
If k Then
    j = InStr(k, chuoi, " ")
    For i = k To 1 Step -1
        If Mid(chuoi, i, 1) = " " Then Exit For
    Next i
    chuoi = Mid(chuoi, i + 1, j - i)
    With Reg
        .Global = True: .Pattern = "[^0-9/]"
        Tchuoi = .Replace(chuoi, "")
    End With
End If
End Function
Công thức ở bảng tính:
=Tchuoi(A2)

HI a,
Em đã test thử code thì hoạt động ok hết nhưng vẫn sót lại 2 trường hợp như file đính kèm, anh xem giúp em nhé.

Cảm ơn anh!
 

File đính kèm

  • Book2.xlsm
    18.4 KB · Đọc: 18
HI a,
Em đã test thử code thì hoạt động ok hết nhưng vẫn sót lại 2 trường hợp như file đính kèm, anh xem giúp em nhé.

Cảm ơn anh!
Bạn thử code:
Mã:
Function Rut(s As String) As String
Dim tach As String
Dim i As Integer
With CreateObject("VBScript.RegExp")
   .ignorecase = True
   .Pattern = "(\d{1,3})([A-Z]?)(\s*)[\/](\s*\d{1,2})[A-Z]?(\s*)[\/]?(\s*\d{0,1})[A-Z]?"
  If .Test(s) Then tach = .Execute(s)(0)
  For i = 1 To Len(tach)
    If Mid(tach, i, 1) Like "#" Or Mid(tach, i, 1) Like "/" Then Rut = Rut & Mid(tach, i, 1)
  Next i
End With
End Function
Công thức = rut[a2]
 
Lần chỉnh sửa cuối:
Bạn dùng thử CT cho bài này xem, CT tại B2:
Mã:
B2=LOOKUP(2,1/SEARCH(ROW($1:$1000)&"*/*",MID(A2,FIND("/",A2)-4,5)),ROW($1:$1000))&"/"&LOOKUP(2,MATCH("*/"&ROW($1:$1000)&"*",A2,),ROW($1:$1000))&IFERROR("/"&LOOKUP(2,MATCH("*/*/"&ROW($1:$10)&"*",A2,),ROW($1:$10)),"")
Fill xuống!!!


HI anh,
Cách làm của anh cũng rất hay, e đã thử và khá ổn nhưng vẫn bị lỗi N/A tại 2 trường hợp e nếu bên trên:
- #&Sợi filament tổng hợp(P/NO: 100/36/1 ONE HEATER SLIGHT AIR INTERMINGLED S TWIST)#&VN
- SỢI DTYVN (Sợi 100%Polyester kéo giãn) 'TAIRILIN' BRAND POLYESTER TEXTURED WOOLY YARN 75D/ 72F/ 1 SEMI DULL CROSS RAW WHITE 'AM' GRADE #&VN
Anh có cách nào khác phục không ạ?
 
HI a,
Em đã test thử code thì hoạt động ok hết nhưng vẫn sót lại 2 trường hợp như file đính kèm, anh xem giúp em nhé.

Cảm ơn anh!
Bạn thử vầy xem
PHP:
Dim oReg As Object
Sub Auto_Open()
Set oReg = CreateObject("VBScript.RegExp")
oReg.Pattern = "(\d{1,3})[A-z]?(/\d{1,3})[A-z]?((/\d)?)"
End Sub
Sub Auto_Close()
Set oReg = Nothing
End Sub
Function ABC(ByVal Str As String) As String
Dim oMatch As Object
Str = Replace(Str, " ", "")
If oReg Is Nothing Then Auto_Open
If oReg.Test(Str) Then
    Set oMatch = oReg.Execute(Str)(0)
    ABC = oMatch.SubMatches(0) & oMatch.SubMatches(1) & oMatch.SubMatches(2)
End If
End Function
 
Bạn thử code:
Mã:
Function Rut(s As String) As String
Dim tach As String
Dim i As Integer
With CreateObject("VBScript.RegExp")
   .ignorecase = True
   .Pattern = "(\d{1,3})([A-Z]?)(\s*)[\/](\s*\d{1,2})[A-Z]?(\s*)[\/]?(\s*\d{0,1})[A-Z]?"
  If .Test(s) Then tach = .Execute(s)(0)
  For i = 1 To Len(tach)
    If Mid(tach, i, 1) Like "#" Or Mid(tach, i, 1) Like "/" Then Rut = Rut & Mid(tach, i, 1)
  Next i
End With
End Function
Công thức = rut[a2]

Anh giúp em thêm phần này nha:
Kết quả sẽ bao gồm thêm phần đuôi có nằm trong nội dung như file đính kèm.
Nhưng do e ko đủ khả năng hiểu đc code anh viết nên ko tự sửa trong đó đc, anh giúp em thêm phần này, nhân tiện giải thích code giúp em để e học hỏi thêm.

Cảm ơn anh!
 

File đính kèm

  • Book2.xlsm
    18.1 KB · Đọc: 11
Anh giúp em thêm phần này nha:
Kết quả sẽ bao gồm thêm phần đuôi có nằm trong nội dung như file đính kèm.
Nhưng do e ko đủ khả năng hiểu đc code anh viết nên ko tự sửa trong đó đc, anh giúp em thêm phần này, nhân tiện giải thích code giúp em để e học hỏi thêm.

Cảm ơn anh!
Có 4 từ khóa "Set", "full dull" , "recycle", "plastic tube" sẽ có nhiều tổ hợp từ bạn đã liệt kê ra hết chưa? Với lại bạn liệt kê yêu cầu các tổ hợp 1 lần nữa và tôi cũng chỉ làm 1 lần nữa thôi không thêm cho các trường hợp ngoài yêu cầu nữa.
 
Nếu xét thứ tự ưu tiên là "recycle" đến "set" đến "Full dull" đến "Plastic Tube" thì code là:
Mã:
Function Rut(s As String) As String
Dim arr As Object, tach, t1, t2, t3, t4 As String, i, j As Integer
With CreateObject("VBScript.RegExp")
     .Global = True
     .ignorecase = True
     .Pattern = "(\d{1,3})[A-Z]?(\s*)[\/](\s*\d{1,2})([A-Z]?)(\s*)[\/]?(\s*\d{0,1})[A-Z]?|set|recycle|full dull|plastic tube"
     If .Test(s) Then Set arr = .Execute(s)
  For i = 0 To arr.Count - 1
  tach = tach & arr(i)
  Select Case True
    Case UCase(arr(i)) Like "*RECYCLE*": t1 = " Recycle"
    Case UCase(arr(i)) Like "*SET*": t2 = " Set"
    Case UCase(arr(i)) Like "*FULL DULL*": t3 = " FD"
    Case UCase(arr(i)) Like "*PLASTIC TUBE*": t4 = " Plastic Tube"
  End Select
  Next i
  For j = 1 To Len(tach)
    If Mid(tach, j, 1) Like "#" Or Mid(tach, j, 1) Like "/" Then Rut = Rut & Mid(tach, j, 1)
  Next j
Rut = Rut & t1 & t2 & t3 & t4
End With
End Function
Công thức = rut[a2]
 
Lần chỉnh sửa cuối:
Nếu xét thứ tự ưu tiên là "recycle" đến "set" đến "Full dull" đến "Plastic Tube" thì code là:
Mã:
Function Rut(s As String) As String
Dim arr As Object, tach, t1, t2, t3, t4 As String, i, j As Integer
With CreateObject("VBScript.RegExp")
     .Global = True
     .ignorecase = True
     .Pattern = "(\d{1,3})[A-Z]?(\s*)[\/](\s*\d{1,2})([A-Z]?)(\s*)[\/]?(\s*\d{0,1})[A-Z]?|set|recycle|full dull|plastic tube"
     If .Test(s) Then Set arr = .Execute(s)
  For i = 0 To arr.Count - 1
  tach = tach & arr(i)
  Select Case True
    Case UCase(arr(i)) Like "*RECYCLE*": t1 = " Recycle"
    Case UCase(arr(i)) Like "*SET*": t2 = " Set"
    Case UCase(arr(i)) Like "*FULL DULL*": t3 = " FD"
    Case UCase(arr(i)) Like "*PLASTIC TUBE*": t4 = " Plastic Tube"
  End Select
  Next i
  For j = 1 To Len(tach)
    If Mid(tach, j, 1) Like "#" Or Mid(tach, j, 1) Like "/" Then Rut = Rut & Mid(tach, j, 1)
  Next j
Rut = Rut & t1 & t2 & t3 & t4
End With
End Function
Công thức = rut[a2]

Cảm ơn anh đã hướng dẫn,
Dựa trên công thức của anh, e sẽ thêm từ khóa khi phát sinh :)
Cảm ơn các anh chị e GPE rất nhiều :D
 
Nếu xét thứ tự ưu tiên là "recycle" đến "set" đến "Full dull" đến "Plastic Tube" thì code là:
Mã:
Function Rut(s As String) As String
Dim arr As Object, tach, t1, t2, t3, t4 As String, i, j As Integer
With CreateObject("VBScript.RegExp")
     .Global = True
     .ignorecase = True
     .Pattern = "(\d{1,3})[A-Z]?(\s*)[\/](\s*\d{1,2})([A-Z]?)(\s*)[\/]?(\s*\d{0,1})[A-Z]?|set|recycle|full dull|plastic tube"
     If .Test(s) Then Set arr = .Execute(s)
  For i = 0 To arr.Count - 1
  tach = tach & arr(i)
  Select Case True
    Case UCase(arr(i)) Like "*RECYCLE*": t1 = " Recycle"
    Case UCase(arr(i)) Like "*SET*": t2 = " Set"
    Case UCase(arr(i)) Like "*FULL DULL*": t3 = " FD"
    Case UCase(arr(i)) Like "*PLASTIC TUBE*": t4 = " Plastic Tube"
  End Select
  Next i
  For j = 1 To Len(tach)
    If Mid(tach, j, 1) Like "#" Or Mid(tach, j, 1) Like "/" Then Rut = Rut & Mid(tach, j, 1)
  Next j
Rut = Rut & t1 & t2 & t3 & t4
End With
End Function
Công thức = rut[a2]


Gửi anh doatmenhhon
Code a giúp em đã hoạt động tốt trên phần lớn nội dung, tuy nhiên vẫn sót lại 1 ít trường hợp từ khóa không có thay đổi nhưng code không nhận diện đúng mã.
Ngoài ra, mã quy cách có 1 trường hợp ngoại lệ (dòng 12-13) em không biết xử lý sao cho phù hợp,
Phiền anh giúp em lần nữa.
Cảm ơn anh :)
 

File đính kèm

  • Book2.xlsm
    20 KB · Đọc: 12
Gửi anh doatmenhhon
Code a giúp em đã hoạt động tốt trên phần lớn nội dung, tuy nhiên vẫn sót lại 1 ít trường hợp từ khóa không có thay đổi nhưng code không nhận diện đúng mã.
Ngoài ra, mã quy cách có 1 trường hợp ngoại lệ (dòng 12-13) em không biết xử lý sao cho phù hợp,
Phiền anh giúp em lần nữa.
Cảm ơn anh :)
Ok bạn. Chắc bạn phải chờ 1,2 hôm nữa do mình đang bận đi công tác. Với cả mình chỉ làm trong nội dung đã hỏi. Còn những yêu cầu phát sinh thì không.
 
PHP:
Public Function TND(Str)
Dim Temp, i, j
Temp = Array("recycle", "set", "plastic tube", "full dull")
Str = WorksheetFunction.Trim(Str)
For i = 0 To UBound(Temp)
If InStr(UCase(Str), UCase(Temp(i))) Then
j = j & " " & IIf(Temp(i) = "full dull", "FD", Temp(i))
End If
Next i
TND = Trim(j)
For Each i In Split(Str)
If InStr(i, "/") Then Temp = i: Exit For
Next i
j = ""
For i = 1 To Len(Temp)
If IsNumeric(Mid(Temp, i, 1)) Then
j = j & Mid(Temp, i, 1)
Else
j = j & " "
End If
Next i
j = Split(WorksheetFunction.Trim(j))
If UBound(j) < 3 Then
TND = Join(j, "/") & " " & TND
Else
j(0) = j(0) & "/" & j(2): j(2) = ""
j(3) = j(1) & "/" & j(3): j(1) = "-"
TND = WorksheetFunction.Trim(Join(j)) & " " & TND
End If
End Function
 
PHP:
Public Function TND(Str)
Dim Temp, i, j
Temp = Array("recycle", "set", "plastic tube", "full dull")
Str = WorksheetFunction.Trim(Str)
For i = 0 To UBound(Temp)
If InStr(UCase(Str), UCase(Temp(i))) Then
j = j & " " & IIf(Temp(i) = "full dull", "FD", Temp(i))
End If
Next i
TND = Trim(j)
For Each i In Split(Str)
If InStr(i, "/") Then Temp = i: Exit For
Next i
j = ""
For i = 1 To Len(Temp)
If IsNumeric(Mid(Temp, i, 1)) Then
j = j & Mid(Temp, i, 1)
Else
j = j & " "
End If
Next i
j = Split(WorksheetFunction.Trim(j))
If UBound(j) < 3 Then
TND = Join(j, "/") & " " & TND
Else
j(0) = j(0) & "/" & j(2): j(2) = ""
j(3) = j(1) & "/" & j(3): j(1) = "-"
TND = WorksheetFunction.Trim(Join(j)) & " " & TND
End If
End Function

Cảm ơn anh đã giúp đỡ,

EM đã thực hiện thành công, nhưng e ko hiểu logic của code lắm, a giải thích giúp e với, để lần sau e còn tự làm đc :D

Cảm ơn anh!
 
Cảm ơn anh đã giúp đỡ,

EM đã thực hiện thành công, nhưng e ko hiểu logic của code lắm, a giải thích giúp e với, để lần sau e còn tự làm đc :D

Cảm ơn anh!
Mã:
Public Function TND(Str)
Dim Temp, i, j
Temp = Array("recycle", "set", "plastic tube", "full dull")'Chứa các từ khoá vào Temp
Str = WorksheetFunction.Trim(Str)'Loại bỏ các khoảng trắng thừa
 
'Quét toàn bộ mảng từ khóa, kiểm tra tồn tại trên Str
'Nếu có thì lưu tạm với J
'Chuyển chuỗi tìm được tam sang TND
For i = 0 To UBound(Temp)
If InStr(UCase(Str), UCase(Temp(i))) Then
j = j & " " & IIf(Temp(i) = "full dull", "FD", Temp(i))
End If
Next i
TND = Trim(j)
'Kiểm tra xong từ khóa
 
'Tách chuỗi ban đầu thành mảng. Điểm phân chia là dấu trắng
'Quét mảng, nếu phần tử nào chứa dấu "/"
'thì đó chính là phần tử chứa nhóm mã cần tìm.
'Gán phần tử đó cho Temp. Thoát vòng lặp
For Each i In Split(Str)
If InStr(i, "/") Then Temp = i: Exit For
Next i
'Tìm xong
 
'Quét chuỗi tìm được
'Nếu là số: Giữ nguyên. Không phải số chuyển thành dấu trắng
'Làm sạch dấu trắng và tách chuỗi thành mảng
j = ""
For i = 1 To Len(Temp)
If IsNumeric(Mid(Temp, i, 1)) Then
j = j & Mid(Temp, i, 1)
Else
j = j & " "
End If
Next i
j = Split(WorksheetFunction.Trim(j))
'Tạo xong mảng chứa số mã
 
'Xét
'TH1: Nếu số phần tử của mảng <4 thì nối các số lại với nhau
'dấu phân cách là "/"
'TH2: Nếu số phần tử =4, hoán đổi và ghép như sau
  'Ghép 1 với 3, gán phần tử 3 =""
  'Ghép 4 với 2, gán phần tử 2 ="-"
'Xong 2TH -> join( mảng chứa nhóm mã ) nối vs chuỗi từ khóa tìm được ở trên
If UBound(j) < 3 Then
TND = Join(j, "/") & " " & TND
Else
j(0) = j(0) & "/" & j(2): j(2) = ""
j(3) = j(1) & "/" & j(3): j(1) = "-"
TND = WorksheetFunction.Trim(Join(j)) & " " & TND
End If
End Function

code gồm 2 bước
B1 : Tìm chuỗi từ khóa, nối thành chuỗi
B2 :
Tách toàn bộ chuỗi ban đầu thành mảng
Tìm phần tử chứa dấu "/"
Xử lý phần tử đó rổi nối với chuỗi từ khoá tìm được
 
Mã:
Public Function TND(Str)
Dim Temp, i, j
Temp = Array("recycle", "set", "plastic tube", "full dull")'Chứa các từ khoá vào Temp
Str = WorksheetFunction.Trim(Str)'Loại bỏ các khoảng trắng thừa
 
'Quét toàn bộ mảng từ khóa, kiểm tra tồn tại trên Str
'Nếu có thì lưu tạm với J
'Chuyển chuỗi tìm được tam sang TND
For i = 0 To UBound(Temp)
If InStr(UCase(Str), UCase(Temp(i))) Then
j = j & " " & IIf(Temp(i) = "full dull", "FD", Temp(i))
End If
Next i
TND = Trim(j)
'Kiểm tra xong từ khóa
 
'Tách chuỗi ban đầu thành mảng. Điểm phân chia là dấu trắng
'Quét mảng, nếu phần tử nào chứa dấu "/"
'thì đó chính là phần tử chứa nhóm mã cần tìm.
'Gán phần tử đó cho Temp. Thoát vòng lặp
For Each i In Split(Str)
If InStr(i, "/") Then Temp = i: Exit For
Next i
'Tìm xong
 
'Quét chuỗi tìm được
'Nếu là số: Giữ nguyên. Không phải số chuyển thành dấu trắng
'Làm sạch dấu trắng và tách chuỗi thành mảng
j = ""
For i = 1 To Len(Temp)
If IsNumeric(Mid(Temp, i, 1)) Then
j = j & Mid(Temp, i, 1)
Else
j = j & " "
End If
Next i
j = Split(WorksheetFunction.Trim(j))
'Tạo xong mảng chứa số mã
 
'Xét
'TH1: Nếu số phần tử của mảng <4 thì nối các số lại với nhau
'dấu phân cách là "/"
'TH2: Nếu số phần tử =4, hoán đổi và ghép như sau
  'Ghép 1 với 3, gán phần tử 3 =""
  'Ghép 4 với 2, gán phần tử 2 ="-"
'Xong 2TH -> join( mảng chứa nhóm mã ) nối vs chuỗi từ khóa tìm được ở trên
If UBound(j) < 3 Then
TND = Join(j, "/") & " " & TND
Else
j(0) = j(0) & "/" & j(2): j(2) = ""
j(3) = j(1) & "/" & j(3): j(1) = "-"
TND = WorksheetFunction.Trim(Join(j)) & " " & TND
End If
End Function

code gồm 2 bước
B1 : Tìm chuỗi từ khóa, nối thành chuỗi
B2 :
Tách toàn bộ chuỗi ban đầu thành mảng
Tìm phần tử chứa dấu "/"
Xử lý phần tử đó rổi nối với chuỗi từ khoá tìm được

Gửi anh TheThienChu
Anh cho e hỏi 2 vấn đề:
Thứ nhất, thêm 1 điều kiện để những mã tạo ra ko có dạng */*/* sẽ mặc định đc bổ sung thêm "/1"
VD: 75/36 sẽ thành 75/36/1
Thứ hai, trong trường hợp này mình có thể cố định các từ khóa tìm đc theo 1 vị trí nhất định không?
Giả sử rule:
- Vị trí 1: SET
- Vị trí 2: Mã code */*/*
- Vị trí 3: FD - Recycle - Plastic Tube
 
Web KT
Back
Top Bottom