giúp mình giữ các giá trị cho sẵn. (1 người xem)

Liên hệ QC

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

thanhthao22112008

Thành viên mới
Tham gia
9/3/12
Bài viết
19
Được thích
3
Mình có 1 file excel gồm 2 sheet, sheet "dam" và sheet "cot".
Trong mỗi sheet này đều có cấu trúc giống nhau. (ở cột B có COMB1, COMB2, COMB3.....COMBn) ở đây mình chỉ đến COMB5 (về sau có thể thay đổi tùy vào công trình) Nhưng COMBBAO MAX và COMBBAO MIN luôn có tên cố định.
Bây giờ mình muốn ở sheet "dam" thì giữ lại những dòng có COMBBAO MAX và COMBBAO MIN
Và sheet cột thì lại xóa những dòng có COMBBAO MAX và COMBBAO MIN.
Mong các ACE trên diễn đàn giúp em.
Mong sớm hồi âm.
Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Mình có 1 file excel gồm 2 sheet, sheet "dam" và sheet "cot".
Trong mỗi sheet này đều có cấu trúc giống nhau. (ở cột B có COMB1, COMB2, COMB3.....COMBn) ở đây mình chỉ đến COMB5 (về sau có thể thay đổi tùy vào công trình) Nhưng COMBBAO MAX và COMBBAO MIN luôn có tên cố định.
Bây giờ mình muốn ở sheet "dam" thì giữ lại những dòng có COMBBAO MAX và COMBBAO MIN
Và sheet cột thì lại xóa những dòng có COMBBAO MAX và COMBBAO MIN.
Mong các ACE trên diễn đàn giúp em.
Mong sớm hồi âm.
Thân!
Nghĩa là Sheet "Dam" chỉ để lại những dòng có COMBBA0 MIN hoặc COMBBA0 MAX, còn sheet "Cot" thì xóa những dòng có COMBBA0 MIN hoặc COMBBA0 MAX phải không?
 
Upvote 0
Nghĩa là Sheet "Dam" chỉ để lại những dòng có COMBBA0 MIN và COMBBA0 MAX (chứ không phải là hoặc), còn sheet "Cot" thì xóa những dòng có COMBBA0 MIN Và COMBBA0 MAX (chứ không phải hoặc).
Nghĩa là sheet "dam" thì xóa hết tất cả các dòng khác (chỉ giữ lại các dòng có COMBBA0 MIN và COMBBA0 MAX)
Sheet "cot" xóa hết các dòng có COMBBA0 MIN và COMBBA0 MAX (chỉ giứ lại COMB1, COMB2, .......COMBn
Mong sớm hồi âm
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa là Sheet "Dam" chỉ để lại những dòng có COMBBA0 MIN và COMBBA0 MAX (chứ không phải là hoặc), còn sheet "Cot" thì xóa những dòng có COMBBA0 MIN Và COMBBA0 MAX (chứ không phải hoặc).
Nghĩa là sheet "dam" thì xóa hết tất cả các dòng khác (chỉ giữ lại các dòng có COMBBA0 MIN và COMBBA0 MAX)
Sheet "cot" xóa hết các dòng có COMBBA0 MIN và COMBBA0 MAX (chỉ giứ lại COMB1, COMB2, .......COMBn
Mong sớm hồi âm
Bạn chạy thử code củ chuối như sau:

Mã:
Sub XoaDL()
Dim r1 As Range, r2 As Range
If ActiveSheet.Name = "Dam" Then
        Range("a1").AutoFilter Field:=3, Criteria1:="<>*COMBBA0 M*"
    Else
        Range("a1").AutoFilter Field:=3, Criteria1:="=*COMBBA0 M*"
End If

Set r1 = ActiveSheet.AutoFilter.Range
Set r1 = r1.Offset(1, 0).Resize(r1.Rows.Count - 1, 1)
On Error Resume Next
 Set r2 = r1.SpecialCells(xlVisible)
On Error GoTo 0
If r2 Is Nothing Then
    ActiveSheet.ShowAllData
    MsgBox "Khong con gi de xoa"
    Exit Sub
End If
r2.EntireRow.Delete
ActiveSheet.ShowAllData

End Sub
 
Upvote 0
Bạn chạy thử code củ chuối như sau:

Mã:
Sub XoaDL()
Dim r1 As Range, r2 As Range
If ActiveSheet.Name = "Dam" Then
        Range("a1").AutoFilter Field:=3, Criteria1:="<>*COMBBA0 M*"
    Else
        Range("a1").AutoFilter Field:=3, Criteria1:="=*COMBBA0 M*"
End If

Set r1 = ActiveSheet.AutoFilter.Range
Set r1 = r1.Offset(1, 0).Resize(r1.Rows.Count - 1, 1)
On Error Resume Next
 Set r2 = r1.SpecialCells(xlVisible)
On Error GoTo 0
If r2 Is Nothing Then
    ActiveSheet.ShowAllData
    MsgBox "Khong con gi de xoa"
    Exit Sub
End If
r2.EntireRow.Delete
ActiveSheet.ShowAllData

End Sub

Cám ơn domfootwearhttp://www.giaiphapexcel.com/forum/member.php?42738-domfootwear!
Mình down về dùng thì thấy ở sheet cột là đúng ý của mình.
Còn sheet dầm thì không domfootwear ạh.
(đề bài của mình là Sheet "cot" xóa hết các dòng có COMBBA0 MIN và COMBBA0 MAX (chỉ giứ lại COMB1, COMB2, .......COMBn (đã là được))
Còn sheet "dam" vẫn thế (tức là không chaỵ.) Nghĩa là sheet "dam" thì xóa hết tất cả các dòng khác (chỉ giữ lại các dòng có COMBBA0 MIN và COMBBA0 MAX)
 
Upvote 0
Mình có 1 file excel gồm 2 sheet, sheet "dam" và sheet "cot".
Trong mỗi sheet này đều có cấu trúc giống nhau. (ở cột B có COMB1, COMB2, COMB3.....COMBn) ở đây mình chỉ đến COMB5 (về sau có thể thay đổi tùy vào công trình) Nhưng COMBBAO MAX và COMBBAO MIN luôn có tên cố định.
Bây giờ mình muốn ở sheet "dam" thì giữ lại những dòng có COMBBAO MAX và COMBBAO MIN
Và sheet cột thì lại xóa những dòng có COMBBAO MAX và COMBBAO MIN.
Mong các ACE trên diễn đàn giúp em.
Mong sớm hồi âm.
Thân!

Bạn xem thử file này - Cách làm giống như của domfootwear.
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub
 

File đính kèm

Upvote 0
Bạn xem thử file này - Cách làm giống như của domfootwear.
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub
Cám ơn Trung Chinhs rất nhiều.
Đúng ý của mình rồi.
Chúc bạn luôn có nhiều lời giải hay cho mọi nguời trên diễn đàn.
cho mình hỏi cấu trúc "Range("c1:c" & [a65000].End(3).Row)" và ".AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"",.Offset(1).SpecialCells(12).EntireRow.Delete có nghĩa là gì vậy.
Bạn giải thich dùm mình.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Trung Chinhs rất nhiều.
Đúng ý của mình rồi.
Chúc bạn luôn có nhiều lời giải hay cho mọi nguời trên diễn đàn.
cho mình hỏi cấu trúc "Range("c1:c" & [a65000].End(3).Row)" và ".AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"",.Offset(1).SpecialCells(12).EntireRow.Delete có nghĩa là gì vậy.
Bạn giải thich dùm mình.

Nghĩa của câu lệnh nôm na như sau:
"Range("c1:c" & [a65000].End(3).Row)" là vùng từ C1 đến C và dòng cuối cột A (vd: dữ liệu cuối cùng của cột A là dòng 500 thì vùng chọn là C1:C500).

.AutoFilter 1
Tức là .Autofilter cột C (vì chỉ chọn 1 cột C để Filter nên chỉ số cột là 1, nếu quét chọn từ cột A -> cột C thì chỉ số cột C là 3).

"<>COMBBA0 MAX", 1, "<>COMBBA0 MIN""
Câu này là lọc với 2 điều kiện. Số 1 có nghĩa là And (số 2 có nghĩa là OR)

.Offset(1)
là dịch vùng chọn xuống 1 dòng - mục đích là chừa lại dòng đầu bảng.

.SpecialCells(12).EntireRow.Delete
là chọn những dòng nhìn thấy để xóa (rút dòng).

Việc dùng chỉ số trong code chỉ là thói quen cá nhân (vì lười gõ chữ mà thôi).
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa của câu lệnh nôm na như sau:
"Range("c1:c" & [a65000].End(3).Row)" là vùng từ C1 đến C và dòng cuối cột A (vd: dữ liệu cuối cùng của cột A là dòng 500 thì vùng chọn là C1:C500).

.AutoFilter 1
Tức là .Autofilter cột C (vì chỉ chọn 1 cột C để Filter nên chỉ số cột là 1, nếu quét chọn từ cột A -> cột C thì chỉ số cột C là 3).

"<>COMBBA0 MAX", 1, "<>COMBBA0 MIN""
Câu này là lọc với 2 điều kiện. Số 1 có nghĩa là And (số 2 có nghĩa là OR)

.Offset(1)
là dịch vùng chọn xuống 1 dòng - mục đích là chừa lại dòng đầu bảng.

.SpecialCells(12).EntireRow.Delete
là chọn những dòng nhìn thấy để xóa (rút dòng).

Việc dùng chỉ số trong code chỉ là thói quen cá nhân (vì lười gõ chữ mà thôi).

Bây giờ dữ liệu của tớ lớn hơn 80000 dòng thì làm thế nào.
Thực ra trong bảng tớ gởi lên là đã rút bớt đi rất nhiều.
Còn để thực chất thì lớn hơn 80000 dòng.
có phần còn lên đến 130000 dòng lận.
Nế cứ chỉnh sửa code đấy thì ko hay lắm.
làm thế nào để nó tự động được hả bạn?
Và bạn giải thích hộ mình End(3) có nghĩa là gì?
Thanks
Nếu bạn không dùng số thì đánh chữ như thế nào?
Bạn vó thể ví dụ cho mình được không?
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ dữ liệu của tớ lớn hơn 80000 dòng thì làm thế nào.
Thực ra trong bảng tớ gởi lên là đã rút bớt đi rất nhiều.
Còn để thực chất thì lớn hơn 80000 dòng.
có phần còn lên đến 130000 dòng lận.
Nế cứ chỉnh sửa code đấy thì ko hay lắm.
làm thế nào để nó tự động được hả bạn?
Và bạn giải thích hộ mình End(3) có nghĩa là gì?
Thanks
Nếu bạn không dùng số thì đánh chữ như thế nào?
Bạn vó thể ví dụ cho mình được không?

End(3) là viết tắt của End(xlUp)

Tôi dùng Office 2003 nên bảng tính chỉ có 65536 dòng nếu bạn dùng Office khác bảng tinh có nhiều dòng hơn (vd 130000 dòng thì bạn sửa [a65000] thành [a130000]). Tuy nhiên số dòng lớn như vậy thì không biết có sử dụng Autofilter được không. Bây giờ tôi phải đi làm, tối về nghiên cứu tiếp (chắc chắn là được).
 
Upvote 0
Bây giờ dữ liệu của tớ lớn hơn 80000 dòng thì làm thế nào.
Thực ra trong bảng tớ gởi lên là đã rút bớt đi rất nhiều.
Còn để thực chất thì lớn hơn 80000 dòng.
có phần còn lên đến 130000 dòng lận.
Nế cứ chỉnh sửa code đấy thì ko hay lắm.
làm thế nào để nó tự động được hả bạn?
Và bạn giải thích hộ mình End(3) có nghĩa là gì?
Thanks
Nếu bạn không dùng số thì đánh chữ như thế nào?
Bạn vó thể ví dụ cho mình được không?
Nếu dữ liệu hơn 80000 dòng thì tốt nhất dùng mãng mới cải thiện tốc độ, AutoFilter e rằng sẽ rất nặng. Bạn thử code này xem sao nhé
Mã:
Sub DelCOMBBAOrows()
Dim ArrDam, ArrCot, ArrkqD, ArrkqC
Dim i&, j&, s&, k&
ArrDam = Sheet1.Range("A2:J100000").Value
ArrCot = Sheet2.Range("A2:J100000").Value
ReDim ArrkqD(1 To UBound(ArrDam), 1 To UBound(ArrDam, 2))
ReDim ArrkqC(1 To UBound(ArrCot), 1 To UBound(ArrCot, 2))
For i = 1 To UBound(ArrDam)
  If Right(ArrDam(i, 3), 3) = "MIN" Or Right(ArrDam(i, 3), 3) = "MAX" Then
    s = s + 1
    For j = 1 To UBound(ArrDam, 2)
      ArrkqD(s, j) = ArrDam(i, j)
    Next
  End If
  If Right(ArrCot(i, 3), 3) <> "MIN" And Right(ArrCot(i, 3), 3) <> "MAX" Then
    k = k + 1
    For j = 1 To UBound(ArrCot, 2)
      ArrkqC(k, j) = ArrCot(i, j)
    Next
  End If
Next
  Sheet1.Range("A2:J2").Resize(UBound(ArrkqD)).Value = ArrkqD
  Sheet2.Range("A2:J2").Resize(UBound(ArrkqC)).Value = ArrkqC
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mặc dù Advanced Filter không nhanh bằng mảng nhưng với 10000 dòng dữ liệu thì công cụ này thừa sức
Xem video hướng dẫn

[video=youtube_share;LuEz-fwU01c]http://youtu.be/LuEz-fwU01c[/video]

Riêng Sheet Cot cũng làm tương tự, chỉ khác điều kiện tại M2 ta gõ công thức =COUNTIF(C2,"*MAX")+COUNTIF(C2,"*MIN")=0 và cell M1 bỏ trống
 
Upvote 0
Mặc dù Advanced Filter không nhanh bằng mảng nhưng với 10000 dòng dữ liệu thì công cụ này thừa sức
Xem video hướng dẫn

[video=youtube_share;LuEz-fwU01c]http://youtu.be/LuEz-fwU01c[/video]

Riêng Sheet Cot cũng làm tương tự, chỉ khác điều kiện tại M2 ta gõ công thức =COUNTIF(C2,"*MAX")+COUNTIF(C2,"*MIN")=0 và cell M1 bỏ trống
Em nhầm ấy chứ dữ liệu của họ đã là 80000 dòng rồi, không biết 100.000 dòng thì sao ?
 
Upvote 0
cám ơn Viehoai nhiều.
đúng ý em cần.
Chúc anh luôn thành đạt và giúp được nhiều người trên diễn đàn.
 
Upvote 0
Mặc dù Advanced Filter không nhanh bằng mảng nhưng với 10000 dòng dữ liệu thì công cụ này thừa sức
Xem video hướng dẫn

[video=youtube_share;LuEz-fwU01c]http://youtu.be/LuEz-fwU01c[/video]

Riêng Sheet Cot cũng làm tương tự, chỉ khác điều kiện tại M2 ta gõ công thức =COUNTIF(C2,"*MAX")+COUNTIF(C2,"*MIN")=0 và cell M1 bỏ trống
Em cám ơn Ndu.
đây là dạng toán mà em nghĩ mãi mà không biết làm thế nào.
Nhờ có diễn đàn được gặp các anh và được các anh giúp đỡ.
chúc anh luôn thành đạt, hạnh phúc và luôn giúp được nhiều người trên diễ đàn.
 
Upvote 0
Nếu bạn dùng Office 2007 trở lên thì thử lại Code này xem sao (máy của tôi dùng Office 2003 nên không thử được)
Mã:
Sub XoaDong_2()
    Application.ScreenUpdating = False
    On Error Resume Next
    With Sheets("dam").Range("c1:c" & [a1000000].End(3).Row)
        .Replace "COMBBA0", "xx", 2
        .Replace "COMB*", "", 2
        .Replace "xx", "COMBBA0", 2
        .SpecialCells(4).EntireRow.Delete
    End With
    With Sheets("cot").Range("c1:c" & [a1000000].End(3).Row)
        .Replace "COMBBA0*", "", 2
        .SpecialCells(4).EntireRow.Delete
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn dùng Office 2007 trở lên thì thử lại Code này xem sao (máy của tôi dùng Office 2003 nên không thử được)
Mã:
Sub XoaDong_2()
    Application.ScreenUpdating = False
    On Error Resume Next
    With Sheets("dam").Range("c1:c" & [a1000000].End(3).Row)
        .Replace "COMBBA0", "xx", 2
        .Replace "COMB*", "", 2
        .Replace "xx", "COMBBA0", 2
        .SpecialCells(4).EntireRow.Delete
    End With
    With Sheets("cot").Range("c1:c" & [a1000000].End(3).Row)
        .Replace "COMBBA0*", "", 2
        .SpecialCells(4).EntireRow.Delete
    End With
End Sub
Chưa cần chạy em cũng biết chắc chắn 100% rằng với dữ liệu 80000 dòng thì SpecialCells sẽ "vở" hoàn toàn
SpecialCells có nhược điểm đấy anh à ---> Số lượng Areas càng nhiều, càng dẫn đến lỗi
 
Upvote 0
Chưa cần chạy em cũng biết chắc chắn 100% rằng với dữ liệu 80000 dòng thì SpecialCells sẽ "vở" hoàn toàn
SpecialCells có nhược điểm đấy anh à ---> Số lượng Areas càng nhiều, càng dẫn đến lỗi

Thực ra đoạn code của trungchinhs em đã load về chạy nhưng kết quả vẫn thế.
Sheet của cột thì chạy đúng ý của em.
Còn sheet dầm thì không chạy tý nào (không xóa các dòng khác với COMBBAO MAX và COMBBAO MIN).
 
Upvote 0
Thực ra đoạn code của trungchinhs em đã load về chạy nhưng kết quả vẫn thế.
Sheet của cột thì chạy đúng ý của em.
Còn sheet dầm thì không chạy tý nào (không xóa các dòng khác với COMBBAO MAX và COMBBAO MIN).

Bạn muốn biết có lỗi gì xuất hiện hay không, hãy xóa dòng On Error Resume Next rồi test lại sẽ biết liền
 
Upvote 0
Bạn muốn biết có lỗi gì xuất hiện hay không, hãy xóa dòng On Error Resume Next rồi test lại sẽ biết liền

em cám ơn anh NDU
đúng như lời anh nói.
Anh cho em hỏi là tại sao khi xóa On Error Resume Next thì tại sao lại hết vậy.
On Error Resume Next nó có nghĩa là gì vậy anh NDU?
 
Lần chỉnh sửa cuối:
Upvote 0
em cám ơn anh NDU
đúng như lời anh nói.
Anh cho em hỏi là tại sao khi xóa On Error Resume Next thì tại sao lại hết vậy.
On Error Resume Next nó có nghĩa là gì vậy anh NDU?
Dòng này có tác dụng khi gặp lỗi thì "vượt qua" luôn
Trong code có dùng SpecialCells, cái này chắc chắn gặp lỗi với dữ liệu lớn, và nó đã "vượt qua" lỗi nhờ dòng On Error Resume Next ở trên ---> Dẫn đến chẳng trích lọc được thứ gì cả
 
Upvote 0
em có dạng này mong anh giúp cho:

Tại ô L2 của em có công thức =IF(LEFT(B2,1)="b","Dam",IF(LEFT(B2,1)="C","Cot",""))
bây giờ em muốn là tự động filer theo cột B hay cột A đều được
Ví dụ cột A (hay cột B có 80000 dòng thì tự động filer đến dòng thứ 80000)
Nêú cột A hay B có 90000 thì tự động filer đến dòng thứ 90000).
Em chân thành cám ơn
 

File đính kèm

Upvote 0
Dòng này có tác dụng khi gặp lỗi thì "vượt qua" luôn
Trong code có dùng SpecialCells, cái này chắc chắn gặp lỗi với dữ liệu lớn, và nó đã "vượt qua" lỗi nhờ dòng On Error Resume Next ở trên ---> Dẫn đến chẳng trích lọc được thứ gì cả
Xem qua thì dòng lệnh này rất dễ hiểu, nhưng sử dụng nó rất khó Sư Phụ nhỉ
- Gặp dòng lệnh lỗi bỏ qua và thực hiện lệnh tiếp theo, không khéo thì chăng đâu đến đâu
- Gặp dòng lệnh lỗi sẽ nhảy đến dòng lệnh nào đó (bỏ qua đoạn lệnh)
- Gặp dòng lệnh lỗi thoát thủ tục (Hàm)
Cái này chắc chỉ phụ thuộc vào kinh nghiệm là chủ yếu
 
Upvote 0
Xem qua thì dòng lệnh này rất dễ hiểu, nhưng sử dụng nó rất khó Sư Phụ nhỉ
- Gặp dòng lệnh lỗi bỏ qua và thực hiện lệnh tiếp theo, không khéo thì chăng đâu đến đâu
- Gặp dòng lệnh lỗi sẽ nhảy đến dòng lệnh nào đó (bỏ qua đoạn lệnh)
- Gặp dòng lệnh lỗi thoát thủ tục (Hàm)
Cái này chắc chỉ phụ thuộc vào kinh nghiệm là chủ yếu
Thì cứ suy đoán từ từ thôi
- SpecialCells bị lỗi
- Dẫn đến .SpecialCells(4).EntireRow.Delete cũng lỗi luôn (hay tất cả các lệnh sau SpecialCells đều không thực hiện được)
- Cuối cùng là: Không thực thi được cái gì
--------------
Kinh nghiệm: Đừng bao giờ cho On Error Resume Next vào code khi đang Test ---> Đến khi bạn chắc chắn không còn lỗi nào nữa (hoặc đã biết chắc lỗi ấy là gì) thì hãy cho vào
 
Upvote 0
Đang khoái cái vụ Arr(), gặp nó là làm bài tập cho quen tay luôn.
Mỗi sheet một nút bấm nhìn nó chạy cho "đã".
Các sheet phụ là để lưu dữ liệu gốc, copy tới lui để thử thôi.
Nếu ex sau 2003 thì chỉnh số dòng trong code thêm cho đủ xài.
Hổng biết với ex sau hơn 2003 nó có chạy được không.
Nhờ các bạn "nhắc nhỡ" thêm.
 

File đính kèm

Upvote 0
Nếu ex sau 2003 thì chỉnh số dòng trong code thêm cho đủ xài.
Hổng biết với ex sau hơn 2003 nó có chạy được không.
Nhờ các bạn "nhắc nhỡ" thêm.
Sửa .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) là được rồi ---> Excel nào cũng chơi được
 
Upvote 0
Sửa .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) là được rồi ---> Excel nào cũng chơi được

NDU ơi.
Em sửa như anh nói thì kết quả không như ý mong muốn anh àh.
Em chân thành cám ơn các anh vì đã quan tâm đến chủ đề của em.
Em Hy vọng với chủ đề này sẽ có nhiều sáng kiến hơn các anh ah.
Chúc các anh một ngày may mắn.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nếu kết quả sai là do câu lệnh khác còn việc sửa câu lệnh .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) thì đúng là tuyệt chiêu, miễn bàn nha.

đúng là em đã làm sai.
Hướng dẫn một đằng làm một nẻo.
Em cám ơn các anh.
Các anh ơi hướng dẫn em bài 23 (#23) mới.
Mong sớm hồi âm của các anh.
 
Upvote 0
Lấy code tại #7 để làm ví dụ:
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam")[COLOR=#ff0000][B].Range("c1:c" & [a65000].End(3).Row)[/B][/COLOR]
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub

Nếu lọc cột A thì Bạn sửa đoạn màu đỏ thành .Range([a1], .Cells(.Cells.Rows.Count, 1).End(xlUp))
Nếu lọc cột B thì Bạn sửa thành .Range([b1], .Cells(.Cells.Rows.Count, 2).End(xlUp))

Chú ý: Số 1 là cột A; số 2 là cột B; số 3 là cột C ...số 10 là cột J ...
 
Upvote 0
bài viết thật hay.
đây cũng là vấn đề mình quan tâm với dữ liệu kiểu mảng
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy code tại #7 để làm ví dụ:
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam")[COLOR=#ff0000][B].Range("c1:c" & [a65000].End(3).Row)[/B][/COLOR]
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub

Nếu lọc cột A thì Bạn sửa đoạn màu đỏ thành .Range([a1], .Cells(.Cells.Rows.Count, 1).End(xlUp))
Nếu lọc cột B thì Bạn sửa thành .Range([b1], .Cells(.Cells.Rows.Count, 2).End(xlUp))

Chú ý: Số 1 là cột A; số 2 là cột B; số 3 là cột C ...số 10 là cột J ...

anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
 

File đính kèm

Upvote 0
ý tôi là chỉ mượn dòng code màu đỏ để làm ví dụ còn bạn phải sửa lại code của bạn chứ tôi có biết code của bạn như thế nào đâu ?.
Câu lệnh để xác định dòng cuối cùng có dữ liệu là Cells(Cells.Rows.Count, ...).End(3).Row . Muốn lấy cột nào để xác định dòng cuối thì bạn thay số thứ tự của cột đó vào chỗ 3 chấm.
Ví dụ: Câu lệnh để Autofilter từ L2 đến dòng L cuối - xác định theo dữ liệu của cột A như sau:
Mã:
Range("l2:l" & Cells(Cells.Rows.Count, 1).End(3).Row).Autofilter
 
Lần chỉnh sửa cuối:
Upvote 0
ý tôi là chỉ mượn dòng code màu đỏ để làm ví dụ còn bạn phải sửa lại code của bạn chứ tôi có biết code của bạn như thế nào đâu ?.
Câu lệnh để xác định dòng cuối cùng có dữ liệu là Cells(Cells.Rows.Count, ...).End(3).Row . Muốn lấy cột nào để xác định dòng cuối thì bạn thay số thứ tự của cột đó vào chỗ 3 chấm.
Ví dụ: Câu lệnh để Autofilter từ L2 đến dòng L cuối - xác định theo dữ liệu của cột A như sau:
Mã:
Range("l2:l" & Cells(Cells.Rows.Count, 1).End(3).Row).Autofilter

Em cám ơn anh.
Chắc là với hướng dẫn của anh thì em sẽ làm được.
 
Upvote 0
anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
Tức là sau khi lọc xong, ta sẽ viết ghi chú (Dam, Cot) vào cột L, đúng không?
Cái này quá dễ, để Ba Tê làm cho bạn... Viết bằng code đưa ghi chú trực tiếp vào bảng tính luôn, chẳng cần phải công thức, rồi kéo fill gì đó đâu
Ẹc... Ẹc...
 
Upvote 0
Tức là sau khi lọc xong, ta sẽ viết ghi chú (Dam, Cot) vào cột L, đúng không?
Cái này quá dễ, để Ba Tê làm cho bạn... Viết bằng code đưa ghi chú trực tiếp vào bảng tính luôn, chẳng cần phải công thức, rồi kéo fill gì đó đâu
Ẹc... Ẹc...

vâng!
em cám ơn anh.
Anh có thể nhờ anh Ba Tê giúp em được không ah.
Em cám ơn nhiều
 
Upvote 0
vâng!
em cám ơn anh.
Anh có thể nhờ anh Ba Tê giúp em được không ah.
Em cám ơn nhiều
Tôi đề xuất thế này: Lọc dữ liệu sang 2 sheet khác, giữ nguyên sheet dữ liệu, đừng sửa đổi gì cả (lỡ có sai sót gì sẽ không mất dữ liệu)
Vậy thì ta sẽ tiến hành làm như sau:
- Đổi tên sheet chứ dữ liệu thành Data
- Tạo thêm 2 sheet tên Temp1 và Temp2
- Chạy code dưới đây:
PHP:
Sub Main()
  Dim sArray, Arr1(), Arr2()
  Dim lR As Long, lC As Byte, k1 As Long, k2 As Long
  Dim tmp1 As String, tmp2 As String
  On Error Resume Next
  With Sheets("Data")
    sArray = .Range(.[A1], .Cells(.Cells.Rows.Count, 1).End(xlUp)).Resize(, 12).Value
    ReDim Arr1(1 To UBound(sArray, 1), 1 To 12)
    ReDim Arr2(1 To UBound(sArray, 1), 1 To 12)
    k1 = 1: k2 = 1
    For lR = 2 To UBound(sArray, 1)
      If Right(sArray(lR, 3), 3) = "MAX" Or Right(sArray(lR, 3), 3) = "MIN" Then
        k1 = k1 + 1
        For lC = 1 To 10
          If k1 = 2 Then Arr1(1, lC) = sArray(1, lC)
          Arr1(k1, lC) = sArray(lR, lC)
        Next
        tmp1 = Left(Arr1(k1, 2), 1)
        Arr1(k1, 12) = IIf(tmp1 = "B", "Dam", IIf(tmp1 = "C", "Cot", ""))
      Else
        k2 = k2 + 1
        For lC = 1 To 10
          If k2 = 2 Then Arr2(1, lC) = sArray(1, lC)
          Arr2(k2, lC) = sArray(lR, lC)
        Next
        tmp2 = Left(Arr2(k2, 2), 1)
        Arr2(k2, 12) = IIf(tmp2 = "B", "Dam", IIf(tmp2 = "C", "Cot", ""))
      End If
    Next
  End With
  With Sheets("Temp1")
    .Range("A:L").ClearContents
    If k1 Then .Range("A1").Resize(k1, 12).Value = Arr1
  End With
  With Sheets("Temp2")
    .Range("A:L").ClearContents
    If k2 Then .Range("A1").Resize(k2, 12).Value = Arr2
  End With
End Sub
Sau khi chạy code, dữ liệu sẽ được lọc sang sheet Temp1 và Temp2
Xem file
 

File đính kèm

Upvote 0
anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
Không xóa gì cả nghĩa là không cần lọc bỏ Max, Min hay chừa lại Max, Min gì cả phải không?
Chỉ là ghi chú thêm cho cột L là "Dam" hay "Cot" là đủ yêu cầu phải không?
Nếu đúng như vậy thì bấm chuột vào cái ô màu vàng trên cột L thử xem.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
Dùng chữ filer này khó hiểu thật.
 

File đính kèm

Upvote 0
Không xóa gì cả nghĩa là không cần lọc bỏ Max, Min hay chừa lại Max, Min gì cả phải không?
Chỉ là ghi chú thêm cho cột L là "Dam" hay "Cot" là đủ yêu cầu phải không?
Nếu đúng như vậy thì bấm chuột vào cái ô màu vàng trên cột L thử xem.

Dùng chữ filer này khó hiểu thật.

Cả hai đoạn code cua anh NDU và anh Ba Tê đều đúng ý của em.
Em cám ơn các anh.
em gõ nhầm: chữ fill mới đúng
anh có thể giải thích cho em câu lện này được không ah.

ReDim Arr(1 To UBound(Rngs, 1), 1 To 1)
For i = 1 To UBound(Rngs, 1)
If Left(Rngs(i, 2), 1) = "B" Then
Arr(i, 1) = "Dam"

Em cám ơn anh
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom