Vấn đề sắp xếp dữ liệu từ dưới lên trên vẫn giữ nguyên cấu trúc. (1 người xem)

Liên hệ QC

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

Ếch Xanh

Thành viên tích cực
Tham gia
12/8/09
Bài viết
865
Được thích
1,573
Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?
 

File đính kèm

Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?
Cái này đâu cần gì Code. Thao tác bằng tay cũng đâu mất tới 30s.

Bôi đen cột A | F5 | Special... | Blank | Ok | Ctrl + (-) | Entire Row | Ok

Nếu bạn muốn có Code thì mở chức năng Record Macro lên và thực hiện từng bước theo hướng dẫn.
 
Upvote 0
Cái này đâu cần gì Code. Thao tác bằng tay cũng đâu mất tới 30s.

Bôi đen cột A | F5 | Special... | Blank | Ok | Ctrl + (-) | Entire Row | Ok

Nếu bạn muốn có Code thì mở chức năng Record Macro lên và thực hiện từng bước theo hướng dẫn.

Dữ liệu của bạn này có cột "CHI TIẾT", cột này dòng có dòng không, làm như vậy thì khi dòng nào thiếu cột "CHI TIẾT" thì bị xoá trắng cả dòng và hơn nữa cấu trúc bảng bị thay đổi.
 
Upvote 0
Dữ liệu của bạn này có cột "CHI TIẾT", cột này dòng có dòng không, làm như vậy thì khi dòng nào thiếu cột "CHI TIẾT" thì bị xoá trắng cả dòng và hơn nữa cấu trúc bảng bị thay đổi.
Đã biết cột Chi tiết có dòng có có dòng không vậy sao bạn còn chọn cột đó làm chuẩn để xóa để rồi mất dữ liệu. Tôi nói rõ là chọn cột A, Cột A là cột Mã nên sẽ không bao giớ thiếu.

Còn về cấu trúc bảng, không có gì thay đổi hết.

Làm thử theo đúng như hướng dẫn sẽ thấy kết quả như thế nào.
 
Upvote 0
Huu Thang à, ý kiến của chủ Topic có lý riêng đấy và không dồn bằng xóa ô trống được, ví dụ link dữ liệu chẳng hạn khi xóa dòng thì vùng link báo lỗi ngay. Phải dùng code thôi.
 
Upvote 0
Cái này đâu cần gì Code. Thao tác bằng tay cũng đâu mất tới 30s.

Bôi đen cột A | F5 | Special... | Blank | Ok | Ctrl + (-) | Entire Row | Ok

Nếu bạn muốn có Code thì mở chức năng Record Macro lên và thực hiện từng bước theo hướng dẫn.

Đây là code EntireRow
PHP:
Sub EntireHang()
    Range("A8:A57").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Range("A7").Select
End Sub

Nói như bạn Ptlong là đúng, bởi Code trên là có sử dụng Delete, ý tác giả không muốn Delete vì muốn giữ nguyên cấu trúc bảng tính.
Có cách khác không anh Hữu Thắng???
 
Upvote 0
Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?

Bạn dùng tạm code này vì làm theo ví dụ của bạn nên khi áp dụng bạn phải chỉnh lại vùng nguồn và vùng đích trong code
 

File đính kèm

Upvote 0
Đây là code EntireRow
PHP:
Sub EntireHang()
    Range("A8:A57").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Range("A7").Select
End Sub
Nói như bạn Ptlong là đúng, bởi Code trên là có sử dụng Delete, ý tác giả không muốn Delete vì muốn giữ nguyên cấu trúc bảng tính.
Có cách khác không anh Hữu Thắng???

Cách thì nhiều. Dùng Sort chẳng hạn.
PHP:
Sub GPE()
With Range([G8], [A65536].End(xlUp).Offset(, 6))
    .Formula = "=ROW()"
    .Value = .Value
    .Offset(, -6).Resize(, 7).Sort [A8], 1, Header:=xlNo
End With
Range([A8], [A65536].End(xlUp)).Resize(, 7).Sort [G8], 1, Header:=xlNo
[G:G].ClearContents
End Sub
 
Upvote 0
Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?

Với dữ liệu của bạn và theo ý tưởng của huuthang_bd ở bài trên, mình nghĩ cách đơn giản nhất là bôi đen cả bảng dữ liệu rồi Sort theo cột MÃ KH là xong, hic, đỡ nhức đầu.+-+-+-++-+-+-++-+-+-+

PS : có phải minhthien321 muốn làm 1 ndu thứ 2 không, hehe.
 
Upvote 0
Hay lắm! Hữu Thắng "đổi sao" có khác! Rất hiệu quả mượn cột G để sort dữ liệu theo Row, đúng là sáng tạo!

P/S: Sẳn đây cho tôi gửi lời chúc mừng đến việc "đổi sao không xoay" của Hữu Thắng nhé!
 
Upvote 0
Mình tham gia 1 đoạn code (Chưa hoàn thiện lắm), mình test thấy được

Mã:
Sub setdata()
Dim Rng As Range
Dim temp As Variant
Dim dg1, dg2, dg3 As Long
With Sheet1
dg1 = .[a56356].End(xlUp).Row
dg2 = .Cells(dg1, 1).End(xlUp).Row
dg3 = .Cells(dg2, 1).End(xlUp).Row
Do While dg1 > 7 And dg2 > 7 And dg3 > 7
Set Rng = .Cells(dg1, 1).CurrentRegion
temp = Rng
Rng.ClearContents
.Range("A" & dg3 + 1).Resize(Rng.Rows.Count, 6) = temp
dg1 = .[a56356].End(xlUp).Row
dg2 = .Cells(dg1, 1).End(xlUp).Row
dg3 = .Cells(dg2, 1).End(xlUp).Row
Loop
End With
Set Rng = Nothing
End Sub
 
Upvote 0
Không hiểu máy tôi có vấn đề không, nhưng tôi thử code của Anh Sealand không thấy chạy anh à, tôi thử thêm một record bất kỳ vào bên dưới cách xa 1 đoạn, test code của Anh nó không có gì thay đổi. Anh kiểm tra lại xem nhé (đã sửa lại A65536)
 
Upvote 0
Bạn nhấn Ctrl+m xem sao, thử lại chép sheet2 về sheet1 (Cái dòng 65536 không quan trọng vì mấy khi dữ liệu đến vạy)
 

File đính kèm

Upvote 0
Bạn nhấn Ctrl+m xem sao, thử lại chép sheet2 về sheet1 (Cái dòng 65536 không quan trọng vì mấy khi dữ liệu đến vạy)

Ý tưởng của Anh thật hay, nhưng mình chạy lần đầu thì ổn, nhưng bắt dầu tạo một dòng cách khoảng dưới cái bảng tính, VD ở Row 65 chẳng hạn, thử lại thì không thấy chạy nữa?!?!
 
Upvote 0
Mình không hiểu ban thử ra sao chứ mình test chỉ trừ dòng 65536 còn đều ổn mà

(Lưu ý: Mình tôn trọng không đụng chạm tới bất cứu ô nào sau cột F và trên dòng 8, tiêu chuẩn xác định rỗng là cột A, vì vậy dòng thêm phải đảm bảo cột A có dữ liệu)
 
Lần chỉnh sửa cuối:
Upvote 0
Mình không hiểu ban thử ra sao chứ mình test chỉ trừ dòng 65536 còn đều ổn mà

(Lưu ý: Mình tôn trọng không đụng chạm tới bất cứu ô nào sau cột F và trên dòng 8, tiêu chuẩn xác định rỗng là cột A, vì vậy dòng thêm phải đảm bảo cột A có dữ liệu)

Cám ơn Anh, chắc Excel 2007 mà tôi xài có vấn đề thôi. Tôi sẽ nghiên cứu code của Anh tỉ mỉ hơn.:-=
 
Upvote 0
Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?

Mình góp thêm 1 cách dùng Sort rất đơn giản :

PHP:
Sub SapXep()
    Range("A7", [E65536].End(xlUp).Offset(0, 1)) _
    .Sort [A7], xlAscending, , , , , , xlYes
End Sub
 

File đính kèm

Upvote 0
Bạn dùng tạm code này vì làm theo ví dụ của bạn nên khi áp dụng bạn phải chỉnh lại vùng nguồn và vùng đích trong code
Anh ơi... hướng đi của anh là chuẩn nhất ---> Có điều tại sao anh không xóa dòng rổng luôn mà lại copy dử liệu sang nơi khác
Ý em là xóa theo kiểu Shift cells up
Như vầy đây:
PHP:
Sub Test()
  Dim i As Long
  With Range([A8], [A60000].End(xlUp)).SpecialCells(4)
    For i = .Areas.Count To 1 Step -1
      .Areas(i).Resize(, 6).Delete 2
    Next
  End With
End Sub
Thuật toán gần giống code của anh đúng không?
 
