Tách chuỗi dữ liệu của 1 ô thành nhiều theo điều kiện len() không vượt quá giá trị cho trước.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

pham ha 94

Thành viên chính thức
Tham gia
13/12/22
Bài viết
86
Được thích
6
Em hiện đang gặp vướng về tách dữ liệu. Do số lượng ký tự ở ô E1 rất nhiều và không cố định. Các số tại ô E1 là không trùng nhau và được ngăn cách bởi dấu phẩy.
Nhờ các bác giúp tách chuỗi ký tự mà "len()" của ô trong dãy sẽ không vượt quá giá trị cho trước tại ô D2 trong excel.
Và có nút để copy dữ liệu sử dụng (ví dụ dán vào trình duyệt được).
Em xin cảm ơn các bác đã giúp đỡ rất nhiều!
 

File đính kèm

  • tách dữ liệu.xlsm
    10 KB · Đọc: 24
Do số lượng ký tự ở ô E1 rất nhiều và không cố định. Các số tại ô E1 là không trùng nhau và được ngăn cách bởi dấu phẩy.
Thấy trong ví du.Nếu số 8 mà nó nằm ở tít cuối và vị trí nó đứng quá 90 thì làm thế nào?1682997293589.png
 
Upvote 0
Thấy trong ví du.Nếu số 8 mà nó nằm ở tít cuối và vị trí nó đứng quá 90 thì làm thế nào?View attachment 289615
Trong ví dụ mình đang để ô D2 là 60 ký tự bác ạ. Chắc lúc gõ lộn thành 90 mà không để ý.
Nhờ bác Thuận xem lại giúp mình.
Len của ô sẽ không vượt 60
ví dụ len ô là 57, nếu số sau có 3 chữ số ví dụ abc thì 8,abc là thành 61 vượt 60 rồi.
Nếu len là 56 thì 8,abc là 60. vẫn ghi nhận là 8,abc thì kết thúc
 
Upvote 0
Không biết có bác nào có phương án hỗ trợ mình không?
 
Upvote 0
Không biết có bác nào có phương án hỗ trợ mình không?
Bạn đã diễn tả hết chi tiết yêu cầu đâu. Ngồi nghĩ "phương án hỗ trợ" chi cho mệt.

...
Len của ô sẽ không vượt 60
ví dụ len ô là 57, nếu số sau có 3 chữ số ví dụ abc thì 8,abc là thành 61 vượt 60 rồi.
...
Vượt rồi sao nữa? ngắt ở "8," hay ngắt trước "8,"
Túm lại, bạn chưa biết cách hoạt động của máy đánh chữ xưa (hay máy in xưa). Về nghiên cứu chúng đi rồi lwn đây diễn tả yêu cầu cho đầy đủ.
Điểm quan trọng nhất là yêu cầu của bạn định nghĩa thế nào là một "đơn vị nguyên tố", không thể ngắt.
Ví dụ một từ thì không thể ngắt, nhưng hai từ nối nhau bằng một dấu gạch (linh-tinh) thì ngắt được không?
Hoặc định nghĩa thẳng chỉ ngắt ở dấu cách
 
Upvote 0
Em hiện đang gặp vướng về tách dữ liệu. Do số lượng ký tự ở ô E1 rất nhiều và không cố định. Các số tại ô E1 là không trùng nhau và được ngăn cách bởi dấu phẩy.
Nhờ các bác giúp tách chuỗi ký tự mà "len()" của ô trong dãy sẽ không vượt quá giá trị cho trước tại ô D2 trong excel.
Và có nút để copy dữ liệu sử dụng (ví dụ dán vào trình duyệt được).
Em xin cảm ơn các bác đã giúp đỡ rất nhiều!
Tách số theo giới hạn số ký tự, code copy dùng bộ thu macro và tự chỉnh lại
Mã:
Sub TachDuLieu()
  Dim S, res$(), str$, tmp$, L&, sRow&, i&, k&
  str = Range("E1").Value
  L = Range("D2").Value
  ReDim res(1 To 2 * Len(str) / L, 1 To 1)
  S = Split(str & "," & String(L, " "), ",")
  sRow = UBound(S) - 1
  For i = 0 To sRow
    tmp = tmp & "," & S(i)
    If Len(tmp & S(i + 1)) > L Then
      k = k + 1
      res(k, 1) = Mid(tmp, 2)
      tmp = Empty
    End If
  Next i
  Range("E2").Resize(k) = res
End Sub
 
Upvote 0
Tách số theo giới hạn số ký tự, code copy dùng bộ thu macro và tự chỉnh lại
Mã:
Sub TachDuLieu()
  Dim S, res$(), str$, tmp$, L&, sRow&, i&, k&
  str = Range("E1").Value
  L = Range("D2").Value
  ReDim res(1 To 2 * Len(str) / L, 1 To 1)
  S = Split(str & "," & String(L, " "), ",")
  sRow = UBound(S) - 1
  For i = 0 To sRow
    tmp = tmp & "," & S(i)
    If Len(tmp & S(i + 1)) > L Then
      k = k + 1
      res(k, 1) = Mid(tmp, 2)
      tmp = Empty
    End If
  Next i
  Range("E2").Resize(k) = res
End Sub
Cảm ơn bác rất nhiều ạ
 
Upvote 0
Em hiện đang gặp vướng về tách dữ liệu. Do số lượng ký tự ở ô E1 rất nhiều và không cố định. Các số tại ô E1 là không trùng nhau và được ngăn cách bởi dấu phẩy.
Nhờ các bác giúp tách chuỗi ký tự mà "len()" của ô trong dãy sẽ không vượt quá giá trị cho trước tại ô D2 trong excel.
Và có nút để copy dữ liệu sử dụng (ví dụ dán vào trình duyệt được).
Em xin cảm ơn các bác đã giúp đỡ rất nhiều!
Thêm một code nữa cho bạn tham khảo:
Mã:
Sub Tach()
Dim i&, j&, lr&, t&, L&
Dim Arr(), res(), S

With Sheet1
lr = .Cells(Rows.Count, 5).End(xlUp).Row
Arr = .Range("E1:E" & lr).Value
ReDim res(1 To 1000, 1 To 1)
T = 1
For i = 1 To UBound(Arr)
    L = 0: S = Split(Arr(i, 1), ","): res(T, 1) = Empty
    For j = LBound(S) To UBound(S)
        If j = LBound(S) Then L = Len(S(j)) Else L = L + (Len(S(j)) + 1)
        If L <= 60 Then
            If res(T, 1) = Empty Then res(T, 1) = S(j) Else res(T, 1) = res(T, 1) & "," & S(j)
        Else
            L = 0:     L = L + Len(S(j)):            T = T + 1
            If res(T, 1) = Empty Then res(T, 1) = S(j) Else res(T, 1) = res(T, 1) & ", " & S(j)
        End If
    Next j
Next i
If T Then
    .Range("E2").Resize(T, 1) = res
End If
End With
End Sub
 
Upvote 0
Em hiện đang gặp vướng về tách dữ liệu. Do số lượng ký tự ở ô E1 rất nhiều và không cố định. Các số tại ô E1 là không trùng nhau và được ngăn cách bởi dấu phẩy.
Nhờ các bác giúp tách chuỗi ký tự mà "len()" của ô trong dãy sẽ không vượt quá giá trị cho trước tại ô D2 trong excel.
Và có nút để copy dữ liệu sử dụng (ví dụ dán vào trình duyệt được).
Em xin cảm ơn các bác đã giúp đỡ rất nhiều!
Mượn code bác @HieuCD góp vui chút:
Mã:
Sub TachDuLieu()
  Dim res$(), str$, k&, p&, L&
  L = Range("D2").Value
  str = Range("E1").Value & "," & Space(L)
  ReDim res(1 To 2 * Len(str) / L, 1 To 1)
  Do
    k = k + 1
    p = InStrRev(str, ",", L + 1)
    res(k, 1) = Mid(str, 1, p - 1)
    str = Mid(str, p + 1)
  Loop Until Len(str) = L
  Range("E2").Resize(k) = res
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom