Tách lấy dữ liệu định dạng đúng trong chuỗi

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
460
Được thích
19
Em chào mọi người.

Em có 1 bài toán e nghĩ khá là khó khan ạ.

Em có 1 string muốn tách : VNxxxx ( trong đó xxxx là 4 số tự nhiên ạ )

Các chuỗi lớn nó như cột A, em muốn tách ra dữ lieu như cột B ạ.

Rất mong các thầy và anh chị giúp đỡ bài toán này.

Em Xin cảm ơn!
 

File đính kèm

  • Book1.xlsx
    8.3 KB · Đọc: 29
Em chào mọi người.

Em có 1 bài toán e nghĩ khá là khó khan ạ.

Em có 1 string muốn tách : VNxxxx ( trong đó xxxx là 4 số tự nhiên ạ )

Các chuỗi lớn nó như cột A, em muốn tách ra dữ lieu như cột B ạ.

Rất mong các thầy và anh chị giúp đỡ bài toán này.

Em Xin cảm ơn!
....................................................
Mã:
Sub tachCode()
Dim nguon, mang, kq
Dim i, j, k, t
nguon = Sheet1.Range("A2:A6")
ReDim kq(1 To 5, 1 To 1)
For i = 1 To 5
    mang = Split(nguon(i, 1))
    t = ""
    For j = 0 To UBound(mang)
        If IsNumeric(Right(mang(j), 1)) = True And InStr(mang(j), "/") = 0 Then
            If t = "" Then
                t = mang(j)
                kq(i, 1) = mang(j)
            Else
                kq(i, 1) = kq(i, 1) & " " & Left(t, Len(t) - Len(mang(j))) & mang(j)
            End If
        End If
    Next j
    kq(i, 1) = Replace(kq(i, 1), " ", ", ")
Next i
Range("D2:D6") = kq
End Sub
 
Upvote 0
....................................................
Mã:
Sub tachCode()
Dim nguon, mang, kq
Dim i, j, k, t
nguon = Sheet1.Range("A2:A6")
ReDim kq(1 To 5, 1 To 1)
For i = 1 To 5
    mang = Split(nguon(i, 1))
    t = ""
    For j = 0 To UBound(mang)
        If IsNumeric(Right(mang(j), 1)) = True And InStr(mang(j), "/") = 0 Then
            If t = "" Then
                t = mang(j)
                kq(i, 1) = mang(j)
            Else
                kq(i, 1) = kq(i, 1) & " " & Left(t, Len(t) - Len(mang(j))) & mang(j)
            End If
        End If
    Next j
    kq(i, 1) = Replace(kq(i, 1), " ", ", ")
Next i
Range("D2:D6") = kq
End Sub
Dạ em cảm ơn rất nhiều ^^. Đúng cái em cần ạ.

Tuy nhiên em muốn cho nó chạy cả cột cột A và ghi lần lượt dữ lieu vào cột B thì cần sửa lại như nào ạ?
Bài đã được tự động gộp:

....................................................
Mã:
Sub tachCode()
Dim nguon, mang, kq
Dim i, j, k, t
nguon = Sheet1.Range("A2:A6")
ReDim kq(1 To 5, 1 To 1)
For i = 1 To 5
    mang = Split(nguon(i, 1))
    t = ""
    For j = 0 To UBound(mang)
        If IsNumeric(Right(mang(j), 1)) = True And InStr(mang(j), "/") = 0 Then
            If t = "" Then
                t = mang(j)
                kq(i, 1) = mang(j)
            Else
                kq(i, 1) = kq(i, 1) & " " & Left(t, Len(t) - Len(mang(j))) & mang(j)
            End If
        End If
    Next j
    kq(i, 1) = Replace(kq(i, 1), " ", ", ")
Next i
Range("D2:D6") = kq
End Sub
Em cảm ơn anh , em đã sửa lại chút xíu rồi ạ.

Cảm ơn anh rất nhiều!
Bài đã được tự động gộp:

