Xin hướng dẫn tách các đoạn trong một chuỗi

Liên hệ QC

vuphuocha

Thành viên chính thức
Tham gia
20/1/07
Bài viết
71
Được thích
26
Sau khi tham khảo các bài hỏi về xử lý chuỗi ký tự như
http://www.giaiphapexcel.com/forum/showthread.php?t=21379&page=2
http://www.giaiphapexcel.com/forum/showthread.php?t=20881
hoặc bài viết về tách họ tên
thì vấn đề của mình có hơi khác biệt và mình cũng đã thử cả 3 cách trên nhưng chưa giải ra được.
Vấn đề của mình như vậy:
- Các nhóm trong chuỗi được cách nhau bằng 2 dấu / (có thể là "/" hoặc "//"). Trường hợp đặc biệt chỉ có 1 nhóm thì dấu / không có trong chuỗi, tối đa chỉ có 5 nhóm trong chuỗi.
như: (ký hiệu chung ABC = Ký tự; 000 = chữ số)
Chuỗi chỉ có 1 nhóm - ABC000 "nhóm đặc biệt không có dấu /"
Chuỗi có 2 nhóm - ABC000//ABC000 hoặc ABC000/ABC000
Chuỗi có 3 nhóm - ABC000//ABC00//ABCC000 hoặc ABC000/ABC000/ABC000 hoặc ABC000/ABC000//ABC000 hoặc ABC000//ABC000/ABC000
Chuỗi có 4 nhóm - ABC000//ABC000//ABC000//ABC000 ... tương tự như trên các nhóm được phân chia bằng dấu / hoặc //
Chuỗi có 5 nhóm - ABC000//ABC000//ABC000//ABC000//ABC000 ... tương tự như trên các nhóm được phân chia bằng dấu / hoặc //
Nếu tại ô A1 người ta nhập một chuỗi theo các quy tắc trên thì công việc của mình là tách các nhóm trong chuỗi ra tại 5 ô khác (trường hợp tối đa có 5 nhóm trong chuổi), sau đó lại tiếp tục tách phần số (000) ra khỏi các nhóm vừa tách ra được. Công việc này cũng được lặp lại cho các chuổi được nhập trong cột A.
Xin giúp mình giải bài này. Rất cảm ơn các bạn.
 
Bạn xem trong file nhé. Không biết có đúng ý bạn không. Bạn cho ví dụ cụ thể xem
 

File đính kèm

  • tach.xls
    16.5 KB · Đọc: 563
Cảm ơn Salam đã quan tâm giúp đỡ, các nhóm trong chuổi phát sinh ngẫu nhiền chỉ phân biệt bởi các dấu / hoặc // và đứng ngay trước các dấu / hoặc // luôn là các chữ số. Salam coi dùm mình trên file tachchuoi.
Cảm ơn Salam rất nhiều.
 

File đính kèm

  • tachchuoi.xls
    13.5 KB · Đọc: 213
Hãy thử xài hàm mảng tự tạo cho bước I xem sao

PHP:
Option Explicit:        Option Base 1
Function TachChuoi(Rng As Range) As Variant
 Dim StrC As String:                   ReDim Mang(1, 5) As String
 Const G1 As String = "/":             Const G2 As String = "//"
 Dim Dem As Byte, VTr1 As Byte, VTr2 As Byte
 
 StrC = Rng.Value
 Do
   Dem = Dem + 1
   VTr1 = InStr(StrC, G1):             VTr2 = InStr(StrC, G2)
   If VTr1 = 0 And VTr2 = 0 Then
      Mang(1, Dem) = StrC:             Exit Do
   ElseIf VTr2 > 0 And VTr2 = VTr1 Then
      Mang(1, Dem) = Left(StrC, VTr2 - 1)
      StrC = Mid(StrC, VTr2 + 2)
   ElseIf VTr1 > 0 Then
      Mang(1, Dem) = Left(StrC, VTr1 - 1)
      StrC = Mid(StrC, VTr1 + 1)
   End If
   If Dem = 6 Then Exit Do
 Loop
 TachChuoi = Mang
End Function
Hướng dẫn sử dụng (theo Bảng kèm theo)
Cột 'A' chứa những chuỗi cần tách;
Để hiễn thị kết quả hàm mảng của ô Ai, ta tô chọn 5 ô từ Bi:Fi
Sau đó bấm chuột lên thanh công thức & nhập hàm theo cú pháp
=TachChuoi(Ai)
(Tất nhiên i là dòng cụ thể nào đó mà Ai chứa chuỗi cần tách)
Ta kết thúc bằng tổ hợp 3 phím cho hàm mảng tự tao

A | B | C | D | E | F | G
Avc1/FDD542|Avc1|FDD542|||
CVB098//SWQ541|CVB098|SWQ541||||
avc140/fdd542//swq21|avc|fdd542|swq21|||
CVB098//SWQ541/GPE45|CVB098|SWQ541|GPE45|||<- =TachChuoi(A6)
GPE012//Gpe540/GPE.COM//N01//UOT01|GPE012|Gpe540|GPE.COM|N01|UOT01
 
Chỉnh sửa lần cuối bởi điều hành viên:
PHP:
Option Explicit:        Option Base 1
Function TachChuoi(Rng As Range) As Variant
 Dim StrC As String:                   ReDim Mang(1, 5) As String
 Const G1 As String = "/":             Const G2 As String = "//"
 Dim Dem As Byte, VTr1 As Byte, VTr2 As Byte
 
 StrC = Rng.Value
 Do
   Dem = Dem + 1
   VTr1 = InStr(StrC, G1):             VTr2 = InStr(StrC, G2)
   If VTr1 = 0 And VTr2 = 0 Then
      Mang(1, Dem) = StrC:             Exit Do
   ElseIf VTr2 > 0 And VTr2 = VTr1 Then
      Mang(1, Dem) = Left(StrC, VTr2 - 1)
      StrC = Mid(StrC, VTr2 + 2)
   ElseIf VTr1 > 0 Then
      Mang(1, Dem) = Left(StrC, VTr1 - 1)
      StrC = Mid(StrC, VTr1 + 1)
   End If
   If Dem = 6 Then Exit Do
 Loop
 TachChuoi = Mang
End Function
Hướng dẫn sử dụng (theo Bảng kèm theo)
Cột 'A' chứa những chuỗi cần tách;
Để hiễn thị kết quả hàm mảng của ô Ai, ta tô chọn 5 ô từ Bi:Fi
Sau đó bấm chuột lên thanh công thức & nhập hàm theo cú pháp
=TachChuoi(Ai)
(Tất nhiên i là dòng cụ thể nào đó mà Ai chứa chuỗi cần tách)
Ta kết thúc bằng tổ hợp 3 phím cho hàm mảng tự tao

A | B | C | D | E | F | G
Avc1/FDD542|Avc1|FDD542|||
CVB098//SWQ541|CVB098|SWQ541||||
avc140/fdd542//swq21|avc|fdd542|swq21|||
CVB098//SWQ541/GPE45|CVB098|SWQ541|GPE45|||<- =TachChuoi(A6)
GPE012//Gpe540/GPE.COM//N01//UOT01|GPE012|Gpe540|GPE.COM|N01|UOT01


Thử theo hướng này xem có tốt hơn không : Chuyển các ký tự "/" thành ký tự Space Bar. Sau đó dùng hàm Trim để lọc lại.
Vấn đề tách có lẽ thành đơn giản hơn.

--CV--
 
Cảm ơn Salam đã quan tâm giúp đỡ, các nhóm trong chuổi phát sinh ngẫu nhiền chỉ phân biệt bởi các dấu / hoặc // và đứng ngay trước các dấu / hoặc // luôn là các chữ số. Salam coi dùm mình trên file tachchuoi.
Cảm ơn Salam rất nhiều.
Tôi dùng công thức. Mời bạn xem file.
Tôi sửa lại. Các bạn xem file ở bài sau
 
Lần chỉnh sửa cuối:
Cảm ơn Salam đã quan tâm giúp đỡ, các nhóm trong chuổi phát sinh ngẫu nhiền chỉ phân biệt bởi các dấu / hoặc // và đứng ngay trước các dấu / hoặc // luôn là các chữ số. Salam coi dùm mình trên file tachchuoi.
Cảm ơn Salam rất nhiều.
Cứ tưởng ngon ăn cơ như lúc đầu cơ hì hì ...
 

File đính kèm

  • tachchuoi.xls
    23.5 KB · Đọc: 186