Upvote 0
Anh ơi... hướng đi của anh là chuẩn nhất ---> Có điều tại sao anh không xóa dòng rổng luôn mà lại copy dử liệu sang nơi khác
Ý em là xóa theo kiểu Shift cells up
Như vầy đây:
PHP:
Sub Test()
  Dim i As Long
  With Range([A8], [A60000].End(xlUp)).SpecialCells(4)
    For i = .Areas.Count To 1 Step -1
      .Areas(i).Resize(, 6).Delete 2
    Next
  End With
End Sub
Thuật toán gần giống code của anh đúng không?

Anh à, tác giả yêu cầu phải dữ nguyên kích thước cái cái bảng màu xanh xanh đó, nếu mà .delete thì bảng đó bị ngắn lại mất rồi.
 
Upvote 0
Mình góp thêm 1 cách dùng Sort rất đơn giản :

PHP:
Sub SapXep()
    Range("A7", [E65536].End(xlUp).Offset(0, 1)) _
    .Sort [A7], xlAscending, , , , , , xlYes
End Sub
Bạn Sort như thế này thì làm đảo lộn vị trí dữ liệu của người ta rồi. Đây là file ví dụ chứ thực tế Mã khách hàng đâu có xếp theo thứ tự từ trước đâu.
 
Upvote 0
Anh à, tác giả yêu cầu phải dữ nguyên kích thước cái cái bảng màu xanh xanh đó, nếu mà .delete thì bảng đó bị ngắn lại mất rồi.
Chưa chắc ý tác giả là vậy!
Việc tô màu đâu có quan trọng gì ---> Tôi nghĩ tác giả muốn "đôn" cái dưới lên trên mà không xóa dòng là vì không muốn ảnh hưởng đến các cột khác mà thôi
 
Upvote 0
Nếu vậy thì đâu cần dùng vòng lặp.
PHP:
Sub GPE()
    Intersect(Range([A8], [A65536].End(xlUp)).SpecialCells(4).EntireRow, [A:F]).Delete 2
End Sub
 
Upvote 0
Thực ra vấn đề này Huu Thang đua ra từ đầu ( nhưng sai ý tác giả ) là chọn các vùng trống rồi del. là xong. Cái mệt là không dùng Del.
 
Upvote 0
Em cám ơn các Thầy đã tận tình chỉ dạy. Cái em cần là dồn hàng lên nhưng không theo quy tắc Sort. Còn việc phải delete hàng là bắt buộc thì câu hỏi của em là sai và gây khó khăn cho các Thầy rồi. Các Code của các Quý Thầy em xin được nhận hết và học hết.
Trân trọng kính chào.
 
Upvote 0
Em cám ơn các Thầy đã tận tình chỉ dạy. Cái em cần là dồn hàng lên nhưng không theo quy tắc Sort. Còn việc phải delete hàng là bắt buộc thì câu hỏi của em là sai và gây khó khăn cho các Thầy rồi. Các Code của các Quý Thầy em xin được nhận hết và học hết.
Trân trọng kính chào.
Không phải là không làm được. Nhưng bạn cần nói rõ lý do. Ví dụ như Delete Cell sẽ phát sinh lỗi #REF. Còn vì sao lại không dùng Sort? Vì Sau khi Sort đã Sort lại theo vị trí cũ (Như bài #8). Không ảnh hưởng gì cả.
Còn đây là Code không Sort, không Delete, không cột phụ.
PHP:
Sub GPE()
Dim R As Long
R = 8
    For Each Cll In Range([A8], [A65536].End(xlUp)).SpecialCells(2)
    Cells(R, 1).Resize(, 6).Value = Cll.Resize(, 6).Value
    R = R + 1
    Next
Range(Cells(R, 1), [F65536]).ClearContents
End Sub
Tuy nhiên, do dùng vòng lặp duyệt qua từng dòng nên xét về tốc độ sẽ không bằng dùng Sort hoặc Delete Cells.
 
Upvote 0
Không phải là không làm được. Nhưng bạn cần nói rõ lý do. Ví dụ như Delete Cell sẽ phát sinh lỗi #REF. Còn vì sao lại không dùng Sort? Vì Sau khi Sort đã Sort lại theo vị trí cũ (Như bài #8). Không ảnh hưởng gì cả.
Còn đây là Code không Sort, không Delete, không cột phụ.
PHP:
Sub GPE()
Dim R As Long
R = 8
    For Each Cll In Range([A8], [A65536].End(xlUp)).SpecialCells(2)
    Cells(R, 1).Resize(, 6).Value = Cll.Resize(, 6).Value
    R = R + 1
    Next
Range(Cells(R, 1), [F65536]).ClearContents
End Sub
Tuy nhiên, do dùng vòng lặp duyệt qua từng dòng nên xét về tốc độ sẽ không bằng dùng Sort hoặc Delete Cells.
Thay vì duyệt qua từng cell, bạn có thể duyệt qua các Areas ---> Đương nhiên tốc độ sẽ nhanh gấp nhiều lần
Ngoài ra, copy ra 1 vùng phụ rồi PasteValue vào vùng gốc cũng là 1 cách (khỏi vòng lập)
 
Upvote 0
Thay vì duyệt qua từng cell, bạn có thể duyệt qua các Areas ---> Đương nhiên tốc độ sẽ nhanh gấp nhiều lần
Ngoài ra, copy ra 1 vùng phụ rồi PasteValue vào vùng gốc cũng là 1 cách (khỏi vòng lập)

Em nghe ndu96081631 nói mà như "Vịt nghe sấm" thiệt tình em chẳng biết ý của Bác nói là gì hết. Bác làm ơn viết luôn ra được không ạ, chứ Bác mà gợi ý mà em làm được mới là lạ đó! (dốt đặt cánh mai mừ)
Xin cám ơn Bác trước!

To HuuThang_bd:
Đúng như ý Bác nói, khi sắp xếp lại mà delete ngoài việc làm cho cấu trúc bị thay đổi, bản thân các khối ô cũng có Name vì vậy sẽ gặp lỗi #REF! mà lỗi này nó "lây" cho toàn bộ các công thức luôn! (cái bảng tôi đưa lên là giả lập thôi, điều này các Anh cũng hiểu mà). Ngoài ra, khi nhập liệu từ Form nếu để hàng trống thì khi nhập nó sẽ chồng lên record cũ, cho nên dùng code của các Thầy các Anh để kéo lên có trật tự. Khi nhập người ta thường chú ý cái gì mới vừa nhập nên thường coi ở phần dưới để xem lại đúng sai mà chỉnh sửa, nếu sắp xếp theo ABC thì khó khăn cho việc tìm kiếm (Còn nếu tôi muốn sắp xếp thì tôi dùng Filter là được rồi mà).

CHÂN THÀNH CẢM ƠN CÁC THẦY, CÁC ANH!
 
Lần chỉnh sửa cuối:
Upvote 0
Em nghe ndu96081631 nói mà như "Vịt nghe sấm" thiệt tình em chẳng biết ý của Bác nói là gì hết. Bác làm ơn viết luôn ra được không ạ, chứ Bác mà gợi ý mà em làm được mới là lạ đó! (dốt đặt cánh mai mừ)
Xin cám ơn Bác trước!
Thì vầy:
PHP:
Sub Test()
  Dim Clls As Range, i As Long, k As Long
  With Range([A8], [A65536].End(xlUp)).SpecialCells(2)
    If .Areas.Count > 1 Then
      For i = 1 To .Areas.Count
        .Cells(1, 1).Offset(k).Resize(.Areas(i).Rows.Count, 6).Value = .Areas(i).Resize(, 6).Value
        k = k + .Areas(i).Rows.Count
      Next i
      Range(.Cells(1, 1).Offset(k), [F65536]).ClearContents
    End If
  End With
End Sub
Với dử liệu của bạn, nếu dùng code của Huuthang, vòng lập phải duyệt qua 35 lần.. trong khi code này chỉ cần 5 vòng là xong ---> Nhanh là nhanh ở chổ đó đó
 

File đính kèm

Upvote 0
Tặng bạn thêm 1 đoạn code nữa mang tính tổng quát hơn ---> Chọn vùng nào thì chơi vùng nấy
PHP:
Sub Test()
  Dim Clls As Range, i As Long, k As Long, Rng As Range
  Set Rng = Application.InputBox("Chon vung du lieu", Type:=8)
  With Rng.Resize(, 1).SpecialCells(2)
    If .Areas.Count > 1 Then
      For i = 1 To .Areas.Count
        With .Areas(i)
          Rng(1, 1).Offset(k).Resize(.Rows.Count, Rng.Columns.Count).Value = .Resize(, Rng.Columns.Count).Value
          k = k + .Rows.Count
        End With
      Next i
      Range(Rng(1, 1).Offset(k, Rng.Columns.Count - 1), Cells(65536, Rng.Column)).ClearContents
    End If
  End With
