Sắp xếp dữ liệu trong Excel

Liên hệ QC

rosy84

Thành viên hoạt động
Tham gia
15/3/09
Bài viết
171
Được thích
39
Em có một bảng excel cần xắp xếp thứ tự (file đính kèm) Em muốn sắp MA đúng theo thứ tự của MA2 và các trường khác cũng phải thay đổi theo thứ tự sắp xếp đó. Các bác xem rùi giúp em với nha. thanks!!
 

File đính kèm

  • Book1.7z
    45.2 KB · Đọc: 97
Em có một bảng excel cần xắp xếp thứ tự (file đính kèm) Em muốn sắp MA đúng theo thứ tự của MA2 và các trường khác cũng phải thay đổi theo thứ tự sắp xếp đó. Các bác xem rùi giúp em với nha. thanks!!
Bạn xem file đính kèm nhé, thân !
 

File đính kèm

  • Book1(new).rar
    160.5 KB · Đọc: 206
Bạn hãy chiếu cố đến macro này, nó sẽ làm file của bạn nhẹ nhàng & bay bổng!

PHP:
Option Explicit
Sub Sort_()
 Dim Rng As Range, sRng As Range
 Dim eRw As Long, Jj As Long, lRw As Long
 Dim aRow As Integer
 
 Columns("K:O").Select
 Selection.Sort Key1:=Range("K2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1
 Columns("B:I").Select
 Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1
 lRw = [K65500].End(xlUp).Row:                  eRw = [b65500].End(xlUp).Row
 Set Rng = Range("K1:K" & lRw):                 Application.ScreenUpdating = False
 For Jj = 2 To lRw * 2
    With Cells(Jj, "B")
        If .Value <> "" And .Value <> .Offset(, 9).Value Then
            Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                .Offset().Interior.ColorIndex = 3
            Else
                If sRng.Offset(, -9) <> sRng.Value Then
                    eRw = 1 + eRw
                    Cells(eRw, "B").Resize(, 8).Value = sRng.Offset(, -9).Resize(, 8).Value
                    sRng.Offset(, -9).Resize(, 8).Value = .Offset().Resize(, 8).Value
                    .Offset().Resize(, 8).Value = ""
                End If
            End If
        End If
    End With
 Next Jj
End Sub
 

File đính kèm

  • GPE.rar
    96 KB · Đọc: 332
Em thấy bài của anh SA_DQ cũng hay nhưng khi xắp xếp thì có những hàng lại nhảy linh tinh ở rất xa. anh có thể khắc phục được không?
Còn bài của anh DOSNET thì em không hiểu lắm, anh có thể giải thích cho em không?

Em thì em có ý tưởng thế này em dùng vòng for:
Sub functiondiffi()


'==========================
a = [b7].Column
a1 = [c7].Column
a2 = [d7].Column
a3 = [e7].Column
a4 = [f7].Column
a5 = [g7].Column
a6 = [h7].Column
a7 = [i7].Column
'===========================
a9 = [k7].Column
a10 = [l7].Column
a11 = [m7].Column
a12 = [n7].Column
a13 = [o7].Column
'============================
a8 = [j7].Column
a14 = [p7].Column

w1 = [b3].Column
w2 = [c3].Column
w3 = [d3].Column
w4 = [e3].Column
w5 = [f3].Column
w6 = [g3].Column
w7 = [h3].Column
w8 = [i3].Column
w9 = [k3].Column
w10 = [l3].Column
w11 = [m3].Column
w12 = [n3].Column
w13 = [o3].Column

w14 = [Q3].Column
w15 = [r3].Column
w16 = [s3].Column
w17 = [t3].Column
w18 = [u3].Column
s = 3
r = 3
't = 2
For irw1 = 7 To [b7].End(xlDown).Row
Sheet3.Cells(s, w1).Value = Cells(irw1, a).Value
Sheet3.Cells(s, w2).Value = Cells(irw1, a1).Value
Sheet3.Cells(s, w3).Value = Cells(irw1, a2).Value
Sheet3.Cells(s, w4).Value = Cells(irw1, a3).Value
Sheet3.Cells(s, w5).Value = Cells(irw1, a4).Value
Sheet3.Cells(s, w6).Value = Cells(irw1, a5).Value
Sheet3.Cells(s, w7).Value = Cells(irw1, a6).Value
Sheet3.Cells(s, w8).Value = Cells(irw1, a7).Value
For irw2 = 7 To [k7].End(xlDown).Row
'Dim kl As String
'kl =
If Cells(irw1, a).Value = Cells(irw2, a9).Value Then

Sheet3.Cells(r, w9).Value = Cells(irw2, a9).Value
Sheet3.Cells(r, w10).Value = Cells(irw2, a10).Value
Sheet3.Cells(r, w11).Value = Cells(irw2, a11).Value
Sheet3.Cells(r, w12).Value = Cells(irw2, a12).Value
Sheet3.Cells(r, w13).Value = Cells(irw2, a13).Value
r = r + 1

End If
Next irw2
s = r
Next irw1
End Sub



như vậy nhung nó còn hạn chế, mới chỉ in những hàng giống nhau, còn khác nhau thì chưa in, vả lại em còn muốn so sánh các cột MA, date1,date2,date3,dae4, với MA2 ,date1,date2,date3,dae4 nếu giôg nhau thì thêm chữ YES ở cột bên cạnh nữa. Các bác nghiên cứu rồi giúp em nha. thankS!!!
 
Em thấy bài của anh SA_DQ cũng hay nhưng khi xắp xếp thì có những hàng lại nhảy linh tinh ở rất xa. anh có thể khắc phục được không?
Còn bài của anh DOSNET thì em không hiểu lắm, anh có thể giải thích cho em không?
Yêu cầu trong bài là vầy mà:
MA sắp theo thứ tự của MA2 hoặc ngược lại cũng được.
nếu MA ít hơn mã MA2 thì tự insert dòng thêm để đúng vị trí.

Kết quả hiện giớ đang là vầy:

B|C|D|E|||J|K
VU4001|.|.|.||||VU4001
|.|.|.||||VU4002
|.|.|.||||VU4003
|.|.|.||||VU4004
VU4006|.|.|.||||VU4006
VU4007|.|.|.||||VU4007
Bạn muốn sẽ như thế nào bây chừ? -+*/
 
Lần chỉnh sửa cuối:
Em thấy kết quả chạy thì đúng, nhưng khi chạy chương trình thì có mốt ố dòng chạy xuống tận dưới và lại còn em vẫn phải tìm kiếm và insert thêm thì mới đúng thứ tự.

Khi em thay cột MA thêm một cột nữa thì chạy không đúng.
 

File đính kèm

  • Book1.7z
    90.3 KB · Đọc: 31
1
Em thấy kết quả chạy thì đúng, nhưng khi chạy chương trình thì có mốt ố dòng chạy xuống tận dưới và lại còn em vẫn phải tìm kiếm và insert thêm thì mới đúng thứ tự.
Bạn thay mảco sau nha & kiểm sau khi chạy dùm mình với dữ liệu của bạn.
PHP:
Option Explicit
Sub Sort_()
 Dim Rng As Range, sRng As Range, cRng As Range
 Dim eRw As Long, Jj As Long, lRw As Long
 Dim aRow As Integer
  
 Columns("N:R").Select
 Selection.Sort Key1:=Range("N2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1
 Columns("B:L").Select
 Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1
 lRw = [N65500].End(xlUp).Row:                  eRw = [b65500].End(xlUp).Row
 Set Rng = Range("N1:N" & lRw + 200):               Application.ScreenUpdating = False
 
 For Jj = 2 To lRw * 3
    With Cells(Jj, "B")
        If .Value <> "" And .Value <> .Offset(, 12).Value Then
            Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                .Offset().Interior.ColorIndex = 3
 ' *    *      *     *     *     *     *      *    *    *'
                Set cRng = Range(.Offset(, 12), .Offset(, 12).End(xlDown)).Resize(, 12)
                If cRng.Rows.Count < 3 * lRw Then
                    cRng.Cut
                    cRng.Offset(1).Select
                    ActiveSheet.Paste
                End If
' *    *      *     *     *     *     *      *    *    *'
            Else
                If sRng.Offset(, -12) <> sRng.Value Then
 ' *    *      *     *     *     *     *      *    *    *'
                    Set cRng = Range(Cells(Jj, "B"), Cells(Jj, "B").End(xlDown)).Resize(, 12)
                    cRng.Cut
                    sRng.Offset(, -12).Select
                    ActiveSheet.Paste
 ' *    *      *     *     *     *     *      *    *    *'
                End If
            End If
        End If
    End With
 Next Jj
End Sub

2.
Khi em thay cột MA thêm một cột nữa thì chạy không đúng.
Macro hiện tại chỉ đúng khi Ma tại cột 'B' & Ma2 tại cột 'N'

Muốn thêm cột sau cột 'B' thì các phương thức OFFSET() & RESIZE() phải sửa lại các thông số cho thích hợp. Hiện tại mình chưa biết bạn sẽ thêm cột vô chổ nào; bạn nói rõ thêm vô đâu & cột chứa Ma2 sẽ ở cột nào; Mình sẽ sữa 1 lần cho bạn; Có vậy sau này bạn vận hành macro chủ động & hiệu quả hơn!
 
Lần chỉnh sửa cuối:
Đây là file mà em muốn thêm các cột vào, bác xem rồi giúp em với nha! thanks!
 

File đính kèm

  • ROSY.7z
    42 KB · Đọc: 8
À anh có thể viết macro mà nếu thêm bao nhiêu cột ở bất cứ vị trí nào cũng được, được không?
 
1 Đây là file mà em muốn thêm các cột vào, bác xem rồi giúp em với nha!
2 À anh có thể viết macro mà nếu thêm bao nhiêu cột ở bất cứ vị trí nào cũng được, được không? thanks!

(1): Xem & kiểm trong file đính kèm.
Lưu ý: Trong file mình đã chạy macro rồi;
Để chạy lại các lần sau, chúng ta phải:
Bỏ các ô dữ liệu trống, bằng cách:
Ta xem dữ liệu của bạn là gồm 2 vùng; vùng chứa Ma & vùng kia chứa Ma2;
Để bỏ các khoảng trống trong vùng I chiến thuật sẽ là: Tô chọn hết thẩy các cột của vùng; Vô menu Data & xếp theo [Ma] & có thể tại đây bỏ luôn màu nền đã tô của vùng;

Vùng hai bạn cũng phải làm tương tự Vì macro bây chừ nó cũng tách vùng 2 ở những records của vùng 1 mà không có trong vùng 2. (Tại vùng 1 mà cột có những ô tô màu đỏ thì bên vùng 2 chứa những ô trắng)

(2) Về nguyên tắc thì được;
Vầy đi: Trong file mới nhất của bạn - file muốn thêm cột; bạn hãy nói bạn muốn thêm mấy cột & thêm vô những chổ nào cụ thể; Mình sẽ hướng dẫn từ xa đến khi bạn thêm được tùy ý thì xong, OK!:-= --=0
 

File đính kèm

  • GPE.rar
    71.8 KB · Đọc: 38
Lần chỉnh sửa cuối:
OK! cảm ơn anh, đợi em chạy thử chương trình đã.
Em thì em muốn thêm cột, vào sau cột MA và MA2.
 
Anh SA_DQ ơi, em thấy nếu mà dữ liệu của em là mới hoàn toàn, tức là em xóa hết dữ liệu cũ đi và thêm dữ liệu mới vào thì Macro có chạy được đúng nữa không? và nếu vùng của mã MA mà ít hơn MA2 hoặc ngược lại thì kết quả của Macro còn đúng không?
 
Anh ơi, em thấy nếu mà dữ liệu của em là mới hoàn toàn, tức là em xóa hết dữ liệu cũ đi và thêm dữ liệu mới vào thì Macro có chạy được đúng nữa không? và nếu vùng của mã MA mà ít hơn MA2 hoặc ngược lại thì kết quả của Macro còn đúng không?

(1) Thêm dữ liệu mới có cấu trúc khác (số trường & vị trí tương đối của chúng) khác đi sẽ không đặng!; Nhưng nếu không đổi thay vị trí các trường Ma & Ma2 thì đạt thôi!
Việc này bạn có thể thử & tự rút kết luận mà. Cứ vọc thoải mái; chúng ta còn lưu ở nhiều nới mà!

(2)

Mã:
lRw = [N65500].End(xlUp).Row:                  eRw = [b65500].End(xlUp).Row
 Set Rng = Range("N1:N" & lRw + 200):               Application.ScreenUpdating = False
 
 For Jj = 2 To lRw * 3
Mình đã đề phòng việc này nên đã lấy biến lRw nhân với 3 ;
Tuy nhiên cũng chỉ là áng chừng vậy thôi; Nó còn tùy thuộc vô số records trùng nhau giữa hai vùng & số có ở vùng này nhưng không có ở vùng kia nữa;
Tất nhiên ta có thể bội số lRw lên mút chỉ (là 65500 gì đó); nhưng tốn nhiều tài nguyên & đợi chờ mòn mỏi thôi.

Nguyên tắc nếu Ma <<Ma2 thì phải tăng nhiều tích lRw * n; Hay ấn đại 65.432 cũng xong; Khi đó lấy bấm giây xem nó trôi sông trôi biển bao nhiêu!
 
Ok! thank anh nhiều nha! có gì thì em hỏi sau.
 
À quên, em có cái này tiện hỏi anh luôn: em có dữ liệu dạng ngày tháng mm/dd/yyyy hh:mm:ss
em đã dùng hàm left(mm/dd/yyyy hh:mm:ss,10) nhưng lại thừa ra số 1 các anh có cách nào mà cắt chỉ lấy mm/dd/yyyy em đã chỉnh bằng format date rồi nhưng không dược. các anh giúp em nha, có hàm nào làm việc này không? hoặc macro nào cũng được.
 
Anh SA_DQ ơi! em thấy với dữ liệu em gửi ở đó thì code của anh chạy ngon lành, nhưng nếu em có dữ liệu mới mà MA>MA2 thì khi chạy code lại sai mất, em cũng đã thử thay code rồi nhưng không được thế mới đau chứ anh a!, anh xem có cách nào giúp em với nha!
 
Web KT
Back
Top Bottom