Bạn huuthang_bd bạn xem lại kết quả mình thấy lần hai có lẫn cả text lẫn số.
Sorry. Nhầm một chút. Xem file mới ở đây.
To salam: Nếu dùng Find thì bạn chỉ cần dùng công thức này.
Mã:
H2=LEFT(C2,MIN(IF(ISERROR(FIND({0,1,2,3,4,5,6,7,8,9},C2)),100,FIND({0,1,2,3,4,5,6,7,8,9},C2)))-1)
Còn lấy số thì dùng SUBSTITUTE() loại phần text đã lấy ra cho ngắn.
Thân.
 

File đính kèm

  • VD.xls
    29.5 KB · Đọc: 165
Lần chỉnh sửa cuối:
Sorry. Nhầm một chút. Xem file mới ở đây.
To salam: Nếu dùng Find thì bạn chỉ cần dùng công thức này.
Mã:
H2=LEFT(C2,MIN(IF(ISERROR(FIND({0,1,2,3,4,5,6,7,8,9},C2)),100,FIND({0,1,2,3,4,5,6,7,8,9},C2)))-1)
Còn lấy số thì dùng SUBSTITUTE() loại phần text đã lấy ra cho ngắn.
Thân.
Cám ơn huuthang_bd bản chất công thức mình dùng cũng như của bạn thôi, vì ô tham chiếu của mình cách cột nến mới dùng thêm một số hàm để khi copy không bị tham chiếu cách cột nữa mà lần lượt C2, D2 , E2 ...
 
Xin chân thành cảm ơn các bạn đã quan tâm giúp đỡ. Mình đã dùng thử 3 cách do HYen17; salam và huuthang_bd hướng dẫn kết quả đúng như mong đợi của mình. Cảm ơn các bạn rất nhiều.
 
Mình cũng có bài toán tách chữ, nhưng hơi khác một chút, như sau:

Mình muốn tách theo nhóm từ, nhóm này có thể chỉ là 1, hay hai hoặc ba từ, như bảng sau:

(Cột 'A' là các từ cần tách; Các cột sau nó là kết quả tách theo số từ chỉ định.)

A | B | C | D | E | F | G
Lệnh Hồ Đại Hiệp|Lệnh|Hồ|Đại|Hiệp||<- =TachChuoi(A2)
Lệnh Hồ Đại Hiệp|Lệnh Hồ|Đại Hiệp||||<- =TachChuoi(A2, 2)
Lê Đỗ Thị Nữ Hà My|Lê Đỗ Thị|Nữ Hà My||||<- =TachChuoi(A2, 3)

Xin các bạn hỗ trợ mình với, Cảm ơn nhiều
 
- Đầu tiên dùng Repalce biến // thành /
- Dùng hàm Split để tách chuổi, với dấu phân cách là /
===> Ta được kết quả tách lần 1
Còn lần 2, chỉ là tách riêng chử và số ---> Quá dể:
http://www.giaiphapexcel.com/forum/showthread.php?t=16983
 
Mình muốn tách theo nhóm từ, nhóm này có thể chỉ là 1, hay hai hoặc ba từ, như bảng sau:

(Cột 'A' là các từ cần tách; Các cột sau nó là kết quả tách theo số từ chỉ định.)

A | B | C | D | E | F | G
Lệnh Hồ Đại Hiệp|Lệnh|Hồ|Đại|Hiệp||<- =TachChuoi(A2)
Lệnh Hồ Đại Hiệp|Lệnh Hồ|Đại Hiệp||||<- =TachChuoi(A2, 2)
Lê Đỗ Thị Nữ Hà My|Lê Đỗ Thị|Nữ Hà My||||<- =TachChuoi(A2, 3)
Xin các bạn hỗ trợ mình với, Cảm ơn nhiều

Bạn xem file này. Dùng công thức nha.
 

File đính kèm

  • VD.xls
    18 KB · Đọc: 110
Mình lại có một thắc mắc nữa như sau:
Trong bài giải của huuthang_bd nếu mình làm như sau thì báo lỗi (mục đích mình muốn thử từ cách tách 2 lần thành tách 1 lần được cả nhóm chữ cái và số riêng biệt)
- Tại ô B3 mình chép công thức dùng trong ô này
- Tại ô H3 mình thay các giá trị B3 trong công thức bằng phần công thức mình mới copy từ ô B3 thì xảy ra lỗi báo ở hàm substitute thứ 3.
Các bạn có thể giải thích cho mình được không, và nếu muốn từ tách 2 lần như các bạn đã giải đáp thành chỉ tách 1 lần có được không.
Như APP12/CDD13//DKK44//HHH333/LDDP400 thành APP 12 CDD 13 ... trong 10 ô khác nhau (trong trường hợp chuỗi lớn nhất tạo thành từ 5 nhóm)
Rất cảm ơn các bạn.
 
Đúng là sáng ra có tỉnh táo hơn tẹo!

Mục đích mình muốn thử từ cách tách 2 lần thành tách 1 lần được cả nhóm chữ cái và số riêng biệt)
Nếu muốn từ tách 2 lần như các bạn đã giải đáp thành chỉ tách 1 lần có được không.
Như APP12/CDD13//DKK44//HHH333/LDDP400 thành APP 12 CDD 13 ... trong 10 ô khác nhau (trong trường hợp chuỗi lớn nhất tạo thành từ 5 nhóm)
Rất cảm ơn các bạn.
Vẫn phải xài những chỉ dẫn trên cho hàm mới;
(Có tham khảo cao kiến của hai Đại hiệp sỹ)

PHP:
Option Explicit:        Option Base 1
Function TachSo(Rng As Range) As Variant
 Dim StrC As String, Chu As String
 Const G1 As String = "/":                ReDim Mang(1, 10) As String
 Dim Dem As Byte, VTr As Byte, Jj As Byte
 
 StrC = Replace(Rng.Value & G1, "//", G1) & "GPE"
 Do
   Dem = Dem + 2
   VTr = InStr(StrC, G1)
   If VTr > 0 Then
      Chu = Left(StrC, VTr - 1)
      StrC = Mid(StrC, VTr + 1)
      For Jj = 1 To VTr - 1
         If Asc(Mid(Chu, Jj, 1)) < 65 Then
            Mang(1, Dem - 1) = Left(Chu, Jj - 1)
            Mang(1, Dem) = Mid(Chu, Jj)
            Exit For
         End If
      Next Jj
   Else
      Exit Do
   End If
 Loop
 TachSo = Mang
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình lại có một thắc mắc nữa như sau:
Trong bài giải của huuthang_bd nếu mình làm như sau thì báo lỗi (mục đích mình muốn thử từ cách tách 2 lần thành tách 1 lần được cả nhóm chữ cái và số riêng biệt)
- Tại ô B3 mình chép công thức dùng trong ô này
- Tại ô H3 mình thay các giá trị B3 trong công thức bằng phần công thức mình mới copy từ ô B3 thì xảy ra lỗi báo ở hàm substitute thứ 3.
Các bạn có thể giải thích cho mình được không, và nếu muốn từ tách 2 lần như các bạn đã giải đáp thành chỉ tách 1 lần có được không.
Như APP12/CDD13//DKK44//HHH333/LDDP400 thành APP 12 CDD 13 ... trong 10 ô khác nhau (trong trường hợp chuỗi lớn nhất tạo thành từ 5 nhóm)
Rất cảm ơn các bạn.
Khi bạn gộp chung vào, số lần sử dụng một hàm nào đó nhiều hơn mức cho phép. Vì vậy Excel báo lỗi. Nếu bạn muốn tách một lần ra kết quả thì phải đưa phần công thức tách lần 1 vào name. Tôi làm thử trong file ví dụ. Bạn tham khảo nha.
 

File đính kèm

  • Vd.xls
    44 KB · Đọc: 33
Cảm ơn huuthang_bd, HYen17 đã quan tâm giúp đỡ, mình đã thử sử dụng của huuthang_bd nhưng khi nhập thêm một chuỗi nữa ở cột A thì toàn bộ các lệnh trước đó đều báo #NAME?
Xin huuthang_bd giải thích dùm mình.
 
Cảm ơn huuthang_bd, HYen17 đã quan tâm giúp đỡ, mình đã thử sử dụng của huuthang_bd nhưng khi nhập thêm một chuỗi nữa ở cột A thì toàn bộ các lệnh trước đó đều báo #NAME?
Xin huuthang_bd giải thích dùm mình.
Tôi mở rộng vùng dữ liệu công thức vẫn hoạt động tốt mà. Chắc bạn phải gửi file bị lỗi lên tôi mới biết bạn làm sai chỗ nào.
 
Vâng, mình load file Vd của huuthang_bd về và đổi tên thành vd2, sau khi nhập dữ liệu vào ô màu đỏ thì các lệnh cũ đều báo lỗi như vậy.
 

File đính kèm

  • Vd2.xls
    55.5 KB · Đọc: 21
Web KT
Back
Top Bottom