End Sub
 
Upvote 0
Em nghe ndu96081631 nói mà như "Vịt nghe sấm" thiệt tình em chẳng biết ý của Bác nói là gì hết. Bác làm ơn viết luôn ra được không ạ, chứ Bác mà gợi ý mà em làm được mới là lạ đó! (dốt đặt cánh mai mừ)
Xin cám ơn Bác trước!

To HuuThang_bd:
Đúng như ý Bác nói, khi sắp xếp lại mà delete ngoài việc làm cho cấu trúc bị thay đổi, bản thân các khối ô cũng có Name vì vậy sẽ gặp lỗi #REF! mà lỗi này nó "lây" cho toàn bộ các công thức luôn! (cái bảng tôi đưa lên là giả lập thôi, điều này các Anh cũng hiểu mà). Ngoài ra, khi nhập liệu từ Form nếu để hàng trống thì khi nhập nó sẽ chồng lên record cũ, cho nên dùng code của các Thầy các Anh để kéo lên có trật tự. Khi nhập người ta thường chú ý cái gì mới vừa nhập nên thường coi ở phần dưới để xem lại đúng sai mà chỉnh sửa, nếu sắp xếp theo ABC thì khó khăn cho việc tìm kiếm (Còn nếu tôi muốn sắp xếp thì tôi dùng Filter là được rồi mà).

CHÂN THÀNH CẢM ƠN CÁC THẦY, CÁC ANH!
Có vẻ như bạn không xem và thử hết các đoạn Code có trong Topic này. Tôi đã nhắc đi nhắc lại là sau khi sort đã sort lại theo vị trí ban đầu, không ảnh hưởng gì đến vị trí các record cả
 
Upvote 0
Upvote 0
Chưa chắc đâu! Bạn xem bài này đi:
http://www.giaiphapexcel.com/forum/showpost.php?p=157824&postcount=24
Có sort là sẽ có nguy cơ!

Em đã kiểm tra rồi, rất ngạc nhiên là nếu dùng công thức =sheet!A1 thì khi sắp xếp như thế nào đi chăng nữa, nó cứ đứng trơ ra thôi, không thấy nó chạy gì cả (nếu sort chung với 3 cột A,B,C !!!???
Nếu mà kéo dời từng hàng ra xa xa thì nó chuyển thành giá trị khác chẳng hạn =0 sau khi sort! Kiểm tra lại, nó vẫn giữ nguyên.
Còn nếu chỉ sort cột C thì nó có một hộp thoại "xỉ vã" mình để lựa chọn tiếp tục hay không đấy!
 
Lần chỉnh sửa cuối:
Upvote 0
Là như thế nào, anh test chọn vùng A8:F22 theo file tác giả, sao ra kết quả => Vùng dữ liệu phía dưới mất sạch, ý chú là sao ? anh không hiểu!

Tôi đã kiểm tra cái Code có InputBox rồi, chạy tốt và đâu có bị xóa gì đâu anh?! Sau khi chạy Code, hộp InputBox xuất hiện rồi chọn khối ô cần di chuyển, rồi OK, vậy là nó chạy ngon lành.
 
Upvote 0
Tôi đã kiểm tra cái Code có InputBox rồi, chạy tốt và đâu có bị xóa gì đâu anh?! Sau khi chạy Code, hộp InputBox xuất hiện rồi chọn khối ô cần di chuyển, rồi OK, vậy là nó chạy ngon lành.
---------
Bạn chọn vùng A8:F22 theo file tác giả, sao ra kết quả => Vùng dữ liệu phía dưới mất sạch.

Tôi đã test lại => kết quả vẫn thế.
 
Upvote 0
---------
Bạn chọn vùng A8:F22 theo file tác giả, sao ra kết quả => Vùng dữ liệu phía dưới mất sạch.

Tôi đã test lại => kết quả vẫn thế.
Đúng là code xóa hết vùng dữ liệu bên dưới. Nguyên nhân ở dòng code này

Range(Rng(1, 1).Offset(k, Rng.Columns.Count - 1), Cells(65536, Rng.Column)).ClearContents

Sửa lại như thế này là được:

Range(Rng(1, 1).Offset(k, Rng.Columns.Count - 1), Rng(Rng.Rows.Count, 1)).ClearContents

PHP:
Sub Test()
  Dim Clls As Range, i As Long, k As Long, Rng As Range
  Set Rng = Application.InputBox("Chon vung du lieu", Type:=8)
  With Rng.Resize(, 1).SpecialCells(2)
    If .Areas.Count > 1 Then
      For i = 1 To .Areas.Count
        With .Areas(i)
          Rng(1, 1).Offset(k).Resize(.Rows.Count, Rng.Columns.Count).Value = .Resize(, Rng.Columns.Count).Value
          k = k + .Rows.Count
        End With
      Next i
      Range(Rng(1, 1).Offset(k, Rng.Columns.Count - 1), Rng(Rng.Rows.Count, 1)).ClearContents
    End If
  End With
End Sub

Còn cái vụ Sort, Test trên Excel 2007 không thấy gì bất thường cả.
 
Upvote 0
---------
Bạn chọn vùng A8:F22 theo file tác giả, sao ra kết quả => Vùng dữ liệu phía dưới mất sạch.

Tôi đã test lại => kết quả vẫn thế.
Thường thì với 1 cơ sở dử liệu, ít ai bố trí 2 bảng nằm chung 1 cột lắm anh à ---> Vì như thế sẽ rất khó quản lý
Mục đích em muốn xóa hết những gì bên dưới là có nguyên nhân: Không muốn có "rác bậy bạ" nằm ở dưới bảng tính chính, làm tăng dung lượng không đáng cho file ---> Chỉ thế thôi
Giả định rằng ở dưới bảng tính chính anh còn dử liệu gì đó, sao anh không chuyển nó sang sheet khác, hoặc nhập chung vào bảng tính chính?
(Ở đây là em nói cho trường hợp sheet nhập liệu... và em nghĩ nó phải được bố trí như vậy mới hợp lý)
-------------
Còn cái vụ Sort, Test trên Excel 2007 không thấy gì bất thường cả.
Rất ngạc nhiên vì HUUTHANG mà lại không phát hiện được điều bất thường ---> Tôi cũng đang Test trên Excel 2007, kết quả y chang như khi test trên Excel 2003
 
Lần chỉnh sửa cuối:
Upvote 0
Rất ngạc nhiên vì HUUTHANG mà lại không phát hiện được điều bất thường ---> Tôi cũng đang Test trên Excel 2007, kết quả y chang như khi test trên Excel 2003
Đây là Video ghi lại quá trình text. Và hoàn toàn không thấy có gì bất thường cả. Không biết mọi người đang nói đến điều gì???
 

File đính kèm

Upvote 0
Đây là Video ghi lại quá trình text. Và hoàn toàn không thấy có gì bất thường cả. Không biết mọi người đang nói đến điều gì???
Tôi thấy bạn test đâu có giống với topic ở trên ---> Cứ làm y chang như vầy rồi hẳn tính nhé
- Gõ số 1, 2, 3 lần lượt vào cell A1, A2 và A3
- Gõ công thức =A1 vào cell B1 rồi kéo fill xuống đến B3
- Gõ công thức = Sheet1!A1 vào cell C1 rồi kéo fill xuống đến C3
- Sort giảm dần xem sao?
--------------
Hình như bạn vẫn chưa nắm rõ được quá trình nên hầu hết ai cũng thấy được sự khác biệt mà bạn thì lại không nhận ra!

attachment.php


attachment.php


attachment.php


attachment.php


Excel 2007 tôi test vậy đúng chứ ---> Bạn nhìn xem chổ nào là "hiện tượng bất thường"
??? +-+-+-+ +-+-+-+ +-+-+-+

Không biết mọi người đang nói đến điều gì???
Nói rằng: Nếu đã dùng đến sort ắc sẽ có nguy cơ dử liệu sau khi sort bị đảo lộn mà ta không thể lường trước được
 

File đính kèm

  • untitled1.JPG
    untitled1.JPG
    10.8 KB · Đọc: 57
  • untitled2.JPG
    untitled2.JPG
    12.4 KB · Đọc: 57
  • untitled3.JPG
    untitled3.JPG
    22.8 KB · Đọc: 57
  • untitled4.JPG
    untitled4.JPG
    12.4 KB · Đọc: 57
Lần chỉnh sửa cuối:
Upvote 0
Kính thưa với các Thầy Cô,
Tôi có cơ sở dữ liệu, vì những lý do cần xóa 1 vài dòng nên tạo những dòng trống. Tôi muốn sắp xếp lại bằng cách dồn hàng từ dưới lên trên (không phải sort theo ABC), chỗ nào có khoảng trống thì ở dưới dồn lên thôi.
Vậy cho hỏi có ai có Code này không?

MỘT GIẢI PHÁP:
PHP:
Sub Macro1()
Dim Arr(), ArrKQ(1 To 600, 1 To 6)
Dim i As Byte, j As Byte, s As Byte, dk As Boolean
Arr = [a7].Resize([a65535].End(xlUp).Row - 6, 6).Value
s = 0
For i = 1 To UBound(Arr())
    dk = False
    For j = 1 To 6
        If Arr(i, j) <> "" Then dk = True
    Next
    If dk = True Then
        s = s + 1
        For j = 1 To 6
            ArrKQ(s, j) = Arr(i, j)
        Next
    End If
Next
[a7].Resize([a65535].End(xlUp).Row - 6, 6).ClearContents
[a7].Resize(s, 6) = ArrKQ
End Sub
Cách này nếu có bị đụng hàng với bác nào đã đưa lên topic thì em xin hãy thông cảm - cùng ý tưởng thôi (em chưa đọc hết các bài trong topic này mà --=0)

Mời các bác xem và cho ý kiến để em có thể tiến bộ hơn
 

File đính kèm

Upvote 0
MỘT GIẢI PHÁP:
PHP:
Sub Macro1()
Dim Arr(), ArrKQ(1 To 600, 1 To 6)
Dim i As Byte, j As Byte, s As Byte, dk As Boolean
Arr = [a7].Resize([a65535].End(xlUp).Row - 6, 6).Value
s = 0
For i = 1 To UBound(Arr())
dk = False
For j = 1 To 6
If Arr(i, j) <> "" Then dk = True
Next
If dk = True Then
s = s + 1
For j = 1 To 6
ArrKQ(s, j) = Arr(i, j)
Next
End If
Next
[a7].Resize([a65535].End(xlUp).Row - 6, 6).ClearContents
[a7].Resize(s, 6) = ArrKQ
End Sub
Cách này nếu có bị đụng hàng với bác nào đã đưa lên topic thì em xin hãy thông cảm - cùng ý tưởng thôi (em chưa đọc hết các bài trong topic này mà --=0)

Mời các bác xem và cho ý kiến để em có thể tiến bộ hơn

Thật tình mà nói về mảng trong VBA em chưa biết mô tê gì hết đó anh KHẢI ơi. Cám ơn Anh đã hướng dẫn bài này cho em.

Anh đang giả định ArrKQ(1 To 600, 1 To 6), thế có phải 600 là hàng và 6 là cột hay không? Nếu vượt quá 10.000 dòng code này có bị nặng không? Vậy có thể thay ArrKQ(1 To 10000, 1 To 6) hay không?
 
Upvote 0
1) Anh đang giả định ArrKQ(1 To 600, 1 To 6), thế có phải 600 là hàng và 6 là cột hay không?

