Xử lý Text to column bằng macro (1 người xem)

Liên hệ QC

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

tunglinhmot

Thành viên chính thức
Tham gia
17/5/17
Bài viết
59
Được thích
6
Giới tính
Nam
Em có một vấn đề với việc tách 1 cột thành nhiều cột với lệnh text to column trong excel.
Vấn đề này giống với chủ đề http://www.giaiphapexcel.com/diendan/threads/macro-text-to-column-in-selected-range.69078/ đã từng đăng trong GPE. Có điều thay vì tách các cell được phân tách bằng dấu ";" (như là T;T;T;T;T) thì em muốn phân tách bằng dấu "" (như là TTTTT)
Tức là tách 1 cell có string "TTTTT" thành 5 cột riêng, mỗi ô cell đầu tiên của 1 cột chứa string "T".
Chi tiết trong file đính kèm. Đầu vào là sheet INPUT, kết quả muốn hiển thị như sheet OUTPUT.
Mong các anh em trên GPE giúp đỡ, em xin cảm ơn.
Mã:
'Code mẫu từ chủ đề trước :
Public Sub GPE()
Application.DisplayAlerts = False
Dim Rng(), Arr(), I As Long, J As Long, Tem As String
        Rng = Selection.Value
    ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        Tem = ""
        For J = 1 To UBound(Rng, 2)
            If Rng(I, J) <> "" Then
                Tem = Tem & ";" & Rng(I, J)
                Arr(I, 1) = Mid(Tem, 2, Len(Tem) - 1)
            End If
        Next J
    Next
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Splited"
    [A1].Resize(I - 1).Value = Arr
    Range([A1], [A65000].End(xlUp)).Select
        Selection.TextToColumns Destination:=Range("A1"), Other:=True, OtherChar:=";"
Application.DisplayAlerts = False
End Sub
 

File đính kèm

Em có một vấn đề với việc tách 1 cột thành nhiều cột với lệnh text to column trong excel.
Vấn đề này giống với chủ đề http://www.giaiphapexcel.com/diendan/threads/macro-text-to-column-in-selected-range.69078/ đã từng đăng trong GPE. Có điều thay vì tách các cell được phân tách bằng dấu ";" (như là T;T;T;T;T) thì em muốn phân tách bằng dấu "" (như là TTTTT)
Tức là tách 1 cell có string "TTTTT" thành 5 cột riêng, mỗi ô cell đầu tiên của 1 cột chứa string "T".
Chi tiết trong file đính kèm. Đầu vào là sheet INPUT, kết quả muốn hiển thị như sheet OUTPUT.
Mong các anh em trên GPE giúp đỡ, em xin cảm ơn.
Mã:
'Code mẫu từ chủ đề trước :
Public Sub GPE()
Application.DisplayAlerts = False
Dim Rng(), Arr(), I As Long, J As Long, Tem As String
        Rng = Selection.Value
    ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        Tem = ""
        For J = 1 To UBound(Rng, 2)
            If Rng(I, J) <> "" Then
                Tem = Tem & ";" & Rng(I, J)
                Arr(I, 1) = Mid(Tem, 2, Len(Tem) - 1)
            End If
        Next J
    Next
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Splited"
    [A1].Resize(I - 1).Value = Arr
    Range([A1], [A65000].End(xlUp)).Select
        Selection.TextToColumns Destination:=Range("A1"), Other:=True, OtherChar:=";"
Application.DisplayAlerts = False
End Sub
Nếu trong file bạn có sheet "OUTPUT" thì chạy thử Sub này:
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, N As Long, R As Long, Col As Long, MaxCol As Long
    sArr = Sheets("INPUT").Range("A1").CurrentRegion.Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1000)
For I = 1 To R
    Col = 0
    For J = 1 To UBound(sArr, 2)
        If sArr(I, J) <> Empty Then
            For N = 1 To Len(sArr(I, J))
                Col = Col + 1
                dArr(I, Col) = Mid(sArr(I, J), N, 1)
            Next N
        End If
    Next J
    If Col > MaxCol Then MaxCol = Col
Next I
Sheets("OUTPUT").Range("A1").Resize(R, MaxCol) = dArr
End Sub
 
Upvote 0
Nếu trong file bạn có sheet "OUTPUT" thì chạy thử Sub này:
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, N As Long, R As Long, Col As Long, MaxCol As Long
    sArr = Sheets("INPUT").Range("A1").CurrentRegion.Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1000)
For I = 1 To R
    Col = 0
    For J = 1 To UBound(sArr, 2)
        If sArr(I, J) <> Empty Then
            For N = 1 To Len(sArr(I, J))
                Col = Col + 1
                dArr(I, Col) = Mid(sArr(I, J), N, 1)
            Next N
        End If
    Next J
    If Col > MaxCol Then MaxCol = Col
Next I
Sheets("OUTPUT").Range("A1").Resize(R, MaxCol) = dArr
End Sub
Anh xem lại giúp em ạ, Sheet OUTPUT là cái kết quả code của anh chạy ra nhưng cái em muốn là cột nào ra cột đấy giống như kết quả trong sheet OUTPUT MONG MUON ý ạ
 

File đính kèm

Upvote 0
Anh xem lại giúp em ạ, Sheet OUTPUT là cái kết quả code của anh chạy ra nhưng cái em muốn là cột nào ra cột đấy giống như kết quả trong sheet OUTPUT MONG MUON ý ạ
Bạn xem lại file bài #1 của bạn "giống" với file này và kết quả có nói rõ như bài #3 không?
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, N As Long, R As Long, Col As Long, MaxCol As Long
    sArr = Sheets("INPUT").Range("A1").CurrentRegion.Value
    R = UBound(sArr): MaxCol = UBound(sArr, 2) * 4
    ReDim dArr(1 To R, 1 To MaxCol)
For I = 1 To R
    Col = 0
    For J = 1 To UBound(sArr, 2)
        If sArr(I, J) <> Empty Then
            For N = 1 To Len(sArr(I, J))
                dArr(I, Col + N) = Mid(sArr(I, J), N, 1)
            Next N
        End If
        Col = Col + 4
    Next J
Next I
Sheets("OUTPUT").Range("A1").Resize(R, MaxCol) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Splited"

Không có từ "Splited" nhé. Cả hai dạng quá khứ của "split" đều là "split". Vả lại, từ này theo đúng luật 1 nguyên âm (i) đi trước 1 phụ âm mạnh (t) cho nên nếu nới dài thì nó phải gấp đôi phụ âm (tt) -> ví dụ: splitting

(tôi biết đoạn code này chủ thớt chỉ cóp lại của thớt trong link dẫn chứ khong phải từ của mình. Mục đích ở đây tôi chỉnh sửa để cái sai lầm này không tiếp tục mãi ra)
 
Upvote 0
Bạn xem lại file bài #1 của bạn "giống" với file này và kết quả có nói rõ như bài #3 không?
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, N As Long, R As Long, Col As Long, MaxCol As Long
    sArr = Sheets("INPUT").Range("A1").CurrentRegion.Value
    R = UBound(sArr): MaxCol = UBound(sArr, 2) * 4
    ReDim dArr(1 To R, 1 To MaxCol)
For I = 1 To R
    Col = 0
    For J = 1 To UBound(sArr, 2)
        If sArr(I, J) <> Empty Then
            For N = 1 To Len(sArr(I, J))
                dArr(I, Col + N) = Mid(sArr(I, J), N, 1)
            Next N
        End If
        Col = Col + 4
    Next J
Next I
Sheets("OUTPUT").Range("A1").Resize(R, MaxCol) = dArr
End Sub
Vâng, em xin lỗi, lúc đầu đúng là em nói không rõ ràng lắm. Em đã thử đoạn code mới của bác rồi, nó chạy OK.
Nhưng em muốn làm thêm một việc khác nữa. Cụ thể thì em xin trình bày trong file đính kèm, bác vào xem lại giúp ạ. Em xin cảm ơn.
 

File đính kèm

Upvote 0
Vâng, em xin lỗi, lúc đầu đúng là em nói không rõ ràng lắm. Em đã thử đoạn code mới của bác rồi, nó chạy OK.
Đến đây tưởng chừng đã xong rồi.
Nhưng em muốn làm thêm một việc khác nữa. Cụ thể thì em xin trình bày trong file đính kèm, bác vào xem lại giúp ạ. Em xin cảm ơn.
Vậy thì chừng nào mới hết "Nhưng..."?
Bài này vẫn là chuyện của bài #1 nếu bạn nêu yêu cầu như bài #6.
Một lần là xong, nếu bạn hình dung hết những tình huống dữ liệu có thể xảy ra để giải thích rõ.
Tôi nghĩ là không chỉ có 5 cột, và chỉ có 2 dạng 10 ký tự và 6 ký tự.
Cột nào cần tách tối đa bao nhiêu phải cụ thể, không thể nhìn bằng mắt rồi nói cột này tách thành 10, cột kia tách thành 6, cột này thì không tách.
Trong file tôi thêm dòng phụ trên đầu (dòng 1) để VBA thực hiện, bạn có thể tùy chỉnh. Cột nào số 1 là lấy nguyên dữ liệu (không tách)
 

File đính kèm

Upvote 0
Em đã test thử và nó đã chạy đúng yêu cầu rồi. Cám ơn bác nhiều.
 
Upvote 0
Đến đây tưởng chừng đã xong rồi.

Vậy thì chừng nào mới hết "Nhưng..."?
Bài này vẫn là chuyện của bài #1 nếu bạn nêu yêu cầu như bài #6.
Một lần là xong, nếu bạn hình dung hết những tình huống dữ liệu có thể xảy ra để giải thích rõ.
Tôi nghĩ là không chỉ có 5 cột, và chỉ có 2 dạng 10 ký tự và 6 ký tự.
Cột nào cần tách tối đa bao nhiêu phải cụ thể, không thể nhìn bằng mắt rồi nói cột này tách thành 10, cột kia tách thành 6, cột này thì không tách.
Trong file tôi thêm dòng phụ trên đầu (dòng 1) để VBA thực hiện, bạn có thể tùy chỉnh. Cột nào số 1 là lấy nguyên dữ liệu (không tách)

Xin phép bác cho em hỏi thêm chút ạ, đoạn code của bác lúc dùng em phải nhập số kí tự của các cột cần tách bằng tay rồi mới tách được, cái này làm nhiều lần cũng bất tiện, bác có cách nào để nó tự động nhập cho đến cột cuối cùng rồi tiến hành tách cột như bình thường không ạ ?
 

File đính kèm

Upvote 0
Xin phép bác cho em hỏi thêm chút ạ, đoạn code của bác lúc dùng em phải nhập số kí tự của các cột cần tách bằng tay rồi mới tách được, cái này làm nhiều lần cũng bất tiện, bác có cách nào để nó tự động nhập cho đến cột cuối cùng rồi tiến hành tách cột như bình thường không ạ ?
Thế gian này cái gì cũng có thể xảy ra, và cái gì cũng có thể giải quyết (bằng cách nào đó). Triều Tiên còn có tên lửa ... "mút chỉ" mà.
"em phải nhập số kí tự của các cột cần tách bằng tay", ai biết quy luật của bạn là cột nào có bao nhiêu ký tự, xét dòng đầu tiên là có số ký tự nhiều nhất hay dòng 2, 3, ... hay dòng bất kỳ? Bao nhiêu cột cần tách rồi đến bao nhiêu cột không tách?
Ăn thua là mình muốn cái gì (Từ đầu đến đâu, đâu có nói là làm nhiều lần). Ấm ớ trong bụng thì ... "Ô Kê" cũng thua!
 
Lần chỉnh sửa cuối:
Upvote 0
@tunglinhmot
Bác ấy là Ba Tê, "TTT" là đủ tê roài
Bạn đưa Năm Tê, Mười Tê e là tê quá bác ấy chịu không có nổi//**///**///**/--=0--=0--=0
 
Upvote 0
Web KT

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

Back
Top Bottom