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.

Liên hệ QC

Ếch Xanh

Thành viên tích cực
Tham gia
12/8/09
Bài viết
865
Được thích
1,572
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

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
Web KT

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

Back
Top Bottom