....................................................
Mã:
Sub tachCode()
Dim nguon, mang, kq
Dim i, j, k, t
nguon = Sheet1.Range("A2:A6")
ReDim kq(1 To 5, 1 To 1)
For i = 1 To 5
    mang = Split(nguon(i, 1))
    t = ""
    For j = 0 To UBound(mang)
        If IsNumeric(Right(mang(j), 1)) = True And InStr(mang(j), "/") = 0 Then
            If t = "" Then
                t = mang(j)
                kq(i, 1) = mang(j)
            Else
                kq(i, 1) = kq(i, 1) & " " & Left(t, Len(t) - Len(mang(j))) & mang(j)
            End If
        End If
    Next j
    kq(i, 1) = Replace(kq(i, 1), " ", ", ")
Next i
Range("D2:D6") = kq
End Sub
[/CODE
[/QUOTE]
Dạ, em có chỉnh lại nhưng vẫn có chút nhầm lẫn ạ.

Làm thế nào cho chạy cả cột A và ghi dữ lieu lần lượt vào cột B ạ?

Em cảm ơn anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em cảm ơn rất nhiều ^^. Đúng cái em cần ạ.

Tuy nhiên em muốn cho nó chạy cả cột cột A và ghi lần lượt dữ lieu vào cột B thì cần sửa lại như nào ạ?
Bài đã được tự động gộp:


Em cảm ơn anh , em đã sửa lại chút xíu rồi ạ.

Cảm ơn anh rất nhiều!
Bài đã được tự động gộp:


Dạ, em có chỉnh lại nhưng vẫn có chút nhầm lẫn ạ.

Làm thế nào cho chạy cả cột A và ghi dữ lieu lần lượt vào cột B ạ?

Em cảm ơn anh!
....................
Tức là bạn chạy toàn bộ cột A & điền vào cột B
Bài đã được tự động gộp:

Chỉnh lại vùng dữ liệu & kết quả
Mã:
Sub tachCode()
Dim nguon, mang, kq
Dim i, j, k, t
nguon = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown))
ReDim kq(1 To UBound(nguon), 1 To 1)
For i = 1 To UBound(nguon)
    mang = Split(nguon(i, 1))
    t = ""
    For j = 0 To UBound(mang)
        If IsNumeric(Right(mang(j), 1)) = True And InStr(mang(j), "/") = 0 Then
            If t = "" Then
                t = mang(j)
                kq(i, 1) = mang(j)
            Else
                kq(i, 1) = kq(i, 1) & " " & Left(t, Len(t) - Len(mang(j))) & mang(j)
            End If
        End If
    Next j
    kq(i, 1) = Replace(kq(i, 1), " ", ", ")
Next i
Sheet1.Range("B2").Resize(UBound(kq), 1) = kq
End Sub
 
Upvote 0
....................
Tức là bạn chạy toàn bộ cột A & điền vào cột B
Dạ vâng… chạy đến khi cột A hết dữ lieu ạ.

Anh ơi với lại còn 1 chút vấn đề là… trong code thì anh chỉ kiểm tra lấy ra chuỗi mà ký tự cuối là number... nhưng trong diễn giải nhiều khi nó có nhiều loại chuỗi lắm ạ.

Nên em mới muốn kiểm tra tồn tại chuỗi đầu vào "VNxxxx" trong đó xxxx là 4 số thì nó mới xử lý ạ.
 
Upvote 0
Dạ vâng… chạy đến khi cột A hết dữ lieu ạ.

Anh ơi với lại còn 1 chút vấn đề là… trong code thì anh chỉ kiểm tra lấy ra chuỗi mà ký tự cuối là number... nhưng trong diễn giải nhiều khi nó có nhiều loại chuỗi lắm ạ.

Nên em mới muốn kiểm tra tồn tại chuỗi đầu vào "VNxxxx" trong đó xxxx là 4 số thì nó mới xử lý ạ.
Bởi vậy các bác trên GPE thường bảo đưa dữ liệu lên nhiều thêm là vì vậy đó
Chuỗi đầu vào VNxxxx vậy bỏ qua phần VNxxxx+xx vì xx không đủ 4 số
 
Upvote 0
Hơi nhức đầu xíu
PHP:
Function TachVNa(Str As String) As String
    TachVNa = Trim(Mid(Str, InStr(Str, "VN"), InStr(Str, "ngày") - InStr(Str, "VN")))
    Delimiter = Array(" & ", " + ", " va ")
        For i = 0 To UBound(Delimiter)
         If InStr(TachVNa, Delimiter(i)) Then TachVNa = Replace(TachVNa, Delimiter(i), ",VN")
        Next i
End Function
Hoặc
PHP:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(MID(A2,21,SEARCH("ngày *",A2,1)-21)," & ",",VN")," + ",",VN")," va ",",VN")
Dữ liệu phải có dạng "VN bla bla ngày"
 
Lần chỉnh sửa cuối:
Upvote 0
Bởi vậy các bác trên GPE thường bảo đưa dữ liệu lên nhiều thêm là vì vậy đó
Chuỗi đầu vào VNxxxx vậy bỏ qua phần VNxxxx+xx vì xx không đủ 4 số
Dạ không, trong diễn giải thì chắc chắn sẽ có VNxxxx, sau đó có them các mã khác nhưng nhiều trường hợp người ta viết tắt không viết đủ VNxxxx mà viết mỗi xx hoặc xxx hoặc xxxx ( ví dụ VN1234 và 235 , cái 235 hiểu là VN1235 )

Có những trường hợp chỉ có 1 chuỗi VNxxxx thì lọc được ạ, nhưng có những trường hợp có đến 2,3,4 chuỗi như vậy trong diễn giải, nhưng họ lại viết không đủ mà chỉ viết tắt như thế ạ, nên em đang tính đến logic như sau ạ :

- Lọc ra chuỗi VNxxxx… sau đó lấy ra 1,2,3 và 4 ký tự cuối
- Tìm các ký tự sau chuỗi VNxxxx ( bỏ các ký tự đặc biệt như "+ - &" hoặc các chữ "vs, và ) để xem 1,2,3 hoặc 4 ký tự tiếp theo mà giống với kiểu dữ lieu trên thì lấy ra và ghép lại cho đủ VNxxxx ạ
Bài đã được tự động gộp:

Hơi nhức đầu xíu
PHP:
Function TachVNa(Str As String) As String
    TachVNa = Trim(Mid(Str, InStr(Str, "VN"), InStr(Str, "ngày") - InStr(Str, "VN")))
    Delimiter = Array(" & ", " + ", " va ")
        For i = 0 To UBound(Delimiter)
         If InStr(TachVNa, Delimiter(i)) Then TachVNa = Replace(TachVNa, Delimiter(i), ",VN")
        Next i
End Function
Hoặc
PHP:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(MID(A2,21,SEARCH("ngày *",A2,1)-21)," & ",",VN")," + ",",VN")," va ",",VN")
Dữ liệu phải có dạng "VN bla bla ngày"
Dạ ko, em viết thế thôi ạ còn ngày lúc có lúc không ạ.
 
Upvote 0
Dạ không, trong diễn giải thì chắc chắn sẽ có VNxxxx, sau đó có them các mã khác nhưng nhiều trường hợp người ta viết tắt không viết đủ VNxxxx mà viết mỗi xx hoặc xxx hoặc xxxx ( ví dụ VN1234 và 235 , cái 235 hiểu là VN1235 )

Có những trường hợp chỉ có 1 chuỗi VNxxxx thì lọc được ạ, nhưng có những trường hợp có đến 2,3,4 chuỗi như vậy trong diễn giải, nhưng họ lại viết không đủ mà chỉ viết tắt như thế ạ, nên em đang tính đến logic như sau ạ :

- Lọc ra chuỗi VNxxxx… sau đó lấy ra 1,2,3 và 4 ký tự cuối
- Tìm các ký tự sau chuỗi VNxxxx ( bỏ các ký tự đặc biệt như "+ - &" hoặc các chữ "vs, và ) để xem 1,2,3 hoặc 4 ký tự tiếp theo mà giống với kiểu dữ lieu trên thì lấy ra và ghép lại cho đủ VNxxxx ạ
Bài đã được tự động gộp:


Dạ ko, em viết thế thôi ạ còn ngày lúc có lúc không ạ.
Ớ, thế thì chỉ làm bằng cơm được thôi. Dữ liệu không chuẩn hóa, bản thân người nhìn vào còn kg hiểu thì máy cũng thua :D
Còn không thì phải liệt kê gần như tất cả trường hợp xảy ra.
--------------

- Lọc ra chuỗi VNxxxx… sau đó lấy ra 1,2,3 và 4 ký tự cuối
- Tìm các ký tự sau chuỗi VNxxxx ( bỏ các ký tự đặc biệt như "+ - &" hoặc các chữ "vs, và ) để xem 1,2,3 hoặc 4 ký tự tiếp theo mà giống với kiểu dữ lieu trên thì lấy ra và ghép lại cho đủ VNxxxx ạ
Quan trọng tìm thông tin để bắt đầu, và thông tin kết thúc cái chuỗi đó. Còn lại đơn giản hơn
 
Upvote 0
Ớ, thế thì chỉ làm bằng cơm được thôi. Dữ liệu không chuẩn hóa, bản thân người nhìn vào còn kg hiểu thì máy cũng thua :D
Còn không thì phải liệt kê gần như tất cả trường hợp xảy ra.
--------------

- Lọc ra chuỗi VNxxxx… sau đó lấy ra 1,2,3 và 4 ký tự cuối
- Tìm các ký tự sau chuỗi VNxxxx ( bỏ các ký tự đặc biệt như "+ - &" hoặc các chữ "vs, và ) để xem 1,2,3 hoặc 4 ký tự tiếp theo mà giống với kiểu dữ lieu trên thì lấy ra và ghép lại cho đủ VNxxxx ạ
Quan trọng tìm thông tin để bắt đầu, và thông tin kết thúc cái chuỗi đó. Còn lại đơn giản hơn
Dạ đầu vào dữ lieu là do phía người dùng viết nên mình cần làm tối đa khả năng lấy được dữ lieu trong đó ạ.

Ví dụ như thay vì họ viết đầy đủ phải là : "Nop tien cho san pham VN2345 va VN2346" thì họ lại viết là "Nop tien cho san pham VN2345 va 346" hoặc "Nop tien cho san pham VN2345 va 46" hoặc "Nop tien cho san pham VN2345 va 2346".

Và mình phải lấy được các chuỗi đầu ra là : VN2345,VN2346 ạ.
 
Upvote 0
Em chào mọi người.

Em có 1 bài toán e nghĩ khá là khó khan ạ.

Em có 1 string muốn tách : VNxxxx ( trong đó xxxx là 4 số tự nhiên ạ )

Các chuỗi lớn nó như cột A, em muốn tách ra dữ lieu như cột B ạ.

Rất mong các thầy và anh chị giúp đỡ bài toán này.

Em Xin cảm ơn!
Thử code
Mã:
Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(sArr(i, 1))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN####" Then
        tmp = S(j)
        Res(i, 1) = tmp
      ElseIf tmp <> Empty Then
        If IsNumeric(S(j)) Then Res(i, 1) = Res(i, 1) & ", " & Left(tmp, 6 - Len(S(j))) & S(j)
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
 
Upvote 0
Thử code
Mã:
Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(sArr(i, 1))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN####" Then
        tmp = S(j)
        Res(i, 1) = tmp
      ElseIf tmp <> Empty Then
        If IsNumeric(S(j)) Then Res(i, 1) = Res(i, 1) & ", " & Left(tmp, 6 - Len(S(j))) & S(j)
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
Khả năng xảy ra trường hợp này rất lớn thì code chưa đúng bác à: "nop tien ma san pham VN1623, VN1682 ngày 25/2/2021 cho chi nhanh sai gon"
 
Upvote 0
Thử sửa code bác Hiếu chút xíu xem sao
Mã:
Option Explicit

Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(sArr(i, 1))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN####*" Then
        tmp = Left(S(j), 6)
        Res(i, 1) = IIf(Len(Res(i, 1)), Res(i, 1) & "," & tmp, tmp)
      ElseIf tmp <> Empty Then
        If IsNumeric(S(j)) Then Res(i, 1) = Res(i, 1) & ", " & Left(tmp, 6 - Len(S(j))) & S(j)
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
 
Upvote 0
Thử code
Mã:
Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(sArr(i, 1))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN####" Then
        tmp = S(j)
        Res(i, 1) = tmp
      ElseIf tmp <> Empty Then
        If IsNumeric(S(j)) Then Res(i, 1) = Res(i, 1) & ", " & Left(tmp, 6 - Len(S(j))) & S(j)
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
Dạ, có trường hợp như phía trên anh nhattanktnn có bảo anh ạ... dữ lieu kiểu đó thì nó lại chưa lấy được ạ.
Bài đã được tự động gộp:

Thử sửa code bác Hiếu chút xíu xem sao
Mã:
Option Explicit

Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(sArr(i, 1))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN####*" Then
        tmp = Left(S(j), 6)
        Res(i, 1) = IIf(Len(Res(i, 1)), Res(i, 1) & "," & tmp, tmp)
      ElseIf tmp <> Empty Then
        If IsNumeric(S(j)) Then Res(i, 1) = Res(i, 1) & ", " & Left(tmp, 6 - Len(S(j))) & S(j)
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
Dạ, em nghĩ cái này cũng ổn rồi ạ.

Tuy nhiên em thử them 1 khả năng là thay "VNxxxx*" thành "VN*"... mục đích e muốn lấy tất cả các mã bắt đầu bằng "VN" trươc.

code trên chạy đúng trong mấy trường hợp của em, duy nhất có 1 trường hợp như trong ảnh là nó đang lấy sai ạ... giờ làm thế nào để nó có thể lấy được cả trường hợp đó vậy ạ ?

Em cảm ơn anh!
 

File đính kèm

  • picture.png
    picture.png
    88.2 KB · Đọc: 16
Lần chỉnh sửa cuối:
Upvote 0
Dạ, có trường hợp như phía trên anh nhattanktnn có bảo anh ạ... dữ lieu kiểu đó thì nó lại chưa lấy được ạ.
Bài đã được tự động gộp:


Dạ, em nghĩ cái này cũng ổn rồi ạ.

Tuy nhiên em thử them 1 khả năng là thay "VNxxxx*" thành "VN*"... mục đích e muốn lấy tất cả các mã bắt đầu bằng "VN" trươc.

code trên chạy đúng trong mấy trường hợp của em, duy nhất có 1 trường hợp như trong ảnh là nó đang lấy sai ạ... giờ làm thế nào để nó có thể lấy được cả trường hợp đó vậy ạ ?

Em cảm ơn anh!
File ảnh của bạn sao mình không xem được
 
Upvote 0
File ảnh của bạn sao mình không xem được
Dạ, em gửi lại thông tin.

Em thử them 1 khả năng là thay "VNxxxx*" thành "VN*"... mục đích e muốn lấy tất cả các mã bắt đầu bằng "VN" trươc.

code trên chạy đúng trong mấy trường hợp của em, duy nhất có 1 trường hợp như trong ảnh là nó đang lấy sai ạ... giờ làm thế nào để nó có thể lấy được cả trường hợp đó vậy ạ ?

Em ví dụ trường hợp: "nop tien ma san pham VN164J3 & J5 ngày 25/2/2021 cho chi nhanh long an" thì nó chỉ lấy dc VN164J thôi ạ.... em muốn lấy đầy đủ 2 mã là VN1643J3,VN1643J5

Em cảm ơn anh!
 
Upvote 0
Dạ, em gửi lại thông tin.

Em thử them 1 khả năng là thay "VNxxxx*" thành "VN*"... mục đích e muốn lấy tất cả các mã bắt đầu bằng "VN" trươc.

code trên chạy đúng trong mấy trường hợp của em, duy nhất có 1 trường hợp như trong ảnh là nó đang lấy sai ạ... giờ làm thế nào để nó có thể lấy được cả trường hợp đó vậy ạ ?

Em ví dụ trường hợp: "nop tien ma san pham VN164J3 & J5 ngày 25/2/2021 cho chi nhanh long an" thì nó chỉ lấy dc VN164J thôi ạ.... em muốn lấy đầy đủ 2 mã là VN1643J3,VN1643J5

Em cảm ơn anh!
Chỉnh lại code
Mã:
Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$, N&
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(Replace(sArr(i, 1), ",", " "))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN*" Then
        tmp = S(j)
        If Res(i, 1) <> Empty Then
          Res(i, 1) = Res(i, 1) & "," & tmp
        Else
          Res(i, 1) = tmp
          N = Len(tmp)
        End If
      ElseIf tmp <> Empty Then
        For k = 1 To Len(tmp)
          If IsNumeric(Mid(S(j), k, 1)) Then
            Res(i, 1) = Res(i, 1) & ", " & Left(tmp, N - Len(S(j))) & S(j)
            Exit For
          End If
        Next k
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
 
Upvote 0
1622100060856.png
PHP:
Option Explicit

Private Const sDeli1 As String = ","
Private Const sDeli2 As String = "|"
Private Const strJoin As String = ", "
'
Function getStringCode(ByVal str As String) As String
    Const sMatch1 As String = " VN"
    Const sMatch2 As String = " ng"
    Dim index1 As Long, index2 As Long
    Dim data1 As Variant, item1 As Variant, data2 As Variant, item2 As Variant
    Dim result As Variant, i As Long, ii As Long, strFirstCode As String
    index1 = InStr(1, str, sMatch1, vbBinaryCompare)
    index2 = InStr(1, str, sMatch2, vbBinaryCompare)
    If index1 > 0 And index2 > 0 Then
        str = Mid(str, index1 + 1, index2 - index1 - 1)
        str = cleanString(str)
        data1 = Split(str, sDeli1)
        ReDim result(1 To 10000)
        For Each item1 In data1
            data2 = Split(item1, sDeli2)
            strFirstCode = data2(LBound(data2))
            ii = ii + 1
            result(ii) = strFirstCode
            If UBound(data2) > LBound(data2) Then
                For i = LBound(data2) + 1 To UBound(data2)
                    item2 = data2(i)
                    ii = ii + 1
                    result(ii) = VBA.Left$(strFirstCode, Len(strFirstCode) - Len(item2)) & item2
                Next i
            End If
        Next item1
        If ii > 0 Then
            ReDim Preserve result(1 To ii)
            getStringCode = Join(result, strJoin)
        End If
    End If
End Function
Private Function cleanString(ByVal str As String) As String
    Dim listReplace As Variant, item As Variant
    listReplace = Array("va", "&", "+")
    For Each item In listReplace
        str = Replace(str, item, " ")
    Next item
    str = WorksheetFunction.Trim(str)
    str = Replace(str, strJoin, sDeli1)
    str = Replace(str, " ", sDeli2)
    cleanString = str
End Function
 
Upvote 0
Chỉnh lại code
Mã:
Sub XYZ()
  Dim sArr(), S, Res(), i&, j&, tmp$, N&
 
  sArr = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  For i = 1 To UBound(sArr)
    S = Split(Replace(sArr(i, 1), ",", " "))
    tmp = Empty
    For j = 0 To UBound(S)
      If InStr(S(j), "/") > 0 Then Exit For
      If S(j) Like "VN*" Then
        tmp = S(j)
        If Res(i, 1) <> Empty Then
          Res(i, 1) = Res(i, 1) & "," & tmp
        Else
          Res(i, 1) = tmp
          N = Len(tmp)
        End If
      ElseIf tmp <> Empty Then
        For k = 1 To Len(tmp)
          If IsNumeric(Mid(S(j), k, 1)) Then
            Res(i, 1) = Res(i, 1) & ", " & Left(tmp, N - Len(S(j))) & S(j)
            Exit For
          End If
        Next k
      End If
    Next j
  Next i
  Sheet1.Range("B2").Resize(UBound(Res), 1) = Res
End Sub
Dạ em Xin cảm ơn anh cùng mọi người rất nhiều ạ ^^
 
Upvote 0
Web KT

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

Back
Top Bottom