Tách mỗi dấu chấm phảy thành 1 dòng và Copy dữ liệu cột 2, 3, 4 xuống

Liên hệ QC

ndangminh86

Thành viên mới
Tham gia
8/1/16
Bài viết
3
Được thích
0
Chào các bác,
Em có một số dữ liệu cần xử lý theo như ảnh bên dưới, các bác giúp em các bước xử lý với:
1/ Tìm ký tự ; trong cột 1 và thay bằng xuống Row mới ( các cột khác cũng xuống dòng cùng)
2/ Dữ liệu các cột khác copy xuống dòng vừa xuống.
Untitled.jpg
 

File đính kèm

  • test.xlsx
    8.6 KB · Đọc: 16
Lần chỉnh sửa cuối:
Cảm ơn bạn rất nhiều, mình đã sửa tiêu đề và đính kèm file. Còn việc chuyển bài sang box lập trình thì mình không chuyển được.
Chủ đề "Xử lý chuỗi ký tự", Xử nó bằng VBA nhé!
Xài tạm Sub này xem. Dán nó vào Module, cho nó chạy bằng cách nào đó.
PHP:
Option Explicit

Public Sub s_Gpe()
Const CoL As Long = 4 'So Cot cua bang du lieu'
Dim sArr(), dArr(), Tmp As Variant, I As Long, J As Long, K As Long, N As Long, R As Long
    sArr = Range("A4", Range("A4").End(xlDown)).Resize(, CoL).Value
    R = UBound(sArr)
    ReDim dArr(1 To R * 10, 1 To CoL) '1 cell cot A tach toi da thanh 10 dong'
For I = 1 To R
    Tmp = Split(sArr(I, 1), ";")        'Tach chuoi voi dau ;'
    For N = 0 To UBound(Tmp)
        K = K + 1
        dArr(K, 1) = Tmp(N)
        For J = 2 To CoL
            dArr(K, J) = sArr(I, J)
        Next J
    Next N
Next I
    Range("I4").Resize(K, CoL) = dArr   'Gan ket qua bat dau tu cell I5'
End Sub
Mã:
 
Lần chỉnh sửa cuối:
2/ Để giải quyết nhanh chóng nên đăng bài trong Box Lập trình với Excel.
Không nhất thiết phải dùng VBA. Một chủ đề có thể xử lý bằng nhiều cách. Box này là "Xử lý chuỗi ký tự" và muốn xử lý cách nào cũng được.
 
Cảm ơn bạn rất nhiều, mình đã sửa tiêu đề và đính kèm file. Còn việc chuyển bài sang box lập trình thì mình không chuyển được.
Góp ý thêm cho bạn:
1/ Nên có 2 sheet: 1 sheet chứa dữ liệu và 1 sheet chứa kết quả. Vì số cột thực tế của bạn có thể tăng lên theo thời gian thì sẽ ảnh hưởng đến nơi đặt dữ liệu tách.
2/ Sheet chứa dữ liệu ở File giả định có số cột giống số cột với File thực tế thì sẽ dễ dàng áp dụng code hơn.
 
Xử lý bằng Power query:
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    SplitColumn = Table.ExpandListColumn(Table.TransformColumns(Source, {{"Cột 1", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), 
let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Cột 1")
in
    SplitColumn

1616038605301.png
 
Chào các bác,
Em có một số dữ liệu cần xử lý theo như ảnh bên dưới, các bác giúp em các bước xử lý với:
1/ Tìm ký tự ; trong cột 1 và thay bằng xuống Row mới ( các cột khác cũng xuống dòng cùng)
2/ Dữ liệu các cột khác copy xuống dòng vừa xuống.
View attachment 255613
Bạn dùng thử công thức này
CoffeeScript:
cột 1 =TRIM(MID(SUBSTITUTE(INDEX($A$4:$A$7,(INT(ROW(A1)-1)/4)+1),";",REPT(" ",100)),MOD(ROW(A1)-1,4)*100+1,100)) =>coppy xuống
cột 2 =INDEX(B$4:B$7,(ROW(A1)-1)/4+1) =>coppy công thức sang cột 3,4
 
Chào các bác,
Em có một số dữ liệu cần xử lý theo như ảnh bên dưới, các bác giúp em các bước xử lý với:
1/ Tìm ký tự ; trong cột 1 và thay bằng xuống Row mới ( các cột khác cũng xuống dòng cùng)
2/ Dữ liệu các cột khác copy xuống dòng vừa xuống.
Tham khảo...........
 

File đính kèm

  • Test.xlsx
    9.8 KB · Đọc: 6
Nếu xen kẽ 4, 5, 3 thành phần thì sao?
Công thức sử dụng từ bản office2019.
Mã:
=INDEX(FILTERXML("<a><b>"&TEXTJOIN("</b><b>",,SUBSTITUTE($A$4:$A$7,";","</b><b>"))&"</b></a>","//b"),ROW(A1))
=INDEX(FILTERXML("<a><b>"&CONCAT(REPT(SUBSTITUTE(B$4:B$7,";","</b><b>")&"</b><b>",1+LEN($A$4:$A$7)-LEN(SUBSTITUTE($A$4:$A$7,";",""))))&"</b></a>","//b"),ROW(A1))
 
Bạn dùng thử công thức này
CoffeeScript:
cột 1 =TRIM(MID(SUBSTITUTE(INDEX($A$4:$A$7,(INT(ROW(A1)-1)/4)+1),";",REPT(" ",100)),MOD(ROW(A1)-1,4)*100+1,100)) =>coppy xuống
cột 2 =INDEX(B$4:B$7,(ROW(A1)-1)/4+1) =>coppy công thức sang cột 3,4
Mình dùng công thức này biến tấu 1 chút, do dữ liệu cột 1 có khi có tới 5 hoặc 6 dấu ; . Ngoài ra độ dài của chuỗi cũng có thể >100 ký tự. Và bắt đầu từ dòng 1 hoặc 2 tới vài chục ngàn dòng. Do đó mình sửa lại thành như sau :

CoffeeScript:
Cột 1 : =TRIM(MID(SUBSTITUTE(INDEX($A$3:$A$99999,(INT(ROW(A1)-1)/5)+1),";",REPT(" ",200)),MOD(ROW(A1)-1,5)*200+1,200))
Cột 2: =INDEX(B$3:B$99999,(ROW(A1)-1)/5+1)
Cột 3: =INDEX(C$3:C$99999,(ROW(A1)-1)/5+1)
Cột 4: =INDEX(D$3:D$99999,(ROW(A1)-1)/5+1)
Cột 5: =INDEX(E$3:E$99999,(ROW(A1)-1)/5+1)

Đổi thành từ vị trí của dữ liệu là A3, giả định tới A99999
Giả định có 5 dấu ;
Giả định 1 ô có 200 ký tự.

Sẽ có những dòng không có dấu ; hoặc chỉ 2 hoặc 3 dấu ; thôi thì sẽ bị dòng trắng. Nhưng mình lọc trùng xóa các dòng đó đi là ok.

Đây là phương án xử lý của mình, test trên quy mô nhỏ thì hoạt động ok. Chiều mình sẽ làm thử với dữ liệu lớn.
Cảm ơn tất cả mọi người :D
 
Web KT
Back
Top Bottom