Hỏi cách tách chuỗi với điều kiện cho trước (1 người xem)

Liên hệ QC

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

thaihau2004

Thành viên mới
Tham gia
4/5/13
Bài viết
34
Được thích
6
Chào các bạn, mình có 1 vấn đề suy nghĩ bữa giờ mà chưa giải quyết đc &&&%$R, nay post lên đây mong các bạn/ anh/chị giúp với:
Bài toán: mình có 1 chuỗi dài hơn 40 kí tự (chuỗi A), làm cách nào để chia nhỏ chuỗi này thành nhiều parts (chuỗi B, C,...), mỗi part như vậy chứa tối đa 40 kí tự. điều kiện là: khi đếm chuỗi A đến kí tự thứ 40 mà kí tự này nằm trong 1 từ nào đó thì ko đc cắt ở đây, mà phải cắt ở khoẳng trắng kề trước rồi bê qua part2 (mục đích để giữ ý nghĩa của chuỗi kí tự), đến part2 cũng xét giống như vậy,...đến khi cắt hết chuỗi A thì thôi.

Các bạn xem file mình gữi nhé.
chuỗi A: CONG TY TRACH NHIEM HUU HAN QUANG CAO THUONG MAI SEN VANG[/TD]

kết quả:
part 1: CONG TY TRACH NHIEM HUU HAN QUANG CAO
part 2: THUONG MAI SEN VANG

Cám ơn các cao thủ hén :)
 

File đính kèm

Có 1 số system muốn upload dữ liệu vào thì nó bắt độ dài của chuỗi trong excel ko quá 40 kí tự đó bạn. Nếu dài hơn thì cắt nhỏ ra, bỏ vào field thứ 2 (field thứ 2 cũng ko quá 40 kí tự),.vv..

Đây là code:
Mã:
Function SplitWord(ByVal Text As String, ByVal num_chars As Long)
  Dim str1 As String, str2 As String
  Dim lPos As Long, n As Long
  Dim arr() As String
  ReDim arr(1 To 1)
  str1 = Trim(Text)
  If Len(str1) Then
    Do While Len(str1) > 0
      lPos = InStrRev(str1, " ", num_chars + 1)
      If lPos = 0 Then lPos = num_chars
      str2 = Trim(Left(str1, lPos))
      str1 = Trim(Mid(str1, lPos + 1))
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = str2
    Loop
  End If
  SplitWord = arr
End Function
Áp dụng:
Giả sử chuổi nằm tại cell A3. Vậy công thức tại A11 là:
Mã:
=IFERROR(INDEX(SplitWord($A$3,40),,COLUMNS($A:A)),"")
Kéo fill sang phải đến khi nào... mệt thì ngừng
 

File đính kèm

Upvote 0
Cám ơn tất cả mọi người nhé, nhờ sự giúp đỡ nhiệt tình của mọi người mà hôm nay mình đã giải quyết đc bài toán của mình rùi. Hi vọng sớm có dịp offline gặp mặt các cao thủ ;;;;;;;;;;;
 
Upvote 0
Đây là code:
Mã:
Function SplitWord(ByVal Text As String, ByVal num_chars As Long)
  Dim str1 As String, str2 As String
  Dim lPos As Long, n As Long
  Dim arr() As String
  ReDim arr(1 To 1)
  str1 = Trim(Text)
  If Len(str1) Then
    Do While Len(str1) > 0
      lPos = InStrRev(str1, " ", num_chars + 1)
      If lPos = 0 Then lPos = num_chars
      str2 = Trim(Left(str1, lPos))
      str1 = Trim(Mid(str1, lPos + 1))
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = str2
    Loop
  End If
  SplitWord = arr
End Function
Áp dụng:
Giả sử chuổi nằm tại cell A3. Vậy công thức tại A11 là:
Mã:
=IFERROR(INDEX(SplitWord($A$3,40),,COLUMNS($A:A)),"")
Kéo fill sang phải đến khi nào... mệt thì ngừng

Cám ơn bạn nha! bỏ code vào chạy ngon lành ^^, để mình đọc hiểu thêm nhé
 
Upvote 0
Đêm qua tôi hứa sẽ thử viết code hàm đệ quy:

Mã:
Sub DoanChuoi(ByVal diaChi As Range, ByVal doDai As Integer, ByVal chuoi As String)
[COLOR=#008000]' hàm tách chuỗi ra từng đoạn dài tối đa doDai, và ghi vào các ô bên cạnh[/COLOR]
[COLOR=#008000]' tham số:
' diaChi : ô đầu tiên để ghi kết quả, đoạn đầu tiên sẽ ghi vào ô này, các đoạn sau ghi vào các cột kế tiếp
' doDai : độ dài tối đa ấn định cho mỗi đoạn
' chuoi : chuỗi cần ngắt đoạn
[/COLOR]
If Len(chuoi) <= doDai Then diaChi.Offset(0, 1).Value = chuoi:    Exit Sub [COLOR=#008000]' đoạn cuối cùng[/COLOR]

Dim ngat As Integer [COLOR=#008000]' điểm ngắt chuỗi dự tính[/COLOR]

ngat = InStrRev(Left(chuoi, doDai + 1), " ") [COLOR=#008000]' tìm khoảng trắng gần đuôi nhất của đoạn nhỏ dự trù[/COLOR]

diaChi.Offset(0, 1).Value = Left(chuoi, ngat - 1) [COLOR=#008000]' ghi đoạn nhỏ này[/COLOR]

Call DoanChuoi(diaChi.Offset(0, 1), doDai, Mid(chuoi, ngat + 1)) [COLOR=#008000]' tiếp tục với phần sau
[/COLOR]
End Sub

cách dùng hàm, vd cần tách chuỗi ở A1, ghi vào A2, A3,...:

Call DoanChuoi(Range("A2", 40, Range("A1").Value)

Nếu A1 chứa đoạn chuỗi sau:

It is to bring to your notice that we strictly follow the protocol order when addressing the higher authorities. We do not address the higher authorities by name at the work place. (180)

Kết quả sau khi chạy hàm

A2: It is to bring to your notice that we (37)
A3: strictly follow the protocol order when (39)
A4: addressing the higher authorities. We do (40)
A5: not address the higher authorities by (37)
A6: name at the work place. (23)

Thuật toán đệ quy mà anh Vetmini viết đc nhanh vậy đúng là đỉnh thật! **~**. lên đây hỏi bài là đúng nơi rồi, hihi
 
Upvote 0
Web KT

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

Back
Top Bottom