2.1) Nếu vượt quá 10.000 dòng code này có bị nặng không?

2.2) Vậy có thể thay ArrKQ(1 To 10000, 1 To 6) hay không?
1) Chính xác: ArrKQ(1 To 600, 1 To 6) ~ mảng 600 dòng x 6 cột

2.1) Vấn đề này phụ thuộc số phần tử của mảng chứa dữ liệu và dữ liệu đó là kiểu gì

2.2) Có thể thay ArrKQ(1 To 10000, 1 To 6) hoặc nhiều dòng hơn, nhiều cột hơn. Khi đó cần khai báo lại biến chạy, trong code này: biến chạy cần khai báo lại là i, s, j As integer (<= 32767) hoặc long (<=2147483467) ...

Đã test với mảng trên 65.000 dòng và dữ liệu đủ 60.000 dòng:Timer(end) - Timer(begin) = 2.1875s trên máy tính có cấu hình như sau

Dxdiag%20System.jpg


Dxdiag%20Display.jpg


------------
Biết tới đâu, nói tới đó, có gì thiếu sót mong các bác góp ý kiến thêm nhé!

 
Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia 1 cách:

Mã:
Sub xep()
 Dim Rg As Range
  Application.ScreenUpdating = False
   Set Rg = Sheet1.Range("A8", Sheet1.[a65536].End(xlUp).Offset(, 7))
     Rg.Columns(7).Formula = "=IF(RC[-6]<>"""",MAX(R7C7:R[-1]C)+1,""A"")"
      Rg.Sort Key1:=Range("G8"), Order1:=xlAscending, Header:=xlNo
    Rg.Columns(7).ClearContents
   Set Rg = Nothing
  Application.ScreenUpdating = True
End Sub

Nhờ Boyxin test giùm với dữ liệu lớn và cùng cấu hình máy với. Cái quan trọng là tìm ra phương pháp tối ưu thôi.
 

File đính kèm

Upvote 0
Mình tham gia 1 cách:

Mã:
Sub xep()
 Dim Rg As Range
  Application.ScreenUpdating = False
   Set Rg = Sheet1.Range("A8", Sheet1.[a65536].End(xlUp).Offset(, 7))
     Rg.Columns(7).Formula = "=IF(RC[-6]<>"""",MAX(R7C7:R[-1]C)+1,""A"")"
      Rg.Sort Key1:=Range("G8"), Order1:=xlAscending, Header:=xlNo
    Rg.Columns(7).ClearContents
   Set Rg = Nothing
  Application.ScreenUpdating = True
End Sub
Nhờ Boyxin test giùm với dữ liệu lớn và cùng cấu hình máy với. Cái quan trọng là tìm ra phương pháp tối ưu thôi.

Khi test với dữ liệu vài chục dòng thì code của sealand chạy rất nhanh, nhưng với dữ liệu lớn

1) code boyxin
Vùng: chứa 5000 dòng có dữ liệu Timer(end) - Timer(begin) = 0.140625 s
Vùng: chứa 10000 dòng có dữ liệu Timer(end) - Timer(begin) = 0.265625 s
Vùng: chứa 20000 dòng có dữ liệu Timer(end) - Timer(begin) = 0.515625 s
Vùng: chứa 40000 dòng có dữ liệu Timer(end) - Timer(begin) = 1 s
Vùng: chứa 60000 dòng có dữ liệu Timer(end) - Timer(begin) = 1.484375 s

2) code sealand
Vùng: chứa 5000 dòng có dữ liệu Timer(end) - Timer(begin) = 5.828125 s
Vùng: chứa 10000 dòng có dữ liệu Timer(end) - Timer(begin) = 64.78125 s
--=0+-+-+-+--=0 Hổng giám đâu--=0+-+-+-+--=0Em hông muốn ri sẹt--=0+-+-+-+--=0
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đúng rồi, chính vì mình nghi ngờ phương thức Sort của Exc và nhờ Boyxin Test.
Nhưng code của Boyxin nên sửa câu lệnh
a7].Resize([a65535].End(xlUp).Row - 6, 6).ClearContents
thành

[a7].Resize([a65535].End(xlUp).Row - 6, 6).SpecialCells(xlCellTypeConstants, 23).ClearContents
Như vậy mới giữ nguyên được cấu trúc

Và thêm đoạn code màu đỏ như code dưới sẽ bớt số lần kiểm tra rất nhiều
For j = 1 To 6
If Arr(i, j) <> "" Then dk = True : Exit for
Next


 
Upvote 0
Nhưng code của Boyxin nên sửa câu lệnh
a7].Resize([a65535].End(xlUp).Row - 6, 6).ClearContents
thành

[a7].Resize([a65535].End(xlUp).Row - 6, 6).SpecialCells(xlCellTypeConstants, 23).ClearContents
Như vậy mới giữ nguyên được cấu trúc
ClearContents đâu có làm mất: Cấu trúc, định dạng ... (Bỏ định dạng cột A cũng rút ngắn thời gian chút ít).

Cảm ơn sealand đã góp ý
Và thêm đoạn code màu đỏ như code dưới sẽ bớt số lần kiểm tra rất nhiều
For j = 1 To 6
If Arr(i, j) <> "" Then dk = True : Exit for
Next
 
Upvote 0
Boyxin không tính đến nếu vùng nào đó có công thức thì sao (Dũ liệu nhiều thì sao kiểm tra nổi), tốt nhất ta cứ sử lý chắc ăn thì hơn.
 
Upvote 0
Đúng rồi, chính vì mình nghi ngờ phương thức Sort của Exc và nhờ Boyxin Test.
Code chậm không vì nguyên nhân sort của excel mà chính tại chỗ gán công thức vào cells và thực hiện lệnh trong công thức

Boyxin không tính đến nếu vùng nào đó có công thức thì sao (Dũ liệu nhiều thì sao kiểm tra nổi), tốt nhất ta cứ sử lý chắc ăn thì hơn.

Nếu do công thức mà tạo ra dong trông như vậy thì mình nghĩ sẽ vô cùng khó (không muốn nói là không thể) dồn theo kiểu này, đặc biệt trong công thức lại tham chiếu bằng địa chỉ tương đối (không có đô la ^$^ --=0 )
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom